最近有个朋友需要我帮他用php采集一些东西,这里我就不得不提很强大的:querylist
官网:http://www.querylist.cc/
简单的介绍一下:QueryList不依赖任何框架和架构,它可以单独使用也可以引入到任意的PHP开发框架中去使用,如:Laravel、ThinkPHP;你可以使用它来构建简单的采集系统,也可以用它才构建高可用的分布式采集系统。它提供了丰富的基于CSS选择器的页面抽取API,完全模块化的设计,拥有强大的可扩展性。
composer require jaeger/querylist关于composer的安装请大家自行百度.
是不是迫不及待了?别慌,接下来我为你慢慢演示
看看PHP用QueryList做采集到底有多简洁吧!
<?phpuse QL\QueryList;//采集某页面所有的图片$data = QueryList::get('http://cms.querylist.cc/bizhi/453.html')->find('img')->attrs('src');//打印结果print_r($data->all());//采集某页面所有的超链接和超链接文本内容//可以先手动获取要采集的页面源码$html = file_get_contents('http://cms.querylist.cc/google/list_1.html');//然后可以把页面源码或者HTML片段传给QueryList$data = QueryList::html($html)->rules([ //设置采集规则 // 采集所有a标签的href属性 'link' => ['a','href'], // 采集所有a标签的文本内容 'text' => ['a','text']])->query()->getData();//打印结果print_r($data->all());/** * 在线测试采集并查看采集结果:http://querylist.cc/querylist-test
*/上面的采集结果有很多“杂质”,一定不会满足你的要求,来获取我们真正想要的结果。
<?php// 采集该页面[正文内容]中所有的图片$data = QueryList::get('http://cms.querylist.cc/bizhi/453.html')->find('.post_content img')->attrs('src');//打印结果print_r($data->all());// 采集该页面文章列表中所有[文章]的超链接和超链接文本内容$data = QueryList::get('http://cms.querylist.cc/google/list_1.html')->rules([ 'link' => ['h2>a','href','',function($content){ //利用回调函数补全相对链接 $baseUrl = 'http://cms.querylist.cc'; return $baseUrl.$content; }], 'text' => ['h2>a','text']])->range('.cate_list li')->query()->getData();//打印结果print_r($data->all());正如你看到的那样,使用QueryList做采集只需要编写采集规则即可!
<?php/** * 下面来完整的演示采集一篇文章页的文章标题、发布日期和文章内容并实现图片本地化
*/ //引入自动加载文件require 'vendor/autoload.php';use QL\QueryList;//需要采集的目标页面$page = 'http://cms.querylist.cc/news/566.html';//采集规则$reg = [ //采集文章标题 'title' => ['h1','text'], //采集文章发布日期,这里用到了QueryList的过滤功能,过滤掉span标签和a标签 'date' => ['.pt_info','text','-span -a',function($content){ //用回调函数进一步过滤出日期 $arr = explode(' ',$content); return $arr[0]; }], //采集文章正文内容,利用过滤功能去掉文章中的超链接,但保留超链接的文字,并去掉版权、JS代码等无用信息 'content' => ['.post_content','html','a -.content_copyright -script']];$rang = '.content';$ql = QueryList::get($page)->rules($reg)->range($rang)->query();$data = $ql->getData(function($item){ //利用回调函数下载文章中的图片并替换图片路径为本地路径 //使用本例请确保当前目录下有image文件夹,并有写入权限 $content = QueryList::html($item['content']); $content->find('img')->map(function($img){ $src = 'http://cms.querylist.cc'.$img->src; $localSrc = 'image/'.md5($src).'.jpg'; $stream = file_get_contents($src); file_put_contents($localSrc,$stream); $img->attr('src',$localSrc); }); $item['content'] = $content->find('')->html(); return $item;});//打印结果print_r($data->all());我给大家演示一下采集我的博客
undefined
<?phprequire 'vendor/autoload.php';use QL\QueryList;$ql = QueryList::get('https://blog.eirds.cn/');//获取所有h2标签下的a标签的文本$data = $ql->find('h2>a')->texts();print_r($data->all());//获取所有<span>标签下文本$data = $ql->find('span')->texts();print_r($data->all());只需要简单的配置采集规则.这样就简简单单的完成了一些采集,无需写复杂的正则表达式,如果你有jquery基础,那么操作起来肯定是很溜的.官网的api手册还提供了很多丰富的功能,比如多线程GET,post,以及携带各种参数采集.相信大家都迫不及待的想去尝试了吧,快去操作一下吧 ::twemoji:proud:: ::twemoji:proud::
undefined
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。