关键词:
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
爬虫三种解析方法(代码片段)
...析。因为大多数情况下的需求,我们都会指定去使用聚焦爬虫,也就是爬取页面中指定部分的数据值,而不是整个页面的数据。因此,本次课程中会给大家详细介绍讲解三种聚焦爬虫中的数据解析方式。至此,我们的数据爬取的... 查看详情
scrapy爬虫下载音频文件并储存到本地(代码片段)
玩爬虫,怎么能少了scrapy框架呢。scrapy框架被称为是复杂并好用的爬虫框架。当初学框架的时候是一头雾水,一旦实战成功过后,感觉瞬间打通了任督二脉,很有成就感。接下来,将对scrapy框架爬虫代码编写流程做简要说明:&nb... 查看详情
爬虫——scrapy框架(代码片段)
Scrapy是一个异步处理框架,是纯Python实现的爬虫框架,其架构清晰,模块之间的耦合程度低,可拓展性强,可以灵活完成各种需求。我们只需要定制几个模块就可以轻松实现一个爬虫。1.架构 ScrapyEngine,引擎,负责整个系统... 查看详情
爬虫实战:百度失信人名单(代码片段)
文章目录失信人信息爬虫项目1.需求2.开发环境3抓取百度失信人名单3.1.实现步骤:3.2创建爬虫项目3.3.根据需求,定义数据模型3.4实现百度失信名单爬虫3.5.保存失信名单信息3.6.实现随机User-Agent和代理IP下载器中间件,解决IP反爬.4.实... 查看详情
爬虫数据解析(代码片段)
1、今日学习提纲 聚焦爬虫、正则、bs4、xpath2、聚焦爬虫:爬取页面中指定的页面内容 --编码流程: --指定url --发起请求 --获取响应数据 --数据解析 --持久化存储3、数据解析... 查看详情
爬虫---06.scrapy框架初始(代码片段)
一.基本概念-scrapy:爬虫框架。 异步爬取,高性能的数据解析+持久化存储操作, 集成了各种功能(高性能异步下载,队列,分布式,解析,持久化等)的具有很强通用性的项目模板。-框架:集成了很多... 查看详情
25-2三种数据解析方式(代码片段)
...析。因为大多数情况下的需求,我们都会指定去使用聚焦爬虫,也就是爬取页面中指定部分的数据值,而不是整个页面的数据。因此,本次课程中会给大家详细介绍讲解三种聚焦爬虫中的数据解析方式。至此,我们的数据爬取的... 查看详情
抓取新闻网站:异步爬虫实现的流程和细节(代码片段)
利用python写爬虫的人越来越多,这也表明了用python写爬虫相比其它语言用起来更方便一些。很多新闻网站都没有反爬虫的策略,所以爬取新闻网站的数据就更加方便。但是,新闻网站多如牛毛,我们该如何去爬呢?从哪里开爬呢... 查看详情
python爬虫怎么挣钱?解析python爬虫赚钱方式(代码片段)
Python爬虫怎么挣钱?解析Python爬虫赚钱方式,想过自己学到的专业技能赚钱,首先需要你能够数量掌握Python爬虫技术,专业能力强才能解决开发过程中出现的问题,Python爬虫可以通过Python爬虫外包项目、整合信息数据做产品、独... 查看详情
scrapy流程(代码片段)
scrapy命令:scrapystartprojectxx(爬虫目录)创建爬虫目录cdxx进入目录scrapygenspilderchouti(爬虫名称)chouti.com(起始url)然后编写启动爬虫项目:scrapycrawlchouti(爬虫名称)--nolog(不看默认日志)#name=""这个是爬虫的名字,必须唯一,在不同的爬虫... 查看详情
网络爬虫三
scrapy是一个流行的网络爬虫框架一,创建项目在终端输入scrapystartprojectexample (example为项目名)cd example此时会生成几个文件二,定义模型example/items.py文件包含如下代码#-*-coding:utf-8-*-importscrapy#存储想要抓取的信息classExamp... 查看详情
python爬虫能做啥
Python是一门非常适合开发网络爬虫的编程语言,相比于其他静态编程语言,Python抓取网页文档的接口更简洁;相比于其他动态脚本语言,Python的urllib2包提供了较为完整的访问网页文档的API。此外,python中有优秀的第三方包可以高... 查看详情
优酷电视剧爬虫代码实现一:下载解析视频网站页面
1.新建一个电视剧爬虫入口类StartDSJCount。如果后期还需要综艺或者电影,也可以仿照再新建综艺或电影爬虫入口类。packagecom.dajiangtai.djt_spider.start;importcom.dajiangtai.djt_spider.entity.Page;importcom.dajiangtai.djt_spider.service.IDownLoadService 查看详情
基础的爬虫框架及运行流程
爬虫框架的基础和运行流程 基本的框架流程基础爬虫框架主要包括五大模块、分别为爬虫调度器、URL管理器、HTML下载器、HTML解析器、数据存储器。功能分析如下:爬虫调度器主... 查看详情
9.爬虫训练场,分页爬虫案例设计demo,打通pythonflask和mysql(代码片段)
文章目录PythonFlask调用MySQL数据建立新的控制器目录爬虫训练场引入MySQL之间的逻辑关系搭建案例前端页面本篇博客为大家继续补充一款简易爬虫,主要涉及如下知识点。PythonFlask调用MySQL数据分页数据呈现PythonFlask调用MySQL数据网... 查看详情
爬虫:爬取github项目结构任意文件下载存储(代码片段)
文章目录场景描述爬取Github项目的文件结构爬取Laravel8.x文件结构编写脚本访问Github连接超时requests读取时间超时爬取脚本任意文件下载脚本场景描述需求:发现任意文件下载漏洞后,可能需要下载源码进行代码审计。问... 查看详情
爬虫2.1-scrapy框架-两种爬虫对比(代码片段)
目录scrapy框架-两种爬虫对比和大概流程1.传统spider爬虫2.crawl型爬虫3.循环页面请求4.scrapy框架爬虫的大致流程scrapy框架-两种爬虫对比和大概流程注:spider.py指使用命令行创建的爬虫主文件1.传统spider爬虫创建scrapy项目,首先进入... 查看详情
05python网络爬虫的数据解析方式(代码片段)
一.爬虫数据解析的流程 1.指定url 2.基于requests模块发起请求 3.获取响应中的数据 4.数据解析 5.进行持久化存储二.解析方法 (1)正则解析 (2)bs4解析 (3)xpath解析 1.正则解析 常用正则表达式 ... 查看详情