Download the PHP package xixizizixixi/fatgoose without Composer
On this page you can find all versions of the php package xixizizixixi/fatgoose. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.
Informations about the package fatgoose
一些注意点
-
多进程可能出现的问题:因为多进程时各个进程之间的布隆过滤器无法保持一致,所以历史记录表和抓取任务表可能会出现重复内容。一般情况下也没必要使用多进程。
-
多个线程使用同一个tor链路:已实测如果有多个线程正在使用同一个tor链路(比如下载),此时用
kill -1 tor进程id
切换tor链路,不会对这些线程产生影响,新的线程会使用新的tor链路 -
长时间抓取需要考虑的问题:一般默认8小时后数据库连接将会断开,如果任务跑的时间特别长,修改mysql数据库配置的interactive_timeout和wait_timeout
-
目前下文中所指"自定义信息数组"包含:① 'task'键保存任务数组 ② 'opt'键保存抓取选项数组 ③ 'tor'键保存一个数组['port'=>端口号,'pid'=>进程id]
-
通过addTask()方法或者手动向抓取任务表中添加任务时需注意:因为先添加的任务先处理,所以添加任务的顺序会影响采集到的数据在数据库中的排列顺序。通常老的任务应该先添加,最新任务后添加。
- 即使返回响应状态码200,调用了抓取成功回调函数,也并不一定是\"真正的抓取成功\"了,因为返回的内容很可能是预期外的其他内容,所以务必进行特征检测,保证是需求的内容
快速开始 —— 抓取
快速开始 —— 监视
抓取回调函数自动传入的参数情况
-
静态方法mCrawl()用的回调函数没有中括号[ ]里面的部分,也没有返回值。此方法主要用于一些简单的抓取和进行抓取测试。
-
curl信息数组里面有什么可以看这个页面的"Return Values"部分 https://www.php.net/manual/en/function.curl-getinfo.php
-
onSuccess
- p1:curl信息数组
- p2:抓取到的内容
- [ p3:自定义信息数组 ]
- [ p4:pdo对象 ]
这个回调函数主要有三个作用:
①对抓取到的内容进行分析,提取出自己想要的数据保存到数据库中
②返回一个数组,里面的url会成为下一级别的抓取任务。形式:
- [ [ url , url , ...... ],false ] 这种形式默认extraInfo为null
- [ [ [ url,extraInfo ] , [ url,extraInfo ] , ...... ] , false ]
- 上面的extraInfo是个关联数组
- 上面false改为true可临时无视布隆过滤器
③返回\"reset\"重置任务,任务状态重新设置为0;返回\"ignore\"则先跳过任务,任务状态会保持在1,以后再处理
-
onSuccessWithUnexpectedCode
- p1:curl信息数组
- [ p2:自定义信息数组 ]
- [ p3:pdo对象 ]
返回\"reset\"重置任务,任务状态重新设置为0
- onFail
- p1:目标url
- p2:错误消息
- p3:错误码
- [ p4:自定义信息数组 ]
- [ p5:pdo对象 ]
监视回调函数自动传入的参数情况
监视器对监视任务表中的任务进行监视(周期抓取),抓取成功后调用回调函数,回调函数中对页面是否更新进行判断。
- onMonitorSuccess
- p1:curl信息数组
- p2:抓取到的内容
- p3:自定义信息数组
- p4:pdo对象
- p5:布隆过滤器对象
返回数组(形式同onSuccess的返回值)则向抓取任务表中追加新的任务(任务级别加1),返回true则更新抓取任务表中与当前监视任务对应的任务为未抓取(0)状态以便再次抓取。
数据去重(布隆过滤器)
针对每个抓取的目标网站建立一个历史url集合,对即将添加到抓取任务表的url判断是否在这个集合中,没在才添加,并将这个新的url加入到集合中。
技术上采用布隆过滤器(bloomfilter):时间和空间效率极高,有误判“结果在集合中,但实际不在集合中”,“结果不在集合中,实际也一定不在集合中”。所以使用bloomfilter最大的损失也就是有一些页面漏抓而已,这是完全可以承受的。
项目地址: https://github.com/pleonasm/bloom-filter 使用时直接参考即可
如果每次创建布隆过滤器对象都通过历史url表,当数据量特别大的时候整个过程会非常慢,而且很占内存。此时可考虑使用布隆过滤器缓存文件,如果缓存文件存在,则用缓存文件创建对象,否则还是通过历史url表创建对象。
注意:①缓存文件只适用于单进程,否则多个进程之间会相互覆盖②如果程序异常终止或强制终止,缓存文件会和历史url表不一致,此时应该手动删除缓存文件以便生成新的缓存文件
配置数组的配置项说明
API说明
-
__construct()
创建FatGoose对象,参数依次为数据库名、任务表名、历史表名、监视表名、配置选项数组
-
setCallbacksArr()
设置抓取回调函数数组。此数组的格式为
-
setMonitorCallbacksArr()
设置监视回调函数数组。此数组的格式为
-
addTask()
用于添加抓取任务,第一个参数是任务数组,第二个参数是否忽略布隆过滤器(默认false)。任务数组的格式为
-
registerFuncExtraCurlOpt()
注册一个回调函数,自动传入自定义信息数组的引用,此回调函数在创建每个curl资源的时候都会调用
这个回调函数可以(1)用返回值设置额外的或覆盖已存在的curl选项(2)往自定义信息数组里面注入额外信息
此回调函数大致结构如下,特别要注意参数是引用传递
-
run()
开始爬取
-
monitor()
开始监视
-
静态方法 mCrawl()
多线程异步爬虫,此方法功能有所简化,主要用于简单的抓取和抓取测试。传入的参数依次为,待抓取的页面(字符串或数组)、抓取成功的回调函数、响应状态码预期外的回调函数、抓取失败的回调函数、线程数、重试次数、抓取选项数组
-
静态方法 absoluteUrl()
相对url转绝对url。传入的参数依次为,待转换的url(字符串或数组)、参照url,如果是目录后面带上/
-
静态方法 customArrayMerge()
将第二个数组的数组项合并到第一个数组中,有则覆盖,无则追加,并且实现递归。