我已经在各种页面上运行我的简单dom脚本几周了,从来没有遇到过任何问题。现在,今天,当我尝试:
$html = file_get_html('http://www.sony.co.za/product/dsc-wx10');
我明白了:
( ! ) Warning: file_get_contents(http://www.sony.co.za/product/dsc-wx10)
[function.file-get-contents]: failed to open stream: HTTP request failed!
in C:\XXXXXXX\simplephpdom\simple_html_dom.php on line 70
当以下情况有效时,可能导致我无法成功输入上述代码:
$html = file_get_html('http://www.google.com');
$html = file_get_html('http://www.whatever.com');
我可以通过浏览器访问Sony页面。据我所知,上面的代码连接到端口80,就像我一样。所以我发现很难相信我被封锁了。而且,我在第1天被封锁了。
任何可能导致此问题的想法?
答案 0 :(得分:3)
该网站似乎永远延迟了包含PHP用户代理的请求。听起来像是一个非常真的跛脚的尝试来阻止抓取者。
解决方案很简单:使用curl发送请求并指定“普通”用户。
更新:显然它也会阻止空/缺少用户代理:
> nc www.sony.co.za 80
nc: using stream socket
GET / HTTP/1.0
Host: www.sony.co.za
User-Agent: Mozilla Firefox
HTTP/1.0 301 Moved Permanently
...
VS
> nc www.sony.co.za 80
nc: using stream socket
GET / HTTP/1.0
Host: www.sony.co.za
[no response]
答案 1 :(得分:1)
我可以看到您正在使用simple_html_dom
(http://simplehtmldom.sourceforge.net/)...而不是使用file_get_html
,您可以str_get_html
使用curl
include 'simple_html_dom.php';
$url="http://www.sony.co.za/product/dsc-wx10";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 2);
curl_setopt($ch, CURLOPT_TIMEOUT, 60);
curl_setopt ($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.9) Gecko/20071025 Firefox/2.0.0.9");
$exec = curl_exec ($ch);
$html = str_get_html($exec);
var_dump($html);
答案 2 :(得分:1)
您需要设置用户代理(标题),然后才能运行:
$options = array(
'http' => array(
'user_agent' => 'Mozilla Firefox'
)
);
$context = stream_context_create($options);
$url = 'http://www.sony.co.za/product/dsc-wx10';
$str = file_get_contents($url, 0, $context);
$html = str_get_html($str);
简单的HTML DOM在这里需要你为它做的工作(从远程服务器加载字符串),我通常会说你应该使用DOMDocument
而不是那个“简单的”HTML DOM库,因为它更好集成且功能更强大(实际上有效):
$options = array(
'http' => array(
'user_agent' => 'Mozilla Firefox'
)
);
$context = stream_context_create($options);
libxml_set_streams_context($context);
$url = 'http://www.sony.co.za/product/dsc-wx10';
$doc = DOMDocument::loadHTMLFile($url);