Pythonリクエストを使用してブラウザに偽装する方法は?


126

以下のサイトからコンテンツを入手したい。FirefoxやChromeなどのブラウザを使用すると、希望する実際のWebサイトページを取得できますが、Pythonリクエストパッケージ(またはwgetコマンド)を使用して取得すると、まったく異なるHTMLページが返されます。私はウェブサイトの開発者がこれのためにいくつかのブロックを作ったと思ったので、問題は:

Pythonリクエストまたはコマンドwgetを使用して、ブラウザーの訪問を偽装するにはどうすればよいですか?

http://www.ichangtou.com/#company:data_000008.html

回答:


281

User-Agentヘッダーを提供:

import requests

url = 'http://www.ichangtou.com/#company:data_000008.html'
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36'}

response = requests.get(url, headers=headers)
print(response.content)

参考までに、さまざまなブラウザのユーザーエージェント文字列のリストを次に示します。


補足として、ユーザーエージェントより優れた抽象化レイヤーを提供するfake-useragentと呼ばれる非常に便利なサードパーティパッケージがあります。

偽ユーザーエージェント

実世界のデータベースを備えた最新のシンプルなユーザーエージェント

デモ:

>>> from fake_useragent import UserAgent
>>> ua = UserAgent()
>>> ua.chrome
u'Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1667.0 Safari/537.36'
>>> ua.random
u'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.67 Safari/537.36'

1
回答ありがとうございます。リクエストのヘッダーを試してみましたが、ページの実際のコンテンツを取得できませんでした。「このアプリケーションを正しく表示するには、WebブラウザでJavaScriptを有効にする必要があります。」という文字列があります。返されたhtmlページで、リクエストにJavaスクリプトサポートを追加する必要がありますか?もしそうなら、どうすればいいですか?
user1726366 2014

8
@ user1726366:JavaScriptサポートを単純に追加することはできません-そのためにはJavaScriptインタープリターが必要です。最も簡単な方法は、実際のWebブラウザーのJavaScriptインタープリターを使用することですが、Seleniumを使用してPythonから自動化できます。
PM 2Ring 2014

1
@ alecxe、@ sputnick:私はpythonリクエストとブラウザを使用した場合との違いを比較するためにWiresharkでパケットをキャプチャしようとしましたが、ウェブサイトのURLは静的ではなく、ページのレンダリングが完了するのを待つ必要があるため、Seleniumが鳴ります私に最適なツール。よろしくお願いします。:)
user1726366 2014

4
@ user1726366ええ、実際のブラウザとセレンを使用することがニーズに合う場合は、これが最も簡単な方法です。PhantomJSセレンではヘッドレスブラウザを使用できることに注意してください。ありがとう。(役に立った場合は、回答を受け入れることを忘れないでください)
alecxe

30

この質問がまだ有効かどうか

偽のUserAgentを使用しました

使い方:

from fake_useragent import UserAgent
import requests


ua = UserAgent()
print(ua.chrome)
header = {'User-Agent':str(ua.chrome)}
print(header)
url = "https://www.hybrid-analysis.com/recent-submissions?filter=file&sort=^timestamp"
htmlContent = requests.get(url, headers=header)
print(htmlContent)

出力:

Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1309.0 Safari/537.17
{'User-Agent': 'Mozilla/5.0 (X11; OpenBSD i386) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36'}
<Response [200]>

それでもエラー404が発生する
Maksim Kniazev

1
404は別のエラーです。ブラウザを使用してページを閲覧できますか?
Umesh Kaushik

もちろんです。使用しようとしているWebサイトがすべてのAmazon EC2 IPをブロックしているように感じます。
マクシムクニアゼフ2018年

ここのリンクにpingしてください。私は私の終わりに試すことができます。さらに、IPがブロックされている場合、エラーコードは403(禁止)または401(無許可)になります。スクレイピングをまったく許可しないWebサイトがあります。さらに多くのWebサイトは、ボットがWebサイトにアクセスするのを避けるためにcloudflareを使用しています。
Umesh Kaushik

これが私のリンクregalbloodline.com/music/eminemです。以前は問題なく動作しました。Python 2での動作を停止しました。ローカルマシンのPython 3で動作しました。AWS EC2への移行はそこで機能しませんでした。エラー404が発生し続けました。その後、ローカルマシンでの作業も停止しました。ブラウザエミュレーションの使用はローカルマシンでは機能しましたが、EC2では機能しませんでした。結局私はあきらめて、かき集める別のウェブサイトを見つけました。ちなみにクラウドファイアは回避できますか?
Maksim Kniazev

7

偽のユーザーエージェントとしてFirefoxを使用して、これを試してください(さらに、Cookieを使用してWebをスクレイピングするのに適した起動スクリプトです)。

#!/usr/bin/env python2
# -*- coding: utf8 -*-
# vim:ts=4:sw=4


import cookielib, urllib2, sys

def doIt(uri):
    cj = cookielib.CookieJar()
    opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
    page = opener.open(uri)
    page.addheaders = [('User-agent', 'Mozilla/5.0')]
    print page.read()

for i in sys.argv[1:]:
    doIt(i)

使用法:

python script.py "http://www.ichangtou.com/#company:data_000008.html"

3

答えの根本は、質問をしている人は彼らが何をしたいのかを得るためにJavaScriptインタープリターを持っている必要があるということです。私が見つけたのは、JavaScriptで解釈される前に、jsonのWebサイトで必要なすべての情報を取得できることです。これにより、各Webページが同じ形式であることを期待してHTMLを解析するのにかかる時間を大幅に節約できました。

したがって、リクエストを使用してWebサイトから応答を取得するときは、解析する準備ができているフッターにJavaScript JSONが見つかる可能性があるため、実際にはhtml / textを確認してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.