网页css js 抓取助手(WebMagic介绍项目代码分为核心和扩展两部分的区别 )
优采云 发布时间: 2022-04-04 12:12网页css js 抓取助手(WebMagic介绍项目代码分为核心和扩展两部分的区别
)
一、WebMagic介绍
WebMagic 项目代码分为核心和扩展两部分。核心部分(webmagic-core)是一个精简的、模块化的爬虫实现,而扩展部分包括一些便利和实用的功能。
WebMagic 的设计目标是尽可能模块化,并体现爬虫的功能特点。这部分提供了一个非常简单灵活的API来编写爬虫,而无需基本改变开发模式。
扩展部分(webmagic-extension)提供了一些方便的功能,比如以注解方式编写爬虫。同时内置了一些常用的组件,方便爬虫开发。
1.1 架构介绍
WebMagic 的结构分为四大组件:Downloader、PageProcessor、Scheduler 和 Pipeline,它们由 Spider 组织。这四个组件分别对应了爬虫生命周期中的下载、处理、管理和持久化的功能。WebMagic 的设计参考了 Scapy,但实现更类似于 Java。
Spider 组织这些组件,以便它们可以相互交互并处理执行。可以认为Spider是一个大容器,也是WebMagic逻辑的核心。
WebMagic的整体架构图如下:
1.1.1 WebMagic 的四个组成部分
1、下载器
下载器负责从 Internet 下载页面以进行后续处理。WebMagic 默认使用 Apache HttpClient 作为下载工具。
2、页面处理器
PageProcessor 负责解析页面、提取有用信息和发现新链接。WebMagic 使用 Jsoup 作为 HTML 解析工具,并在其基础上开发了 Xsoup,一个解析 XPath 的工具。这四个组件中,PageProcessor对于每个站点的每个页面都是不同的,是需要用户自定义的部分。
3、调度器
Scheduler 负责管理要爬取的 URL,以及一些去重工作。WebMagic 默认提供 JDK 的内存队列来管理 URL,并使用集合进行去重。还支持使用 Redis 进行分布式管理。
4、管道
Pipeline负责提取结果的处理,包括计算、持久化到文件、数据库等。WebMagic默认提供两种结果处理方案:“输出到控制台”和“保存到文件”。
Pipeline 定义了保存结果的方式。如果要保存到指定的数据库,需要编写相应的Pipeline。通常,对于一类需求,只需要编写一个 Pipeline。
1.1.2 数据流对象
1、请求
Request是对URL地址的一层封装,一个Request对应一个URL地址。
它是PageProcessor 与Downloader 交互的载体,也是PageProcessor 控制Downloader 的唯一途径。
除了 URL 本身,它还收录一个 Key-Value 结构的额外字段。你可以额外保存一些特殊的属性,并在其他地方读取它们来完成不同的功能。例如,添加上一页的一些信息等。
2、页面
Page 表示从 Downloader 下载的页面 - 它可能是 HTML、JSON 或其他文本内容。页面是WebMagic抽取过程的核心对象,它提供了一些抽取、结果保存等方法。
3、结果项
ResultItems相当于一个Map,它保存了PageProcessor处理的结果,供Pipeline使用。它的API和Map非常相似,值得注意的是它有一个字段skip,如果设置为true,它不应该被Pipeline处理。
1.2 入门案例
1.2.1 添加依赖
创建一个Maven项目并添加以下依赖项
注意:0.7.3 版本不支持 SSL。如果直接从Maven中央仓库下载依赖,爬取只支持SSL v1.2的网站,会抛出SSL异常。
1.2.2 添加*敏*感*词*
WebMagic 使用 slf4j-log4j12 作为 slf4j 的实现。
添加 log4j.properties 配置文件:
log4j.rootLogger=INFO,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
1.2.3 案例实现
二、WebMagic 功能
2.1 实现 PageProcessor
2.1.1 提取元素可选
WebMagic 中使用了三种主要的提取技术:XPath、正则表达式和 CSS 选择器。另外,对于 JSON 格式的内容,可以使用 JsonPath 进行解析。
2.1.1.1 XPath
入口案例是获取属性class=mt的div标签和里面h1标签的内容
page.getHtml().xpath("//div[@class=mt]/h1/text()")
2.1.1.2 个 CSS 选择器
CSS 选择器是一种类似于 XPath 的语言。上一课我们学习了Jsoup的选择器。写起来比XPath简单,但是写更复杂的抽取规则就比较麻烦。
div.mt>h1 表示类为mt的div标签下的直接子元素h1标签
page.getHtml().css("div.mt>h1").toString()
2.1.1.3 正则表达式
正则表达式是一种通用的文本提取语言。这里一般用来获取url地址。
2.1.2 提取元素 API
可选相关提取元素链接 API 是 WebMagic 的核心功能。使用Selectable接口,可以直接完成页面元素的链式提取,无需关心提取的细节。
在刚才的例子中可以看到,page.getHtml()返回一个实现了Selectable接口的Html对象。该接口收录的方法分为两类:提取部分和获取结果部分。
2.1.3 获取结果 API
当链式调用结束时,我们一般希望得到一个字符串类型的结果。这时候就需要使用API来获取结果了。
我们知道,一条抽取规则,无论是 XPath、CSS 选择器还是正则表达式,总是可以抽取多个元素。WebMagic 将这些统一起来,可以通过不同的 API 获取一个或多个元素。
2.1.4 获取链接
有了处理页面的逻辑,我们的爬虫就差不多完成了,但是还有一个问题:一个站点的页面很多,我们不能一开始就全部列出来,那么如何找到后续的链接就是爬虫了不能缺少的部分
下面的例子就是获取这个页面
所有与 \\w+?.* 正则表达式匹配的 URL 地址,并将这些链接添加到要爬取的队列中。