RedandWhiteDays

赤、白、ときどき黒猫

DAY4 : Python3.5のurllib.requestでユーザーエージェントを偽装してみる

今日はPython3.5のurllib.requestでユーザーエージェントを偽装する話をする。


HTTPプロトコルに従ってサーバーにリクエストを送るとき、こちらのIPアドレスをサーバーに伝えなければ情報はもちろん送られてこない。実は、その他にも色々な情報をサーバー側に伝えている。


例えばどのようなブラウザなのか(Chrome, Firefoxなど)、OSはなんなのか(Windows, iOSなど)、言語はなんなのか(日本語、英語など)等の情報がサーバーに送られる。これらの情報をまとめた文字列をユーザーエージェントと言い、それを元にサーバー側はスマホ用ページを送るのか、日本語版ページを送るのかなどを判断し、最適なページを送ってきてくれることとなる。


実際にどのような情報が送られているのかはこちらのページにアクセスすると教えてくれる。
www.cman.jp



さてPython3.5のurllib.requestを使用してサーバーにリクエストを送るときのユーザーエージェントはどのようになっているのだろう。
上のサイトを利用して確かめてみた。

import urllib.request

url='http://www.cman.jp/network/support/go_access.cgi'
req=urllib.request.Request(url)
response=urllib.request.urlopen(req)
html=response.read().decode('utf-8')
open("response.html","w").write(html)


得られたresponse.htmlをブラウザで表示してみると、HTTP_USER_AGENTの欄が

Python-urllib/3.5


となっており、Pythonで機械的にアクセスしていることがサーバー側に分かってしまっている(別に現状隠す必要はないのだが)。
そこでユーザーエージェントを、firefoxとしてアクセスしたときの文字列に変更してアクセスするための関数、request_as_foxを次のように定義した。

def request_as_fox(url):
	headers={"User-Agent":"Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Firefox/38.0"}
	return urllib.request.Request(url,None,headers)


この関数をはさんでrequestを得て、先のサイトにアクセスしてみる。

req=request_as_fox(url)
response=urllib.request.urlopen(req)
html=response.read().decode('utf-8')
open("response.html","w").write(html)


結果、HTTP_USER_AGENTの欄が

Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Firefox/38.0


となりブラウザのfirefoxを使用してアクセスしてきたようにサーバー側は判断するようになった。
なおユーザーエージェントを偽装するのは違法ではないのでご安心を。
代表的なブラウザでも変更できる。