php curl 爬取网站数据
转载:http://vohyo.com/blog/view/4dae71f795248a52/
今天帮一朋友爬取一网站数据,涉及到PHP CURL模块的使用。总结一下整个过程思路:
1.保证curl扩展模块可用,如不可用,请在php.ini配置中打开php_curl.dll扩展;
2.初始化curl对象,并配置curl的参数:
$ch = curl_init();
// 有部分web服务验证了HTTP头,该参数表示使用当前浏览器HTTP;
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
curl_setopt($ch, CURLOPT_HEADER, 0); // 不输出header头
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 100); // 超时设置
3.保存或传替cookie,因为web服务可能检查了session或cookie,在这种情况下我们需要发送cookie信息:
// 设置cookie,格式为cookiename1 = cookievalue1; cookiename2 = cookievalue2; ……
curl_setopt($ch, CURLOPT_COOKIE, $cookie);
或者把该web的cookie保存成文件,自动传递
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiepath); // 保存cookie文件
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiepath); // 从文件传递cookie
4.伪造引用信息,因为web服务可能检查了引用信息,非对应域名的不能通过验证,那么我们可以伪造referer引用信息:
curl_setopt($ch, CURLOPT_REFERER, $referer);
5.如果POST数据,那么应设置提交的数据
curl_setopt($ch, CURLOPT_POST, 1);
// 数据的格式为var1=value1&var2=value2……
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
6.获取结果,关闭curl:
$rs = curl_exec($ch);
curl_close($ch);
7.处理数据,数据爬下来后,我们使用正则表达式进行匹配处理,获取需要的数据:
preg_match_all($pattern, $rs, $matchs);
这里写了一个通过的函数,大家可以参考:
function curl($url, $data = null, $cookie = null, $referer = null) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 100);
if ($data != null) {
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS,
(is_array($data) ? paramArray($data) : $data));
}
if ($cookie != null) {
if (strpos($cookie, '=')) { // cookie字串
curl_setopt($ch, CURLOPT_COOKIE, $cookie);
} else { // cookie文件
// 保存cookie文件
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie);
// 从文件传递cookie
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie);
}
}
if ($referer === null) {
curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
} else {
curl_setopt($ch, CURLOPT_REFERER, $referer);
}
$content = curl_exec($ch);
curl_close($ch);
return $content;
}
function paramArray($data) {
$param = '';
foreach ($data as $k => $v) {
$param .= "&$k=" . urlencode($v);
}
return substr($param, 1);
}