爬虫框架WebMagic
| 十次方前端: | 
参考链接:十次方人工智能笔记一:网络爬虫
架构解析
WebMagic的设计目标是尽量的模块化,并体现爬虫的功能特点。这部分提供非常简单、灵活的API,在基本不改变开发模式的情况下,编写一个爬虫。
WebMagic的结构分为Downloader、PageProcessor、Scheduler、Pipeline四大组件,并由Spider将它们彼此组织起来。这四大组件对应爬虫生命周期中的下载、处理、管理和持久化等功能。而Spider则将这几个组件组织起来,让它们可以互相交互,流程化的执行,可以认为Spider是一个大的容器,它也是WebMagic逻辑的核心。

WenMagic组件
- Downloader
Downloader负责从互联网上下载页面,以便后续处理。WebMagic默认使用了ApacheHttpClient作为下载工具。
- PageProcesser
PageProcessor负责解析页面,抽取有用信息,以及发现新的链接。WebMagic使用Jsoup作为HTML解析工具,并基于其开发了解析XPath的工具Xsoup。
在这四个组件中,PageProcessor对于每个站点每个页面都不一样,是需要使用者定制的部分。
- Scheduler
Scheduler负责管理待抓取的URL,以及一些去重的工作。WebMagic默认提供了JDK的内存队列来管理URL,并用集合来进行去重。也支持使用Redis进行分布式管理。
- Pipeline
Pipeline负责抽取结果的处理,包括计算、持久化到文件、数据库等。WebMagic默认提供了“输出到控制台”和“保存到文件”两种结果处理方案。
API
Spider API
同时Spider的其他组件(Downloader、Scheduler、Pipeline)都可以通过set方法来进行设置。

Site API

PageProcessor
爬取页面全部内容
需求:编写爬虫程序,爬取csdn中博客的内容 https://blog.csdn.net/
- 创建工程,引入依赖 - <?xml version="1.0" encoding="UTF-8"?> 
 <project xmlns="http://maven.apache.org/POM/4.0.0"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 <modelVersion>4.0.0</modelVersion>
 <groupId>com.xushuai</groupId>
 <artifactId>webmagic_demo</artifactId>
 <version>1.0-SNAPSHOT</version>
 <dependencies>
 <dependency>
 <groupId>us.codecraft</groupId>
 <artifactId>webmagic-core</artifactId>
 <version>0.7.3</version>
 </dependency>
 <dependency>
 <groupId>us.codecraft</groupId>
 <artifactId>webmagic-extension</artifactId>
 <version>0.7.3</version>
 </dependency>
 </dependencies>
 </project>
- 实现页面爬取 - package com.xushuai.magic.spider; 
 import us.codecraft.webmagic.Page;
 import us.codecraft.webmagic.Site;
 import us.codecraft.webmagic.Spider;
 import us.codecraft.webmagic.pipeline.ConsolePipeline;
 import us.codecraft.webmagic.processor.PageProcessor;
 /**
 * Spider Class Demo
 */
 public class PageProcessorDemo1 implements PageProcessor {
 public void process(Page page) {
 System.out.println(page.getHtml().toString());
 }
 public Site getSite() {
 return Site.me().setSleepTime(100).setRetryTimes(3);
 }
 public static void main(String[] args) {
 Spider.create(new PageProcessorDemo1())
 // 添加爬取的主网站
 .addUrl("https://www.csdn.net/")
 .run();
 }
 }
Page代表了从Downloader下载到的一个页面——可能是HTML,也可能是JSON或者 其他文本格式的内容。Page是WebMagic抽取过程的核心对象,它提供一些方法可供抽取、结果保存等。
Site用于定义站点本身的一些配置信息,例如编码、HTTP头、超时时间、重试策略等、代理等,都可以通过设置Site对象来进行配置。
爬取指定内容
使用xpath来抓去网页指定部分内容
| page.getHtml().xpath("//*[@id=\"nav\"]/div/div/ul/li[5]/a"); | 
添加目标地址
添加目标地址,将目标地址中所有的链接添加到待爬取列表
| page.addTargetRequests(page.getHtml().links().all()); | 
目标地址正则匹配
需求:只提取博客的文章详细页内容,并提取标题
| page.addTargetRequests(page.getHtml() | 
Pipeline
ConsolePipeline 控制台输出(省略)
FilePipeline 文件输出
| public static void main(String[] args) { | 
JsonFilePipeline Json输出
| public static void main(String[] args) { | 
Custom Pipeline 自定义输出
- 编写自定义管道类
| package com.xushuai.magic.pipeline; | 
- 添加自定义管道
| public static void main(String[] args) { | 
Scheduler
Scheduler(URL管理)最基本的功能是实现对已经爬取的URL进行标示。可以实现URL的增量去重。
目前Scheduler主要有三种实现方式:
- 内存队列:QueueScheduler
- 文件队列:FileCacheQueueScheduler
- Redis队列:RedisScheduler
内存队列
| public static void main(String[] args) { | 
文件队列
使用文件保存抓取URL,可以在关闭程序并下次启动时,从之前抓取到的URL继续抓取。
| public static void main(String[] args) { | 
Redis队列
使用Redis保存抓取队列,可进行多台机器同时合作抓取。
| public static void main(String[] args) { | 
十次方文章数据爬取
需求:每日某时间段从CSDN播客中爬取文档,存入文章数据库中。
准备工作
- CSDN中各个频道的地址

- 向数据库tensquare_article中的tb_channel表中添加记录
应该加好了
创建Module
- pom.xml
| <?xml version="1.0" encoding="UTF-8"?> | 
- application.yml - server: 
 port: 9014
 spring:
 application:
 name: i-article-crawler #指定服务名
 datasource:
 driverClassName: com.mysql.jdbc.Driver
 url: jdbc:mysql://**********:3306/article?characterEncoding=UTF8
 username: ******
 password: ******
 jpa:
 database: MySQL
 show-sql: true
 redis:
 host: *************
- 启动类 
| package com.i.articlecrawler; | 
- 文章实体类以及数据访问接口



