Простой 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);