基于链接发掘策略的多进程web爬虫框架
介绍
基于链接发掘策略的web爬虫框架,实现多进程采集和xpath选择器等基础功能。
项目地址
https://github.com/d2gin/web-spider
原理
链接挖掘
- 框架本身是基于链接的,大致分为列表页和内容页链接。其中内容页链接最为重要,是数据的来源页。
- “发掘”理解为字面意思,从页面中收集链接,然后筛选我们需要的链接,将其写入链接池中,这是一个简单的筛选过程。
链接池
- 内置有基于
SplQueue
、Redis
作为链接存储的容器。 - 基于
SplQueue
的容器:这个原理很简单,就是利用PHP
自带的SplQueue
类来作为队列,存储合格的链接。他是基于单进程的,多进程不建议使用这个容器来运行框架。 - 基于
Redis
的容器:利用的是列表
的数据类型存储,因为Redis大部分都是原子操作,所以可以利用Redis
做多进程的数据容器。
- 内置有基于
选择器
- 数据的匹配是基于各种选择器的,目前设想的有
xpath
和正则
两种方案。 - xpath:基于
DOMXPath
封装的选择器,xpath相关语法需自行在网上查阅。 - regex:基于正则表达式的选择器,暂未实现。
- 数据的匹配是基于各种选择器的,目前设想的有
用例
编辑脚本
crawl.php
执行脚本
Xpath选择器
用例:
事件
onLinkDigging:链接入栈前触发,如果返回的是false,那么会阻止这一次的链接入栈。
参数 类型 说明 $spider \icy8\WebSpider\Spider 当前框架的实例 $link \icy8\WebSpider\entity\Link 准备入栈的链接实例 onPageReady:页面请求成功后和匹配字段前触发,在这个事件中可以通过改变
$page->response
属性提前过滤一些不需要的内容。参数 类型 说明 $page \icy8\WebSpider\entity\Page 请求的页面实例 onContentPage:页面请求成功后和字段匹配完成后触发。
参数 类型 说明 $page \icy8\WebSpider\entity\Page 请求的页面实例 $data Array|boolean 匹配得到的数据值,如果匹配失败会返回 false
onListPage:页面请求成功后触发
参数 类型 说明 $page \icy8\WebSpider\entity\Page 请求的页面实例 onEntryPage:页面请求成功后触发
参数 类型 说明 $page \icy8\WebSpider\entity\Page 请求的页面实例 onLinkRetry:页面请求失败后触发,如果返回的是
false
,那么会阻止这一次重试操作。参数 类型 说明 $link \icy8\WebSpider\entity\Link 请求的页面实例
实体
目前内置的实体都是要求实现\icy8\WebSpider\entity\QueueEntity
接口的,因为部分实体如\icy8\WebSpider\entity\Link
需要入栈链接池的,需要一个接口标准。
\icy8\WebSpider\entity\Page:网页内容
属性 类型 说明 $link \icy8\WebSpider\entity\Link 当前页的链接信息 $response string 当前页面的html $context string 来源页的html,暂未实现 $linkDigging boolean 是否在这个页面挖掘链接,默认 true
\icy8\WebSpider\entity\Link:链接信息
属性 类型 说明 $url string 链接的 url
$retryTimes int 重试的次数,默认 0
$depth int 当前连接的深度,暂未实现 $method string 规定请求时的方式,暂未实现 $proxy string 规定请求时的代理地址,暂未实现 $type int 链接类型,取值 Link::CONTENT_PAGE
、Link::LIST_PAGE
、Link::ENTRY_PAGE
$referer string 来源页的 url
选择器接口
如果你想自定义一个选择器,你需要实现接口\icy8\WebSpider\selectors\Selector
。接口说明:
基于链接发掘策略的多进程web爬虫框架
http://blog.icy8.cn/posts/6754/