以下のサイトからコンテンツを入手したい。FirefoxやChromeなどのブラウザを使用すると、希望する実際のWebサイトページを取得できますが、Pythonリクエストパッケージ(またはwget
コマンド)を使用して取得すると、まったく異なるHTMLページが返されます。私はウェブサイトの開発者がこれのためにいくつかのブロックを作ったと思ったので、問題は:
Pythonリクエストまたはコマンドwgetを使用して、ブラウザーの訪問を偽装するにはどうすればよいですか?
以下のサイトからコンテンツを入手したい。FirefoxやChromeなどのブラウザを使用すると、希望する実際のWebサイトページを取得できますが、Pythonリクエストパッケージ(またはwget
コマンド)を使用して取得すると、まったく異なるHTMLページが返されます。私はウェブサイトの開発者がこれのためにいくつかのブロックを作ったと思ったので、問題は:
Pythonリクエストまたはコマンドwgetを使用して、ブラウザーの訪問を偽装するにはどうすればよいですか?
回答:
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'
PhantomJS
セレンではヘッドレスブラウザを使用できることに注意してください。ありがとう。(役に立った場合は、回答を受け入れることを忘れないでください)
この質問がまだ有効かどうか
偽の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]>
偽のユーザーエージェントとして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"
答えの根本は、質問をしている人は彼らが何をしたいのかを得るためにJavaScriptインタープリターを持っている必要があるということです。私が見つけたのは、JavaScriptで解釈される前に、jsonのWebサイトで必要なすべての情報を取得できることです。これにより、各Webページが同じ形式であることを期待してHTMLを解析するのにかかる時間を大幅に節約できました。
したがって、リクエストを使用してWebサイトから応答を取得するときは、解析する準備ができているフッターにJavaScript JSONが見つかる可能性があるため、実際にはhtml / textを確認してください。