一、概述
1、介绍
WebMagic的底层用到了HttpClient和Jsoup 能够更方便地开发爬虫
WebMagic项目代码分为核心和扩展两部分
其中:
- ★核心部分(webmagic-core)是一个精简的 模块化的爬虫实现
而扩展部分则包括一些便利的 实用性的功能 - ★扩展部分(webmagic-extension)提供了一些便捷的功能 例如用注解模式编写爬虫等
同时内置了一些常用的组件 便于爬虫开发
WebMagic的设计目标是尽量的模块化 并体现爬虫的功能特点
提供了非常简单 灵活的API 可以在基本不改变开发模式的情况下编写一个爬虫
2、结构:
WebMagic的结构分为【Downloader】 【PageProcessor】 【Scheduler】 【Pipeline】四大组件
并由【Spider】将它们彼此组织起来
这四大组件对应了爬虫生命周期中的下载 处理 管理和持久化等功能
- Downloader
负责从互联网上下载页面以便后续处理
(默认使用HttpClient作为下载工具) - PageProcessor
负责解析页面 抽取有用的信息 以及发现新的链接
(使用Jsoup作为HTML解析工具 并基于其开发了解析XPath的工具Xsoup) - Scheduler
负责管理待抓取的URL 以及一些去重的工作
默认提供了JDK的内存队列来管理URL 并用集合进行去重
支持使用Redis进行分布式管理 - Pipeline
负责抽取结果的处理 包括计算 持久化到文件和数据库等
(默认提供了输出到控制台和保存到文件两种结果处理方案)
示意图:
是Spider将这几个组件组织起来 让它们可以互相交互 流程化的执行
可以认为Spider是一个大的容器 它也是WebMagic逻辑的核心
3、用于数据流转的对象:
★ Request
Request是对URL地址的一层封装
一个Request对应一个URL地址
是PageProcessor与Downloader交互的载体 也是PageProcessor控制Downloader的唯一方式
其有一个额外字段extra
可用于保存一些特殊的属性 然后在其它地方读取 以完成不同的功能 例如附加上页面信息
格式为key-value 键值对
★ Page
Page代表了从Downloader下载到的一个页面(可能是HTML也可能是Json或者其它文本格式的内容)
是WebMagic抽取过程的核心对象 提供了一些方法可供抽取 结果保存等操作
★ ResultItems
ResultItems相当于一个Map 保存了PageProcessor处理的结果 供Pipeline使用
其API与Map很类似
有一个额外字段skip 若设为true的话 则代表不被Pipeline处理
二、使用
1、简单使用
首先 是引入依赖:
<!--Webmagic核心包-->
<dependency>
<groupId>us.codecraft</groupId>
<artifactId>webmagic-core</artifactId>
<version>0.7.3</version>
</dependency>
<!--Webmagic扩展包-->
<dependency>
<groupId>us.codecraft</groupId>
<artifactId>webmagic-extension</artifactId>
<version>0.7.3</version>
</dependency>
注:0.7.3版本对SSL的支持并不完全 若直接从Maven中央仓库下载依赖
在爬取只支持SSL v1.2的网站会有SSL的异常抛出
解决方案:使用0.7.4版本 或 直接从github上下载最新代码安装到本地仓库
然后将github下载的webmagic-core放于本地一个目录下
选择从本地导入:
选择Maven:
点击该按钮:
安装:
然后是添加log4j.properties日志配置文件
(因为WebMagic的内部已整合了slf4j的依赖)
log4j.rootLogger=DEBUG,A1
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c]-[%p] %m%n
接下来 就可以很方便地使用了:
// 实现PageProcessor类 复写方法
public class JobProcessor implements PageProcessor {
// 解析页面
public void process