我试图通过过滤其源代码来获取网页上的一些数据,我找到了很多方法来抓取网页的html内容,例如$html = file_get_html('http://www.exam.com/results/');
, curl , html获取源。
获取页面的html源代码的最佳方法是什么?或者所有这些方法都相同?
答案 0 :(得分:2)
cURL可能提供比file_get_contents($url)
*****更好的表现。
我宁愿使用cURL,因为所有这些函数最终都会检索某个网页内容,唯一的区别就是运行时,正如我所说的那样,使用cURL时更好。
*你可以在这里找到一个体面的(但不是正式的)证据,包括基准: https://stackoverflow.com/questions/555523/file-get-contents-vs-curl-what-has-better-performance
答案 1 :(得分:2)
这取决于您的需求,但请务必记住,curl
会将回复作为文字返回,file_get_html
将返回Simple_HTML_DOM
。另外,我认为重要的是要注意file_get_html
调用file_get_contents
。
就个人而言,我有一种温和的偏好首先将数据加载到内存中(我发现它更容易调试),但我通常不喜欢使用curl_*
,除非我需要发送某些带有请求的标头( POST变量或WWW-Auth
标题等)。对于其他一切,我发现它将一行函数调用变为热点。所以我通常依赖file_get_contents
。
对于Simple_HTML_DOM
,我想知道它是否可能比PHP本机编译库更快。您可以使用simplexml_load_file
或DomDocument::loadHTMLFile
。
答案 2 :(得分:1)
cURL提供了更多控制,正如@itamar建议的那样。它允许您使用file_get_contents设置一些无法设置的内容,包括:
它还允许您检索标题。
cURL的使用相当复杂,但收益相当不错。建议是将它包装在一个函数中。我倾向于使用这个:
protected static function prepare_channel(Request $r) {
$r->channel = curl_init();
$p = array();
foreach ($r->GET as $k => $v) {
$p[] = $k."=".$v;
}
$head = array();
foreach ($r->getHeaders() as $k => $v) {
$head[] = $k.": ".$v;
}
curl_setopt($r->channel, CURLOPT_URL, $r->getURI()."?".implode("&",$p));
curl_setopt($r->channel, CURLOPT_HTTPHEADER, $head);
curl_setopt($r->channel, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($r->channel, CURLOPT_FORBID_REUSE, true);
curl_setopt($r->channel, CURLOPT_RETURNTRANSFER, true);
if (Request::getProxy()) {
curl_setopt($r->channel, CURLOPT_PROXY, Request::getProxy());
}
curl_setopt($r->channel, CURLOPT_HEADER, true);
return $r->channel;
}
这是实时代码,我的Request
对象具有以下签名:
protected $headers = array();
protected $baseURI = "";
public $GET = array();
public $POST = array();
运行$result = curl_exec($r->channel);
会返回标题和正文。然后你可以用它来分割它们:
$header_size = curl_getinfo($r->channel, CURLINFO_HEADER_SIZE);
$headers = substr($result, 0, $header_size);
$body = substr($result, $header_size);
从那里,您可以$header
和$body
自由地做任何您喜欢的事情。您还可以通过运行curl_getinfo($ r->频道)获得大量信息。
要在PHP中解析HTML,最好先做两件事:
tidy
松散以清除格式错误的标记DOMDocument
解析它。答案 3 :(得分:1)
出于很多目的,file_get_contents()就足够了。但是在很多情况下,您需要特殊要求。
使用PHP Stream上下文:如果没有可用的curl且您必须在请求中放置POST数据,则可以使用
卷曲:用于获取HTTP内容的瑞士军刀通常效果最佳。如果可能的话,有一个特殊情况你应该使用curl:如果你获取一个远程页面你自己的请求被阻止。在这种情况下,您将依赖于远程站点的性能。如果您使用的Apache2等网络服务器的插槽数量有限,则如果远程站点太慢或无法访问,它们可能会填满。我遇到过像这样的情况下的服务器故障。 Curl通过为请求设置超时来帮助您。最好把它设置为3秒钟。
但最好的方法是使用cronjob或类似内容获取外部内容,缓存它并使用缓存版本。