スクレイピングで別のウェブページを取得する
1 つの仮定を行う必要があります。同じ入力が与えられた場合、Web サーバーは同じ出力を返します。この仮定では、同じ入力を与えていないという結論に必然的に到達します。このシナリオには 2 つのブラウザ、つまり http クライアントがあります。必要な結果が得られるブラウザ (例: Firefox、IE、Chrome、または Safari) と、必要な結果が得られないブラウザ(例: 、LWP、wget、または cURL)。
最初に簡単な可能性を殺してください
その前に、最初に単純な UserAgent が同じであることを確認します。これを行うには、whatsmyuseragent.comを参照し、他のブラウザーのヘッダーにある UserAgent 文字列をその Web サイトが返すものに設定します。Firefox のWeb Developer's Toolbarを使用して、CSS、JavaScript、Java、およびメタリダイレクトを無効にすることもできます。これは、本当に単純なものを削除することで問題を追跡するのに役立ちます。
動作中のブラウザの複製を試みます
Firefox では、FireBugを使用して送信されたメッセージを分析できますREQUEST
。FireBugのタブの下でこれを行うことができますNET
。さまざまなブラウザーには、FireBug が FireFox で行うことを実行できるツールが必要です。ただし、問題のツールがわからない場合でも、以下で説明するようにtsharkまたはwiresharkを使用できます。tsharkとwiresharkは、少なくとも私の経験ではエラーの余地が少ない低レベルで動作するため、常により正確であることに注意することが重要です。たとえば、ブラウザが実行しているメタ リダイレクトのようなものが表示されますが、これは FireBug が追跡できなくなることがあります。
機能する最初の Web 要求を理解したら、2 番目の Web 要求を最初の Web 要求に設定するために最善を尽くします。これは、リクエスト ヘッダーとその他のリクエスト要素を適切に設定することを意味します。これでもうまくいかない場合は、2 番目のブラウザが何をしているのかを知る必要があります。
トラブルシューティング
これをトラブルシューティングするには、両方のブラウザからのリクエストを完全に理解する必要があります。2 番目のブラウザーは、通常はトリッキーです。これらは、多くの場合、ライブラリーや非対話型のコマンド ライン ブラウザーであり、要求をチェックする機能がありません。彼らがリクエストをダンプする能力を持っている場合でも、とにかく単にそれらをチェックすることを選ぶかもしれません. これを行うには、wireshark と tshark スイートをお勧めします。これらはブラウザの下で動作するため、すぐに警告する必要があります。デフォルトでは、実際のネットワーク (IP) パケットとデータリンク フレームが表示されます。このようなコマンドを使用して、特に必要なものを除外できます。
sudo tshark -i <interface> -f tcp -R "http.request" -V |
perl -ne'print if /^Hypertext/../^Frame/'
これにより、すべての TCP パケットがキャプチャされ、 のみが表示フィルター処理さhttp.requests
れ、次にレイヤー 4 HTTP のもののみが perl フィルター処理されます。表示フィルターに追加して、単一の Web サーバーのみを取得することもできます-R "http.request and http.host == ''"
2 つのリクエストが一致しているかどうか、Cookie、GET URL、ユーザー エージェントなど、すべてをチェックする必要があります。サイトが何か間抜けなことをしていないことを確認してください。
2010 年 1 月 23 日更新: 新しい情報に基づいて、Accept
、およびAccept-Language
、Accept-Charset
およびを設定することをお勧めしますAccept-Encoding
。through でそれを行うことができます$ua->default_headers()
。ユーザーエージェントにもっと多くの機能が必要な場合は、いつでもサブクラス化できます。私は GData API でこのアプローチを採用しました。github でUserAgent サブクラスの例を見つけることができます。