简单的PHP多线程爬虫框架querylist实践(应用于thinkphp5+)实践框架:在thinkphp5中要实现这个功能,需要安装两个包:jaeger/querylist:可以实现一些爬取网页的常用语法,比如xPathjaeger/querylist-curl-multi:实现multi的包querylist的优点-threaded启动网络操作,安装简单,无坑,命令行和界面均可使用。相关文档:http://www.querylist.cc/docs/...http://www.querylist.cc/docs/...实现步骤:1、安装包:composerrequirejaeger/querylistcomposerrequirejaeger/querylist-curl-multi2.phpfile:useQL\QueryList;useQL\Ext\CurlMulti;//抓取列表publicfunctionspider(){$urlPool=[];$起始页=1;//从第一页开始抓取$workerNum=10;//并发执行数$host='https://xxxxxx?page=';$现在页面=1;//执行时使用的暂存计数器while(1){//生成给爬取的链接每次打印$workerNum页数据for($i=1;$i<=$workerNum;$i++){$urlPool[]=$host.$nowPage;$现在页面++;}$ql=查询列表::使用(CurlMulti::class);$ql->curlMulti($urlPool)//每个任务成功完成都会调用这个回调->success(function(QueryList$ql,CurlMulti$curl,$r){//这个你可以使用xpath语法来获取相应的数据//也可以使用其他形式获取数据,可以参考文档$data=$ql->find('#hits-list>div:nth-child(n)>div.header>div>a:nth-child(1)')->texts();//打印当前获取的链接和解析后的数据Log::write('Currenturl:'.$r['info']['url']);日志::写入($数据->所有());//如果逻辑复杂,可以调用其他方法处理SpiderService::getInstance()->insertToDb($data->all());})//每个任务失败回调->error(function($errorInfo,CurlMulti$curl){echo"Currenturl:{$errorInfo['info']['url']}\r\n";print_r($errorInfo['error']);//出错终止,跳出循环thrownewException("报错结束");})->start([//最大并发数'maxThread'=>$workerNum,//错误重试次数'maxTry'=>3,]);//每次执行后,重置连接池$urlPool=[];}}
