Простой DOM и Sony.co.za?

Я несколько недель запускал свой простой скрипт на разных страницах, и никогда не сталкивался с какими-либо проблемами. Теперь, сегодня, когда я пытаюсь:

$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, как и я. Поэтому мне трудно поверить, что меня заблокировали. А также, я был заблокирован с первого дня.

Есть идеи, что может быть причиной этого?

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
...

против

> nc www.sony.co.za 80
nc: using stream socket
GET / HTTP/1.0
Host: www.sony.co.za
[no response]

Вам нужно установить user-agent (заголовок), тогда он будет работать:

$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);

Я вижу, что вы используете 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);
Другие вопросы по тегам