1

簡単な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日目からブロックされました。

これを引き起こしている可能性のあるアイデアはありますか?

4

3 に答える 3

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]
于 2012-04-17T08:05:15.827 に答える
1

simple_html_dom( http://simplehtmldom.sourceforge.net/ )を使用していることがわかります...使用する代わりに、で使用file_get_htmlできますstr_get_htmlcurl

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);
于 2012-04-17T08:37:58.147 に答える
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 では、ここで作業を行う必要があります (リモート サーバーから文字列をロードする)。一般的には、その「単純な」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);
于 2012-04-17T09:19:15.850 に答える