我居然能用爬虫抓数据了,继正则之后又迈过一道坎。
使用PHP Simple HTML DOM Parser这个库,然后自己对DOM选择器做一下二次封装,基本上可以应付一部分WordPress站点。
引入PHP Simple HTML DOM Parser这个库,然后使用file_get_html()抓取目标网址后,就能像操作jQuery一样来抓取我们需要的东西了。
由于内网网络不通缘故,我使用爬虫的时候,给PHP配置了代理。正常网络环境, file_get_html($url) 即可,不需要后面两个参数。
<?php
require('./simple_html_dom.php');
$proxy = stream_context_create(array(
'http' => array(
'timeout' => 5,
'proxy' => 'tcp://proxy.domain.com:8080',
'request_fulluri' => True,
)
));
$targetHTML = file_get_html($targetURL, false, $proxy);
echo($targetHTML->find('title')->plaintext);
?>
根据WordPress的分页规则,判断是否有下一页。
注意整站抓取的时候,需要修改PHP最大执行时间,使其可以长时间执行。
<?php
ini_set('max_execution_time',0);
?>
整站抓取的时候,由于时间很长,未避免中途脚本出错,导致的重新执行整个爬取流程,可以对每个URL的抓取结果,进行Cache。
为了我中途检查和后续处理方便,我直接把抓取结果保存成CSV格式,以爬虫的URL为单位。
<?php
/**
* 爬回来的数据,按URL缓存成CSV文件
* @param $filename
* @param $array
*/
public function cache($filename, $array){
$filename = explode('//',$filename)[1];
$filename = str_replace('.','_',$filename);
$filename = str_replace('/','_',$filename);
$filename = './data/'.$filename.'.csv';
$fp = fopen($filename, 'w');
foreach ($array as $fields) {
fputcsv($fp, $fields);
}
fclose($fp);
}
?>
抓一个页面容易,但是整站抓取,很容易被反爬虫策略给挡在外面。一个好的爬虫,功夫都在策略的应对上面。
这次是以PHP-CLI的形式写的,中途出错只能重新执行(浏览器输入URL或者重新执行PHP-CLI),不稳定。
下次看看怎么改成以进程的形式执行,这样就不怕长时间执行出问题了。