爬虫代码实现三:打通爬虫项目的下载、解析、存储流程

1.新建一个存储接口IStoreService

package com.dajiangtai.djt_spider.service;

import com.dajiangtai.djt_spider.entity.Page;

/**
* 数据存储接口
* @author Administrator
*
*/
public interface IStoreService {
public void store(Page page);
}

2.新建一个存储接口实现类ConsoleStoreService(在控制台打印存储数据)

package com.dajiangtai.djt_spider.service.impl;

import com.dajiangtai.djt_spider.entity.Page;
import com.dajiangtai.djt_spider.service.IStoreService;

public class ConsoleStoreService implements IStoreService {

public void store(Page page) {
System.out.println("总播放数:"+page.getAllnumber());
System.out.println("评论数:"+page.getCommentnumber());
System.out.println("赞:"+page.getSupportnumber());
}

}

3.重构StartDSJCount:

1.添加storeService属性,并且设置get/set方法

2.dsj.setStoreService(new ConsoleStoreService());对接口进行实例化

3.添加存储页面信息方法public void storePageInfo(Page page)

4.测试storePageInfo(Page page)方法是否有效。

package com.dajiangtai.djt_spider.start;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import com.dajiangtai.djt_spider.entity.Page;
import com.dajiangtai.djt_spider.service.IDownLoadService;
import com.dajiangtai.djt_spider.service.IProcessService;
import com.dajiangtai.djt_spider.service.IStoreService;
import com.dajiangtai.djt_spider.service.impl.ConsoleStoreService;
import com.dajiangtai.djt_spider.service.impl.HttpClientDownLoadService;
import com.dajiangtai.djt_spider.service.impl.YOUKUProcessService;

/**
* 电视剧爬虫入口类
* @author Administrator
*
*/
public class StartDSJCount {

//页面下载接口
private IDownLoadService downLoadService;
//页面解析接口
private IProcessService processService;
//数据存储接口
private IStoreService storeService;

public static void main(String[] args) {
StartDSJCount dsj = new StartDSJCount();
dsj.setDownLoadService(new HttpClientDownLoadService());
dsj.setProcessService(new YOUKUProcessService());
dsj.setStoreService(new ConsoleStoreService());
String url = "http://list.youku.com/show/id_z9cd2277647d311e5b692.html?spm=a2h0j.8191423.sMain.5~5~A!2.iCUyO9";
//下载页面
Page page = dsj.downloadPage(url);
dsj.processPage(page);
//存储页面信息
dsj.storePageInfo(page);

}

//下载页面方法
public Page downloadPage(String url){
return this.downLoadService.download(url);
}

//解析页面方法
public void processPage(Page page){
this.processService.process(page);
}

//存储页面信息方法
public void storePageInfo(Page page){
this.storeService.store(page);
}
public IDownLoadService getDownLoadService() {
return downLoadService;
}

public void setDownLoadService(IDownLoadService downLoadService) {
this.downLoadService = downLoadService;
}

public IProcessService getProcessService() {
return processService;
}

public void setProcessService(IProcessService processService) {
this.processService = processService;
}

public IStoreService getStoreService() {
return storeService;
}

public void setStoreService(IStoreService storeService) {
this.storeService = storeService;
}

}

控制台输出:

总播放数:null
评论数:null
赞:null

为什么三个值都是null呢?只能说,page值为空。因此,还需要重构YOUKUProcessService的process方法,将它解析出来的信息存入page的每个属性中。具体代码如下:

package com.dajiangtai.djt_spider.service.impl;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.htmlcleaner.HtmlCleaner;
import org.htmlcleaner.TagNode;
import org.htmlcleaner.XPatherException;

import com.dajiangtai.djt_spider.entity.Page;
import com.dajiangtai.djt_spider.service.IProcessService;
import com.dajiangtai.djt_spider.util.HtmlUtil;
import com.dajiangtai.djt_spider.util.LoadPropertyUtil;
import com.dajiangtai.djt_spider.util.RegexUtil;

public class YOUKUProcessService implements IProcessService {

//这里解析得到的是 : 总播放数:16,931,628,832,因此采用正则表达式获取数字
// private String allnumberRegex = "(?<=总播放数:)[\\d,]+";
// private String commentnumberRegex = "(?<=评论:)[\\d,]+";
// private String supportnumberRegex = "(?<=顶:)[\\d,]+";
//
// private String parseAllNumber = "/body/div/div/div/div/div/ul/li[11]";
// private String parseCommentNumber = "//div[@class=\"p-base\"]/ul/li[12]";
// private String parseSupportNumber = "//div[@class=\"p-base\"]/ul/li[13]";

public void process(Page page) {
String content = page.getContent();
HtmlCleaner htmlCleaner = new HtmlCleaner();
//利用htmlCleaner对网页进行解析,得到根节点
TagNode rootNode = htmlCleaner.clean(content);

try {
// /html/body/div[4]/div/div[1]/div[2]/div[2]/ul/li[11]
//对XPath做相应的调整,使其有效,如果不该写,则使用debug模式,会发现evaluateXPath为[]
//总播放数
// String allnumber = HtmlUtil.getFieldByRegex(rootNode, parseAllNumber, allnumberRegex);
String allnumber = HtmlUtil.getFieldByRegex(rootNode, LoadPropertyUtil.getYOUKY("parseAllNumber"), LoadPropertyUtil.getYOUKY("allnumberRegex"));
//System.out.println("总播放数数量为:"+allnumber);
page.setAllnumber(allnumber);

//总播放数
String commentnumber = HtmlUtil.getFieldByRegex(rootNode, LoadPropertyUtil.getYOUKY("parseCommentNumber"), LoadPropertyUtil.getYOUKY("commentnumberRegex"));
//System.out.println("总评论数量为:"+commentnumber);
page.setCommentnumber(commentnumber);

//总播放数
String supportnumber = HtmlUtil.getFieldByRegex(rootNode, LoadPropertyUtil.getYOUKY("parseSupportNumber"), LoadPropertyUtil.getYOUKY("supportnumberRegex"));
//System.out.println("总评论数量为:"+supportnumber);
page.setSupportnumber(supportnumber);

page.setDaynumber("0");
page.setAgainstnumber("0");
page.setCollectnumber("0");

} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

重构ConsoleStoreService:

package com.dajiangtai.djt_spider.service.impl;

import com.dajiangtai.djt_spider.entity.Page;
import com.dajiangtai.djt_spider.service.IStoreService;

public class ConsoleStoreService implements IStoreService {

public void store(Page page) {
System.out.println("总播放数:"+page.getAllnumber());
System.out.println("评论数:"+page.getCommentnumber());
System.out.println("赞:"+page.getSupportnumber());
System.out.println("踩:"+page.getAgainstnumber());
System.out.println("收藏:"+page.getCollectnumber());
System.out.println("每日播放增量:"+page.getDaynumber());

}

}

测试,运行StartDSJCount的main方法,控制台输出:

总播放数:17,015,726,387
评论数:1,256,223
赞:13,835,376
踩:0
收藏:0
每日播放增量:0

时间: 2024-08-24 05:51:07

爬虫代码实现三:打通爬虫项目的下载、解析、存储流程的相关文章

Python爬虫学习:三、爬虫的基本操作流程

本文是博主原创随笔,转载时请注明出处Maple2cat|Python爬虫学习:三.爬虫的基本操作与流程 一般我们使用Python爬虫都是希望实现一套完整的功能,如下: 1.爬虫目标数据.信息: 2.将数据或信息存入数据库中: 3.数据展示,即在Web端进行显示,并有自己的分析说明. 这次我先介绍第一个功能中所需要实现的基本操作: 爬虫的基本操作:      表示必须步骤           表示可选步骤 导入爬虫所需要的库(如:urllib.urllib2.BeautifulSoup.Scrap

【最新原创】中国移动(中国联通)_通信账单,详单,个人信息抓取爬虫代码

概要: 1.因为公司需要,就花了一点时间写了一下三大运营商通信数据的抓取,涉及到Web上你所看得到的一切数据. 代码没啥技术含量,重点在于抓包分析过程.期间遇到了很多未知的困难,都一一克服了. 2.由于抓取数据的隐私性,我们的抓包是假设在用户已知自己数据被抓取,并且同意告知短信验证码的情况下进行的, 不属于黑客范畴! 3.整个过程,包括重建数据库表结构,解析json等如同逆向运营商的数据库一般.总体来说,三大运营商更新频率不算频繁,还算较稳定,数据结构,网页结构等都不会做很大的变动. 整体效果如

使用scrapy的定制爬虫-第三章-爬虫的javascript支持

-.-编辑中.我语文是数学老师教的... 后续补充参考代码,链接. 很多网站都使用javascript...网页内容由js动态生成,一些js事件触发的页面内容变化,链接打开.甚至有些网站在没有js的情况下根本不工作,取而代之返回你一条类似"请打开浏览器js"之类的内容. 对javascript的支持有四种解决方案: 1,写代码模拟相关js逻辑. 2,调用一个有界面的浏览器,类似各种广泛用于测试的,selenium这类. 3,使用一个无界面的浏览器,各种基于webkit的,casperj

java爬虫学习日记2-宽度优先爬虫代码实现

爬虫两种方式--宽度优先和带偏好爬虫 先复习下上次学了什么: URL和URI的结构组成 根据指定网址爬取网站内容(get方式和post方式) 上一日记中学到了抓取单个页面内容的方法,但实际项目中则需要爬虫遍历互联网,把互联网中相关的页面都抓取回来.那么爬虫是怎样遍历互联网,把页面抓取下来的呢?首先互联网可以开成是一个"图",每个页面可以看作一个节点,链接可以看作是"有向边".因此能够通过图的方式对互联网这超级大"图"进行遍历.图的遍历通常可分为宽

七夜在线音乐台开发 第三弹 爬虫篇 (原创)

上一篇咱们讲到了七夜音乐台的需求和所需要的技术.咱们今天就讲一下爬虫,为什么要讲爬虫,因为音乐台的数据源需要通过爬虫来获取,不可能手动来下载.下图是一个网络爬虫的基本框架: 网络爬虫的基本工作流程如下:     1.首先选取一部分精心挑选的种子URL: 2.将这些URL放入待抓取URL队列:     3.从待抓取URL队列中取出待抓取在URL,解析DNS,并且得到主机的ip,并将URL对应的网页下载下来,存储进已下载网页库中.此外,将这些URL放进已抓取URL队列.     4.分析已抓取URL

PHP 爬虫体验(三) - 使用PHP + puppeteer爬取js动态渲染的页面内容

之前写的两篇爬虫体验基本上涵盖了一般的Html页面提取场景,但是有些时候,如果目标页面不是纯静态的页面,而是使用js动态渲染的页面(比如one),之前的爬虫就不好使了,这种时候就要借助一些其他工具来进行实现. 一般爬取动态页面的思路是通过软件模拟浏览器行为获取到渲染后的页面镜像,然后再对渲染后的页面进行分析,常用的工具有selenium,phantomJs,puppeteer等,通过对项目维护程度.对PHP友好度的对比,我选用的是puppeteer. 根据官方介绍,谷歌在2017年开发了自家Ch

第三百三十节,web爬虫讲解2—urllib库爬虫—实战爬取搜狗微信公众号

第三百三十节,web爬虫讲解2-urllib库爬虫-实战爬取搜狗微信公众号 封装模块 #!/usr/bin/env python # -*- coding: utf-8 -*- import urllib from urllib import request import json import random import re import urllib.error def hq_html(hq_url): """ hq_html()封装的爬虫函数,自动启用了用户代理和ip

Node.js(十三)——Promise重构爬虫代码

在重构代码之前,先要了解下什么是https? https协议:基于ssl/tls的http协议,所有的数据都是在 ssl/tls协议的封装之上传输的,也就是说https协议是在http协议基础上 添加了ssl/tls握手以及数据加密传输,因此这就是两者之间最大的区别. https模块专门处理加密访问的,区别在于搭建https服务器的时候需要有ssl证书. 模拟搭建https服务器 var https = require('https') var fs = require('fs')//文件系统模

第三百三十四节,web爬虫讲解2—Scrapy框架爬虫—Scrapy爬取百度新闻,爬取Ajax动态生成的信息

第三百三十四节,web爬虫讲解2-Scrapy框架爬虫-Scrapy爬取百度新闻,爬取Ajax动态生成的信息 crapy爬取百度新闻,爬取Ajax动态生成的信息,抓取百度新闻首页的新闻标题和rul地址 有多网站,当你浏览器访问时看到的信息,在html源文件里却找不到,由得信息还是滚动条滚动到对应的位置后才显示信息,那么这种一般都是 js 的 Ajax 动态请求生成的信息 我们以百度新闻为列: 1.分析网站 首先我们浏览器打开百度新闻,在网页中间部分找一条新闻信息 然后查看源码,看看在源码里是否有