PHP 实现采集网站数据的方法总结

在一些企业网站的应用中,一些企业可能没有时间去管理自己的网站,定时发布一些相关的新闻资讯到网站中,这时候就需要程序自动去网络上抓取一下自己企业相关的新闻和行业资讯到自己的网站中,这里就需要用到PHP的数据抓取技术,术语称为数据采集。

W3CAPI
1
2020-04-24 22:25:16
文档目录
我的书签
 

什么是数据采集?

要想知道数据采集的定义,还是我们一贯的逻辑就是需要知道为什么需要采集?我们在文档描述中也提到了针对为什么需要采集的说明,更简单的语言说明:就是我们可能没时间发布内容,而我们又不想自己的网站空空如也,那么我们就需要抓取别的网站的数据到自己的网站中。

PHP 使用socket技术实现数据采集

PHP中的socket扩展模块,是基于对计算机网络技术网络层和传输层的实现,使用socket来实现采集是在网络层面上来说最底层的实现方式,它只是建立了一个长连接(TCP连接),然后我们要自己构造 http协议的请规则去实现数据的获取。例如:要想获取这个页面的内容,http://www.w3capi.com/cms/column/id/4.html,用socket实现代码如下:
function collect_by_url($domain,$url) {
    //连接,$error错误编号,$errstr错误的字符串,30s是连接超时时间
    $fp = fsockopen($domain, 80, $errno, $errstr, 30);
    if (!$fp) die("连接失败" . $errstr);

    //因为socket是网路偏底层协议实现,这里需要构造http协议的请求头(http协议属于网络应用层协议,有自己规定的请求和响应格式)
    $http = "GET ".$url." HTTP/1.1\r\n";   //  \r\n表示前面的是一个命令
    $http .= "Host:".$domain."\r\n";  //请求的主机
    $http .= "Connection:close\r\n\r\n";   // 连接关闭,最后一行要两个\r\n

    //发送这个字符串到服务器
    fwrite($fp, $http, strlen($http));
    //接收服务器返回的数据
    $data = '';
    while (!feof($fp)) {
        $data .= fread($fp, 4096);  //fread读取返回的数据,一次读取4096字节
    }
    //关闭连接
    fclose($fp);
    return $data;
}

$domain = "www.w3capi.com";
$url = "/cms/column/id/4.html";
var_dump(collect_by_url($domain,$url));
返回结果如下所示,这也是 http 协议规定的响应内容格式,其中包含了我们请求的页面的源码数据:

PHP 使用curl技术实现数据采集

cURL(command url)是一种在命令行下使用URL语法 工作的文件传输工具,1997年首次发行。它支持文件上传和下载,所以是综合传输工具,但按传统,习惯称cURL为下载工具。cURL还包含了用于程序开发的libcurl;cURL支持的通信协议有FTP、FTPS、HTTP、HTTPS、TFTP、SFTP、Gopher、SCP、Telnet、DICT、FILE、LDAP、LDAPS、IMAP、POP3、SMTP和RTSP等。
在PHP中,cURL扩展把HTTP协议的实现都封装为函数,直接调用并传入相应参数即可,降低了自己编写HTTP协议请求规则的难度,但是需要在PHP中开启cURL扩展,使用cURL采集数据的代码如下:
function collect_by_url($url) {
    //生成一个curl对象
    $curl=curl_init();
    //设置URL和相应的选项
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);  //将curl_exec()获取的信息以字符串返回,而不是直接输出。
    //执行curl操作
    $data=curl_exec($curl);
    return $data;
}

$url = "http://www.w3capi.com/cms/column/id/4.html";
var_dump( collect_by_url($url) );
返回结果如下所示,可以看到cURL函数已经将 http 协议规定的响应内容头格式去掉了,只剩下页面中的源码数据:
​​​​​​​

PHP 使用file_get_contents函数实现数据采集

file_get_contents函数可以直接打开一个给定的URL地址,但是需要在php.ini的中进行配置:在php.ini中搜索allow_url_fopen,然后设置allow_url_fopen=On 即可,实现代码如下:
function collect_by_url($url) {
    //使用file_get_contents()
    $data=file_get_contents($url);
    return $data;
}

$url = "http://www.w3capi.com/cms/column/id/4.html";
var_dump( collect_by_url($url) );
返回结果和使用cURL一样,看来它也对http协议请求进行了内容处理的封装。

PHP 使用第三方类库(QueryList、phpQuery)实现数据采集

自己要实现数据采集的工具类,虽然不是太难,但是可能实现的不会那么的方便和完善;针对数据采集的开源类库已经存在很多,我们可以直接拿过来借鉴和使用,有一些设计的很完善,使用起来非常方便快捷,如下几种是比较流行的PHP采集类库:

一、phpQuery

phpQuery是一个基于PHP服务端的数据采集开源项目,它可以让PHP开发人员轻松处理DOM文档内容,比如获取某新闻网站的头条信息。更有意思的是,它采用了jQuery的思想,你可以像使用jQuery一样处理页面内容,获取你想要的页面信息。
项目官方地址:http://code.google.com/p/phpquery/

二、QueryList

QueryList是一套基于phpQuery,具有简洁、优雅、可扩展等特色的PHP采集工具(爬虫),相比传统的使用晦涩的正则表达式来做采集,QueryList使用了更加强大而优雅的CSS选择器来做采集,大大降低了PHP做采集的门槛,同时也让采集代码易读易维护,让你从此告别晦涩难懂且不易维护的正则表达式。
项目官方地址:https://querylist.cc/
友情提示