简单的DOM和Sony.co.za?

时间:2012-04-17 08:01:09

标签: php simpledom

我已经在各种页面上运行我的简单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天被封锁了。

任何可能导致此问题的想法?

3 个答案:

答案 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_domhttp://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);