phpspider使用后感

大兄弟 2018年11月18日0   270

这个工具是网上很有名的帖子《我用爬虫一天时间“偷了”知乎一百万用户,只为证明PHP是世界上最好的语言 》所使用的程序,✈https://github.com/owner888/phpspider

很久以前就下载了这个工具,一直没有机会去研究,昨天就花了点时间去用了一下。

为了证明它的可用性,我首先运行了demo里面的文件,经测试只有qiushibaike.php是可用的,但是采集不到数据,后来发现糗事百科改成https协议了,所以把文件的配置地址全部改为https就能正常采集了,经过短短十几分钟的采集就得到了数千条数据,所以作者帖子中一百万的数字并不夸张。

接下来我就进行了自己编写一个采集配置,进行新的网站数据采集,我的目标网站是一个论坛网站hu60.cn,因为这种类型的网站是相对比较容易分析的。

经过观察,hu60有一个非常有趣的页面,那就是论坛新帖页面,我猜测这里列出的帖子是论坛中的所有帖子,所以目标就很明确了。接下来来编写配置文件:

    'domains' => array(
        'hu60.cn',
        'www.hu60.cn'
    ),
    'scan_urls'=>array(
        'https://hu60.cn/q.php/bbs.forum.0.1.html',// 采集扫描地址
    ),
    'list_url_regexes' => array(
        "https://hu60.cn/q.php/bbs.forum.0.\d+.html", // 列表页泛地址
    ),
    'content_url_regexes' => array(
        "https://hu60.cn/q.php/bbs.topic\.\d+?\.html",// 内容页泛地址
    ),

这是基础配置项,主要是告知程序我们要到哪里采集,正如你所见,列表页和内容页的地址都是含有正则表达式,主要用于获取扫描页的所有符合采集规则的url地址。

接下来配置一下采集规则。由于这个工具使用了XPath和CSS选择器等第三方工具支持,所以需要学习一点里面的基础:XPath选择器教程CSS选择器教程。当然,你如果不想学这些新技能的话,也可以使用正则表达式进行编写采集规则。说实话,我也是接触这个工具之后才知道这两个选择器工具的,很棒的工具。

由于有三个相关的地址,所以一开始没搞清楚这个采集规则到底是用于哪个页面下的,后来通过core/phpspider.php了解到原来采集规则是主要用于内容页的,当然,三个地址都可以匹配采集。使用chrom内核的浏览器开发者工具可以直接复制对应元素的XPath规则,所以得到采集规则:

    'fields' => array(
        array(
            'name'=>'title',
            'selector'=>'//div[@class="topic"]/h1',
            'required'=>true,
        ),
        array(
            'name'=>'content',
            'selector'=>'//div[@class="topic-content"]',
            'required'=>true,
        ),
        array(
            'name'=>'author',
            'selector'=>'//div[@class="topic-meta"]/div[@class="topic-meta-name"]/a[@class="topic-author"]/text()',
            'required'=>true,
        ),
        array(
            'name'=>'time',
            'selector'=>'//div[@class="topic-meta"]/div[@class="topic-actions"]/text()[2]',
            'required'=>true,
        ),
    ),

最后是采集的数据存储问题,我使用的是mysql存储:

    'export' => array(
        'type' => 'db',
        'table' => 'hu60_content',
    ),
    'db_config' => array(
        'host'  => '127.0.0.1',
        'port'  => 3306,
        'user'  => 'root',
        'pass'  => 'root',
        'name'  => 'qiushibaike',
    ),

当然可选的可以有csv、sql、db,我建议使用db,因为使用数据库管理软件管理起来很方便,也方便测试。

由于时间原因,其他的功能如多任务、服务器集群等功能没有测试,测试前建议安装redis扩展。


最后,这个工具还是很厉害的,内置了很多回调方法,使用起来很自由,也可以使用这些回调方法实现很多复杂的采集。但是测试过程中我发现这个工具并不能很好地支持PATHINFO,怎么说呢,就比如这个hu60.cn,开发者写的地址是一个相对地址,也就是说地址里并没有包含入口文件,而phpspider在合成url时不能识别pathinfo的入口文件,所以生成得到的地址就会变为https:///bbs.forum.0.1.htm,会导致list_url_regexes、content_url_regexes这些配置不能生效。当然作者也已经考虑到开发者会遇到不可预知的bug,所以预留了on_fetch_url方法,开发者可以利用该方法进行修复系统合成的地址。测试网站的修复函数:

$spider->on_fetch_url = function ($url){
    $url = str_replace('https://','https://hu60.cn/q.php',$url);
    return $url;
};
// 这是一个很简单的修复方法,并不能适应相对复杂的环境。