背景
PythonのRequestsライブラリとBeautifulSoapを使ってウェブページのクローリングをやっていたら、あるサイトにページをrequestした時、 416というエラーコードを返していました。
問題点
調べて見ると、サイトのサーバー側でrequestのヘットファイルをみて、ブラウザーからのリクエストかを判断し、そうでない場合ブロックするように設定したのが原因だそうです。
解決案
解決方法は簡単です。requestsの設定でUser-Agentをブラウザーに設定すれば解決できるのです。
User-Agentの情報は, chromeの develop tools -> network->name の下で、該当ページに当たるurlを クリックすることで、下のように取得することができます。
以下はサンプルコードです。
#!/usr/bin/env python3
# coding: utf-8
import requests
url = 'ウェイブページURL'
headers = {
'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.10'
}
r = requests.get(url, verify=True, headers=headers)
print(r.status_code)
備考
セキュリティ性が高いサイトではこれでもうまくいかない場合があります。
上の設定でサーバーからresponseをもらうようにはなったが、 error message表示のためのページが帰ってくるのです。
これは、サーバー側でUser-Agentをcheckするだけではなく、Cookieも checkしているからです。
もちろん、上と同じようにCookieの該当部分をheadersに指定することで解決可能ですが、 問題は、このCookieの中のある情報には有効期間があって、数秒、数分ごとに手作業で 入れ替えなければならないという点です。