抓取网页内容,PHP内置了几个函数都可以实现,如file()、file_get_contents()等都支持URL参数。但要实现更复杂的操作,这些函数就无能为力了。
cURL是一个利用URL语法在命令行下工作的文件传输工具,cURL提供了一个PHP扩展,使用该扩展,可以完完全全地模拟浏览器操作,就像使用浏览器浏览一个网页一样,可以设置header内容、设置COOKIE数据、POST数据、上传文件、设置代理等。其实我们这里讨论的抓取网页内容,只是它的一个常用的应用罢了。
cURL官方网站:http://curl.haxx.se/
PHP cURL扩展:http://curl.haxx.se/libcurl/php/
Windows下添加该扩展很简单,只要载入php_curl.dll即可。去掉php.ini文件extension=php_curl.dll前面的分号,将php_curl.dll拷入PHP扩展目录或C:\Windows\system32目录下重启Web服务器即可。php_curl.dll在PHP的ZIP包中提供。
Linux下需要先安装cURL,一个方法是将其编译进PHP,编译配置时候加上–with-curl[=DIR],另一个方法是编译成PHP模块载入,编译cURL模块方法和编译其它PHP模块方法雷同,以下是基本的命令:
cd /path/to/php/source 进入PHP源码目录
cd ext/curl 进入cURL模块源码目录
/usr/local/php/bin/phpize 生成编译配置文件
./configure –with-php-config=/usr/local/php/bin/php-config
make
make install
编译完成生成curl.so,修改php.ini,将该模块载入:
extension=”/path/to/extension/curl.so”
测试cURL扩展是否载入,新建PHP文件:
<?php if(extension_loaded('curl')) { echo 'cURL模块已载入!'; } else { echo 'cURL模块未载入!'; } ?>
抓取网页的例子:
<?php // 抓取网页URL $url = 'http://www.baidu.com'; // 初始化,返回一个handler $ch = curl_init($url); // 设置选项,有返回值 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 设置选项,来源页,这意味着可以伪造referer达到某种目的 curl_setopt($ch, CURLOPT_REFERER, 'http://www.google.cn/'); // 设置选项,浏览器信息 curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322)'); // 执行 $raw = curl_exec($ch);curl_close($ch); // 关闭handler // 输出结果 echo $raw; ?>
curl_setopt()可设置很多选项,更多选项请参考PHP手册。
更多函数及其用法请参考PHP手册(再次废话一句,以强调PHP手册真乃圣经也)。
2010-12-06更新
============
当前移动互联网高速发展,很多门户网站都开发了手机网站,如腾讯(http://3g.qq.com/)、新浪(http://3g.sina.com/)、网易(http://wap.163.com/)、搜狐(http://wap.sohu.com/),一般手机网站都会对浏览器的User Agent做检测,以作相应的适配。但User Agent不是很靠谱的,因为它是从客户端向服务器发出的,我们可以通过各种方式来伪造User Agent,Firefox有一款插件User Agent Switcher(http://chrispederick.com/work/user-agent-switcher/)(该主页国内可能访问不到,需翻墙)即是这样的工具。当然,本文中讨论的cURL也可以完成这样的事情。开发过程中我们有可能需要伪造User Agent,以下列出的为几款主流平台智能手机自带浏览器的User Agent。
NOKIA E71(S60 第三版):
Mozilla/5.0 (SymbianOS/9.2; U; Series60/3.1 NokiaE71/1.00.000; Profile/MIDP-2.0 Configuration/CLDC-1.1;) AppleWebKit/413 (KHTML, like Gecko) Safari/413
HTC Desire(Android 2.1/2.2):
Mozilla/5.0 (Linux; U; Android 2.1-update1; zh-cn; Desire_A8181 Build/ERE27) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17
iPhone 3GS(iOS 3):
Mozilla/5.0 (iPhone; U; CPU iPhone OS 3_0 like Mac OS X; zh-cn) AppleWebKit/420.1 (KHTML, like Gecko) Version/3.0 Mobile/1A542a Safari/419.3
BlackBerry 8700(BlackBerry):
BlackBerry8700/4.1.0 Profile/MIDP-2.0 Configuration/CLDC-1.1 VendorID/100