web-dev-qa-db-ja.com

Pythonリクエストで、ブラウザと同じHTMLが得られない

Pythonリクエストを使用してWikiaページを取得しています。ただし、問題があります:リクエストリクエストが同じHTML私のブラウザはまったく同じページを持っているので。

比較のために、 Firefoxが私を取得するページはここにあります 、および ページはフェッチを要求します (表示するためにダウンロードします-申し訳ありません。別のサイト)。

いくつかの違いに注意してください( 超不親切な差分 )。順序が異なる属性など、いくつかの小さなものがありますが、非常に大きなものもいくつかあります。最も重要なのは、最後の6つの不足です<img>s、およびナビゲーションセクションとフッターセクション全体。未加工のHTMLでも、ページが突然途切れるように見えます。

なぜこれが起こっているのですか?それを修正する方法はありますか?私はすでにたくさんのことを考えましたが、どれも実りがありませんでした:

  • リクエストヘッダーが干渉していますか?いいえ、ブラウザが送信するヘッダーをコピーしてみましたが、User-Agentとすべて、リクエストリクエストに1:1で送信されますが、何も変更されません。
  • JavaScriptはHTMLが読み込まれた後にコンテンツを読み込みますか?いや。 JSを無効にしても、Firefoxは「良い」ページを表示します。
  • ええと...まあ...他に何ができるだろうか?

これが発生する可能性のある方法とそれを修正する方法を知っているとしたら、すばらしいと思います。ありがとうございました!

18
obskyr

私は同様の問題がありました:

  • Pythonを使用し、ブラウザを介したものと同じヘッダー
  • JavaScriptが原因として間違いなく除外されました

この問題を解決するために、私はrequestsライブラリをrllib.requestに交換しました。

基本的に、私は置き換えました:

import requests

session = requests.Session()
r = session.get(URL)

と:

import urllib.request

r = urllib.request.urlopen(URL)

そしてそれはうまくいった。

多分それらのライブラリの1つが舞台裏で何か奇妙なことをしていますか?それがあなたのためのオプションであるかどうかわからない。

5
rnhuneau

リクエストで適切なヘッダーを送信しない(または間違って送信する)ことをお勧めします。そのため、異なるコンテンツを取得しています。ヘッダー付きのHTTPリクエストの例を次に示します。

url = 'https://www.google.co.il/search?q=eminem+Twitter'
user_agent = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.101 Safari/537.36'

# header variable
headers = { 'User-Agent' : user_agent }

# creating request
req = urllib2.Request(url, None, headers)

# getting html
html = urllib2.urlopen(req).read()

正しいヘッダーを送信していることは確かだが、それでも別のhtmlを取得している場合。 Selenium を使用してみてください。ブラウザーで直接(または、マシンにGUIがない場合は phantomjs で)作業できます。 Seleniumを使用すると、ブラウザーから直接htmlを取得できます。

4
Alon Zilberman

リクエストとブラウザは、WEBサーバーから生データをレンダリングするために異なる方法を使用している可能性があります。上記の例の差分は、レンダリングされたhtmlのみを使用しています。

私はhtmlが壊れているとき、異なるブラウザ、例えばChromeおよびSafariでは、解析時にさまざまな方法で修正します。そのため、リクエストとFirefoxでも同じ考えです。

リクエストとFirefoxの両方から、生データ、つまりソケットのバイトストリームを比較することをお勧めします。リクエストでは、レスポンスオブジェクトの.rawプロパティを使用して、ソケットの生データを取得できます。 ( http://docs.python-requests.org/en/master/user/quickstart/ )両側からの生データが同じで、HTMLに壊れたコードがある場合、おそらくそれは壊れたhtmlを解析するときのリクエストとブラウザの自動修正ポリシーが異なるため。

0
Tony Li

私が目にする違いの多くは、コンテンツがまだそこにあることを示しています。それは、異なる順序で、時には異なる間隔でレンダリングされるだけです。

複数の異なるものに基づいて異なるコンテンツを受け取る可能性があります。

  • あなたのヘッダー
  • ユーザーエージェント
  • 時間!
  • 要素が並べ替えられていないデータソースからプルされる可能性があるため、ランダムな属性順序に従って、Webアプリケーションがページに要素をレンダリングすることを決定する順序。

ヘッダーのすべてをそのDiffの上部に含めることができれば、よりわかりやすくなる可能性があります。

アプリケーションが特定の画像をレンダリングしないことを選択したのではないかと思います。ある種のロボット/モバイルデバイス(Pythonリクエスト)であると考えられるものに対して最適化されていないためです。

差分を詳しく見てみると、-すべてが両方のリクエストでロードされ、フォーマットが異なっているようです。

0
Vasili Syrakis

ページをリクエストしているときに、同様の問題に直面していました。次に、使用しているURLの前に「http」を付加する必要があることに気付きましたが、「https」を付加していました。リクエストURLは https://example.com のようになりました。したがって、URLを http://example.com のようにします。問題が解決することを願っています。

0
Ranger