头像

用QueryList+thinkphp批量采集一个图片网站并保存到数据库的完整实例(1)

2017-09-06 10:10:56 来源:好分享   浏览()   评论 ( 0 )   

以前大家写采集一般都是用正则表达式,然而正则表达式虽然强大,但是很麻烦,每次采集一个站都要测试好多遍才能成功。后来听朋友介绍了一款采集插件QueryList,发现不仅强大,而且非常好用,可以像jQuery一样使用选择器匹配采集,只要你会jQuery选择器就可以轻松使用QueryList了,并且和jQuery选择器用法完全通用。QueryList的出现让PHP做采集从此变得简单。


今天给大家分享一下使用QueryList+thinkphp3.2批量采集一个图片站的心得,实现图片下载到本地生成缩略图并保存到数据库。


采集目标网站:帅哥图库

网址:http://www.shuaigetu.net/


一、准备工具:

1、thinkphp3.2.3集成QueryList3和所有插件打包,下载地址:

http://source.querylist.cc/Querylist-demo/thinkphp3.2.3_QueryList3_full.zip


二、在thinkphp3.2中安装整合QueryList3及所有插件包的步骤:

1、把压缩包里面的vendor目录全部复制到你的thinkphp项目中。

用QueryList+thinkphp批量采集一个图片网站并保存到数据库的完整实例(1)

2、在thinkphp项目入口文件中(如前台入口index.php或者后台入口admin.php)加入 require 'vendor/autoload.php'; 这段代码,意思是项目加载的时候就自动加载QueryList,接下来就能直接使用采集功能了,是不是很简单呢。

用QueryList+thinkphp批量采集一个图片网站并保存到数据库的完整实例(1)


三、下面开始使用QueryList+thinkphp采集工作。

1、设置php超时set_time_limit(3600);(我这里设置的超时是一小时,这个很重要,否则采集过程中会超时报错)。

2、找到列表页,以帅哥图片这个列表为例,列表网址:http://www.shuaigetu.net/shuaigetupian

3、找到通用分页参数,比如这个页面的分页参数是“-p-”。

4、接下来就可以开始匹配列表中的url了。我们可以用浏览器审查元素或者查看网页源代码的方法找到列表中的a标签href匹配规则,得到的选择器规则是“.item_list .img a”。

5、用多线程抓取该列表页匹配区域中的所有url,并去除重复链接,以下是代码片段。

<?php
use QL\QueryList;
set_time_limit(3600);
//HTTP操作扩展
$urls = QueryList::run('Request',[
        'target' => 'http://www.shuaigetu.net/shuaigetupian',  //目标页面
        'referrer'=>'http://www.baidu.com',  //来源网址
        'method' => 'GET',
        'user_agent'=>'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:21.0) Gecko/20100101 Firefox/21.0',
        'cookiePath' => './cookie.txt',
        'timeout' =>'300'  //设置超时,如果源站速度比较慢要设置大一些,否则会报错。
    ])->setQuery(['link' => [.item_list .img a','href','',function($content){
    //利用回调函数补全相对链接
    $baseUrl = 'http://www.shuaigetu.net';
    return $baseUrl.$content;
}]],'')->getData(function($data){
    return $data['link'];
});
?>

6、最终得到了一个url数组$urls,然后就可以使用数组里面的链接直接抓取内容详情页了,我们需要提取出详情页里面的标题、关键词、描述、图片和正文,这里面还涉及到图片分页的问题,下面将会给大家一步步的分析。

<?php
//多线程扩展
QueryList::run('Multi',[
    'list' => $urls,
    'curl' => [
        'opt' => array(
                    CURLOPT_SSL_VERIFYPEER => false,
                    CURLOPT_SSL_VERIFYHOST => false,
                    CURLOPT_FOLLOWLOCATION => true,
                    CURLOPT_AUTOREFERER => true,
                ),
        //设置线程数
        'maxThread' => 100,
        //设置最大尝试数
        'maxTry' => 3 
    ],
    'success' => function($a){
        //采集规则
        $reg = array(
            //采集文章标题
"title" => array("h1","text"),
"keywords" => array("meta[name=keywords]","content"),  //抓取页面关键词
"description" => array("meta[name=description]","content"),  //抓取页面描述
             //采集文章正文内容,利用过滤功能去掉文章中的超链接,但保留超链接的文字,并去掉版权、JS代码等无用信息
             'content' => array('.bodybox','html','a -.content_copyright -script',function($content){
                    //利用回调函数下载文章中的图片并替换图片路径为本地路径
                    //使用本例请确保当前目录下有image文件夹,并有写入权限
                    $doc = phpQuery::newDocumentHTML($content);
                    $imgs = pq($doc)->find('img');
                    foreach ($imgs as $img) {
                        $src = pq($img)->attr('src');
                        $localSrc = 'image/'.md5($src).'.jpg';
                        $stream = file_get_contents($src);
                        file_put_contents($localSrc,$stream);
                        pq($img)->attr('src',$localSrc);
                    }
                    return $doc->htmlOuter();
             }),
//抓取分页中的所有图片的src
"pics" => array(".img_box img","src","",function($url){

})
            );
        $rang = '.content';
        $ql = QueryList::Query($a['content'],$reg,$rang);
        $data = $ql->getData();
        print_r($data);
    }
]);

7、由于时间有限,今天就先说到这里,下次我们继续讲解如何抓取分页中的所有图片的src,如何循环抓取列表,如何把采集到的内容存入数据库等问题。


声明:转载请注明来源(好分享)并保留原文链接:http://www.hfx8.com/jishu-554.html
评论0

后面还有条评论,点击查看>>