王小洁
(山西职业技术学院,山西 太原 030006)
PHP提供了多种数据采集方法,如使用snoopy、simple_html_dom、socket等,为人们采集网络数据提供了极大便利,文章阐述本人在实践中常用的几种方法[1]。
使用file_get_contents()函数进行数据采集首先需要确定要采集的网址,然后使用该函数对网页进行采集,接着对采集结果使用正则表达式对需要采集的数据进行精确匹配,最后输出采集结果。以抓取某网站的图片为例,代码框架如下:
$url="http://www.***.com";
$data=file_get_contents($url);
echo "
";print_r($arr);
上述代码描述中“***”是根据实际情况确定的网址及源代码中的类名等,后续代码中含义相同。
2 使用curl函数采集数据
curl函数功能比较强大,可以模拟get请求、post请求、文件上传等,是较好的数据采集工具。使用file_get_contents()函数进行数据采集前需要开启curl扩展。通过实践,得出比较完整的采集过程需要六个步骤,第一步初始化curl,即创建一个新的curl资源,第二步设置请求参数,如设置需要抓取的网址、数据以文件流的方式返回等,第三步发送请求,第四步结合正则表达式进行精确数据抓取,第五步输出抓取结果,第六步关闭请求,代码框架如下:
$ch=curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.***.com");
curl_setopt($ch,CURLOPT_RETURNTRANSFER,TRUE);
$data=curl_exec($ch);
preg_match_all('***',$data,$arr);
var_dump($arr);
curl_close($ch);
3 使用QueryList工具采集数据
目前QueryList 最新版本仅支持php7.0 以上,且仅支持composer安装。实际使用建议采用QueryList 3版本。安装QueryList前建议先下载composer,然后通过执行composer命令安装QueryList。
使用querylist方法进行数据采集,需要导入自动加载文件、导入QueryList类、制定采集规则、抓取数据、输出结果等步骤,以获取某网站title为例,代码可以参照下列代码框架进行编写:
include "***/autoload.php";
use QLQueryList;
$url="http://www.***.com";
$reg=array(
"title"=>array("title", 'text'),
);
$data=QueryList::Query($url,$reg)->data;
echo "
";print_r($data);
如想抓取网站某条新闻的标题、图片、描述信息等,只需更改规则,如做如下更改:
$reg=array(
"title"=>array("此处为某条信息标题的所在的类名、标签名",'html'),
"img"=>array("此处为新闻图片所在的类名、标签名",'src'),
"description"=>array("此处为新闻的描述信息所在的类名、标签名",'html'),
);
4 使用curl与 QueryList,二者结合起来采集数据
在此,以抓取某网站图片为例,阐述思路及代码框架,编程步骤如下:。
1)确定网址
$url="http://www.***.com/";
2)制定抓取规则
$reg=array(
"img"=>array("*** img",'src','','checkurl'),
);
此处checkurl为回调函数,目的是拼接完整域名。函数如下:
function checkurl($a){
return "http://www.***.com".$a;
}
3)采集数据
$data=Querylist::Query($url,$reg)->data;
4)下载图片
在执行程序之前,应在当前目录中建立imgdown文件夹,以保存下载的图片。
foreach($data as $key=>$value){
$file= $value['img'];
$newFile="./imgdown/".basename($file);
downImg($file,$newFile);
}
downImg为下载函数,该函数的功能使用curl函数来实现,通过创建资源、设置请求参数、发送请求、数据抓取,输出抓取结果、关闭请求等步骤实现了图片的下载功能,代码如下:
function downImg($file,$newFile){
$ch=curl_init();
curl_setopt($ch, CURLOPT_URL, $file);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$tmp=curl_exec($ch);
curl_close($ch);
file_put_contents($newFile, $tmp);
}
运行程序,可以在imgdown文件夹中看到下载的图片。
5 结语
上述三种数据采集方法各有特点,也因地制宜应用于不同的采集需求。一般来说,CURL 效率比file_get_contents 要高很多;CURL 支持的方式比较多,如支持get、post、文件上传等,而file_get_contents只支持get请求;CURL 的复杂程度高于file_get_contents。QueryList采用CSS选择器做采集,不需要复杂的正则表达式,能很容易就可以获取所需的内容,使代码易懂易维护,并且提供了丰富的多线程、图片下载等功能插件[2],还具备强大的DOM操作能力,是简洁高效的PHP数据采集工具。在实际采集过程中,三者可以结合使用,更好地达到采集目的。
猜你喜欢本刊网址变更通知 中华肩肘外科电子杂志(2021年2期)2021-11-30火眼金睛快速显示链接的网址 电脑爱好者(2019年5期)2019-10-30创世代码 动漫星空(2018年11期)2018-10-26创世代码 动漫星空(2018年2期)2018-10-26创世代码 动漫星空(2018年9期)2018-10-26创世代码 动漫星空(2018年5期)2018-10-26无惧标签 Alfa Romeo Giulia 200HP 车迷(2018年11期)2018-08-30不害怕撕掉标签的人,都活出了真正的漂亮 海峡姐妹(2018年3期)2018-05-09标签化伤害了谁 公民与法治(2016年10期)2016-05-17科学家的标签 少儿科学周刊·少年版(2015年2期)2015-07-07