PHP-file_get_contents 抓取页面时内容不全

发布于 2016-11-13 23:00:52 字数 119 浏览 1523 评论 3

$content=@file_get_contents($url);
抓取其他站点的页面内容 。但是经常因为对方网站打开速度慢而内容不完整,怎么解决或者知道抓取的信息不全时提示报错;或者其他抓取网页内容的好的方法

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

虐人心 2017-08-23 09:55:57

使用curl是种好方法,在使用file_get_contents函数的时候,经常会出现超时的情况,而且file_get_contents常常会使服务器的负载很高!

灵芸 2017-07-22 16:51:26

取不全很多情况下是由于超时,一般服务端和客户端都会有超时设置。是否抓全可以看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);
}
}
?>

归属感 2017-04-25 07:04:40

先得判断要抓取的页面能不能正常打开,如果可以打开,只是速度慢,那就很好办了。在抓取前设置一下超时时间为无限就可以了。set_time_limit(0);

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文