PHP-file_get_contents 抓取页面时内容不全
$content=@file_get_contents($url);
抓取其他站点的页面内容 。但是经常因为对方网站打开速度慢而内容不完整,怎么解决或者知道抓取的信息不全时提示报错;或者其他抓取网页内容的好的方法
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
使用curl是种好方法,在使用file_get_contents函数的时候,经常会出现超时的情况,而且file_get_contents常常会使服务器的负载很高!
取不全很多情况下是由于超时,一般服务端和客户端都会有超时设置。是否抓全可以看http head里的content length和实际抓到的是否一样。
提供一个别人写的抓取类:
<?php
/*
* Curl 多线程类
* 使用方法:
* ========================
$urls = array("http://baidu.com", "http://www.sina.com.cn");
$mp = new MultiHttpRequest($urls);
$mp->start();
* ========================
*/
$urls = array("http://www.sina.com.cn");
$mp = new MultiHttpRequest($urls);
$mp->start();
class MultiHttpRequest {
public $urls = array();
public $curlopt_header = 1;
public $method = "GET";
function __construct($urls = false) {
$this->urls = $urls;
}
function set_urls($urls) {
$this->urls = $urls;
return $this;
}
function is_return_header($b) {
$this->curlopt_header = $b;
return $this;
}
function set_method($m) {
$this->medthod = strtoupper($m);
return $this;
}
function start() {
if(!is_array($this->urls) or count($this->urls) == 0){
return false;
}
$curl = $text = array();
$handle = curl_multi_init();
foreach($this->urls as $k=>$v){
$curl[$k] = $this->add_handle($handle, $v);
}
$this->exec_handle($handle);
foreach($this->urls as $k=>$v){
curl_multi_getcontent($curl[$k]);
$text[$k] = curl_multi_getcontent($curl[$k]);
echo $text[$k], "nn";
curl_multi_remove_handle($handle, $curl[$k]);
}
curl_multi_close($handle);
}
private function add_handle($handle, $url) {
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_HEADER, $this->curlopt_header);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_multi_add_handle($handle, $curl);
return $curl;
}
private function exec_handle($handle) {
$flag = null;
do {
curl_multi_exec($handle, $flag);
} while ($flag > 0);
}
}
?>
先得判断要抓取的页面能不能正常打开,如果可以打开,只是速度慢,那就很好办了。在抓取前设置一下超时时间为无限就可以了。set_time_limit(0);