【Pythonスクレイピング入門】BOTアクセス対策サイトをrequests+UserAgent偽装で切り抜ける



事前準備

import requests
from bs4 import BeautiflSoup as bs4

url='https://www.yahoo.co.jp'
res=requests.get(url)

soup = bs4(res.content,'lxml')
print(soup.select('#topicsfb > div.topicsindex > ul.emphasis'))

詳しくは下記記事参照

で、まぁこの記事で完了するはずだったんですが、想定外にもヤフーのトップに弾かれるという事態が起きました。

ヤフーからのレスポンスを見る限り、ヤフーのサーバーはアクセス元のブラウザを確認していて、特定の条件を満たさない場合、普段と違うページを表示しているワケです。

今回はこのタイプのサイトにrequestsから正常にアクセスして、普段人間が見ている画面と同じHTMLを返させる方法です。

原因はUA(ユーザーエージェント)

UAとは?

ユーザーエージェント (User agent)とは、利用者があるプロトコルに基づいてデータを利用する際に用いるソフトウェアまたはハードウェアのこと。
特にHypertext Transfer Protocolを用いてWorld Wide Webにアクセスする、ウェブブラウザなどのソフトウェアのこと。

ja.wikipedia.org

なげーよ。わかんねーよ。

一言で僕が言い換えて差し上げますと「基本的にブラウザ」のことです。

最後の一行だけで良い気もしますが、要するに「まぁ、みんながぱっと思い浮かぶのはブラウザだけど、それだけじゃないよね」ってことを書いてます。

サーバーはどうやってUAを見てるの?

HTTPというのはリクエストとレスポンスでできています。要求と返答です。

リクエストの時点でこちらの情報をある程度渡す必要があるんですね。

これをリクエストヘッダと言います。UA情報はリクエストヘッダに含まれています。

requestsではリクエストヘッダを書き換えて渡すことが可能です。

headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36"}
url = 'https://www.yahoo.co.jp'
res = requests.get(url,headers=headers)

requestsのGETメソッドを投げるときにheadersと言うキーワード引数に渡します。一回上でheadersという変数に代入してますが、別にgetメソッドの中で直接渡してももちろん動きます。

ヤフーからのレスポンス

res.content

明らかに違いますね。今度こそ soup で抜き出してみましょう。

soup = bs4(res.content,'lxml')
print(soup.select('#topicsfb > div.topicsindex > ul.emphasis')[0].text)

>>>'統計不正 参考人が欠席連発写真東京医大 寄付した7人加点か写真NEW小4女児死亡 父親を起訴へ写真DASH村の叫び 地域消滅する写真NEW就活の適性検査 どこまで重視写真NEW打てない?阪神 緊急策必要か写真NEWビバヒル ディラン役が死去写真漣さんと共演 天海祐希が直訴写真'

まとめ

できた!

次の記事