Help us understand the problem. What is going on with this article?

Pythonで年齢認証などのクッションページを回避してスクレイピングしたい

More than 1 year has passed since last update.

はじめに

私が運営しているWebアプリケーションのジャンル的に、
スクレイピングでこんなページによく出くわします。

スクリーンショット 2019-05-01 0.04.47.png

アダルトサイトとかでよく出くわしますが、通常のサイトでも(ログインまではいかないが)強制的にクッションサイトに飛ばされることがあるかと思います。

この強制的にクッションサイトに飛ばされることは、指定したURLではなく、クッションページをスクレイピングすることになってしまうため、大きな問題となります。

こういったページを回避して、目的のページをスクレイピングする方法を忘記録として残しておきます。

クッションページを回避してスクレイピング

それぞれ独立しているわけではありませんが、以下の3通りで概ね解決できるかと。

  1. seleniumを使う
  2. requests.session()を使う
  3. クッキーを渡す

なお、本記事で解説するのは「2」と「3」です。

1. seleniumを使う

一番手っ取り早いのはseleniumでchromeやfirefoxのdriverを使うことです。

seleniumの利点は、GUI的なWebブラウザの操作ができる点。
「あるページにアクセス」→「そのページのある要素をクリック」なんてことが、Python上だけで実現できます。

seleniumの詳しい解説は結構転がっているので、本記事では割愛。

ただ、問題なのはChromeやFirefoxが無い環境では動かせないという点。
sudo権限のないCUIのレンタルサーバーとかでChromeをインストールするのは(できなくはないと思いますが)非常に厳しいです。

2. requests.session()を使う

seleniumを使わなくても、クッションページの回避程度ならrequestsモジュールのsessionで十分な場合が多いです。

import requests
from bs4 import BeautifulSoup

url_certification = 'クッションページの「はい」のURL'
url_target = 'スクレイピングしたいURL'

session = requests.session()
session.get(url_certification)

soup = BeautifulSoup(session.get(url_target).content, 'lxml')

よく使用されるrequests.getはワンタイムのアクセスですが、
上記のようにsessionを使用することで、連続したアクセスを実現が実現できます。
あと、seleniumよりも圧倒的に速いのも利点。

3. クッキーを渡す

クッションページ内の「はい」のURLが、「クッキーを生成するJavaScriptへのアクセス」だと、requests.session()だけではうまくいきません。
このような場合は「はい」をクリックしたときに生成されるクッキーをrequests.getに渡してやることで解決します。

cookie = {'abc': '1'}  # 予め調べておく。

soup = BeautifulSoup(requests.get(url, cookies=cookie).content, 'lxml')

今回はパスワードやメールアドレスなどのセキュアな情報を扱うわけではないので、セキュリティ面などはあまり気にせずに書いています。

cookieの調べ方は、他の方の記事を参照してください。ある要素をクリックしたときに生成されるクッキーの値を取得するといったことは、Chromeなどの実際のブラウザや、前述のselemiumなどから調べることができます。

なお、requests.getにわたすクッキーのvalueは、str型でなければならない点に注意してください。

まとめ

seleniumは色々と高機能で楽ですが、requestsモジュールだけでも色々と実現できます。
機能・速さ・セキュリティなどを考慮して、適材適所を心がけたいですね。

aizakku_nidaa
俗にいうデータサイエンティストです。キータは備忘録として使っていますのでクオリティはお察し()。仕事では、検索と推薦まわりの自然言語処理・グラフ理論・ディープラーニングなどを担当しています。また趣味(副業)では、Webアプリケーションを作ったり、スクレイピングの依頼をうけたり、Python+JavaScriptでブログ投稿の自動化とかしたりしてます。
https://github.com/kazuaki-i
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away