見出し画像

cloudflareのBOT対策を行っているサイトをスクレイピングを行う方法

皆さん、こんにちは。中川@ナマポエンジニアです。
かなり久しぶりな投稿となりますが、何卒宜しくお願い致します。

本日は、スクレイピングに関連する記事です。スクレイピングとは、簡単に述べるとWebサイトからサイトのデータを取得することを指します。

スクレイピングのライブラリで、有名なのは以下です。
BeautifulSoup
・Scrapy
・Selenium

そんなスクレイピングですが、最近のサイトでちょくちょく増えているcloudflareのBOT対策を行っているサイトが増えており、そういったサイトをスクレイピングするのは一般的なライブラリでは困難を極めます。

上記キャプチャのように、サイトにアクセスした際にcloudflareの「人間であることを確認します」というような認証ページが表示されれば、cloudflareのBOT対策が行われています。これはcloudflareのturnstileというサービスで、CAPTCHAに代わる認証システムとして徐々に使用数が増えています。

そこでネット上で色々調査したところ、「DrissionPage」というライブラリで、cloudflareのBOT対策を行っているサイトでもスクレイピングが出来そうだということが判明しました。

中国のライブラリのため、不安に思われる方もいるでしょうが、私も実際に自分のPCにインストールして今のところ特に問題は生じておりません。

高度な技術により、スクレイピングを行う際に高速でサイトを表示することができるため、cloudflare側にBOTという認識がされないようです。

簡単な概要をご説明しましたので、次は実際にローカルPCでDrissionPageを使用する方法を記載していきます。

まず、DrissionPageは、PythonのライブラリのためPythonをインストールする必要がございます。

また、Node.jsやGoなどの他の言語にも対応しておりません。

今回は、Unite APIという人気ゲームアプリのポケモンユナイトのデータを取得できるサイトで検証してみます。
作成するプログラムは、Unite APIからポケモン名を取得するものです。

ページを開く処理

from DrissionPage import ChromiumPage
page = ChromiumPage()
url = "https://uniteapi.dev/meta"
page.get(url)

上記の処理をpythonファイルに記載し、実行に成功するとUnite APIのサイトが新規に開きます。

kmopaf = page.ele(".sc-9fa03fa-0 kMOPAf")
pokemons = kmopaf.eles(".sc-9fa03fa-1 eeepYv")
for pokemon in pokemons:
    text = pokemon.text
    print(text)

各種メソッドは、以下のような特徴があります。
ele() 
条件に該当する要素を一つのみ取得
eles()
条件に該当する要素を複数取得

eleとelesメソッドの条件は、クラス名を指定する場合は「.」をつけ、idを指定する場合は「#」を先頭につける必要があります。タグの場合はタグ名のみで大丈夫です。

上記コードを実行すると以下のようにポケモンの名前のリストが出力されます。

Absol
Aegislash
Alolan Ninetales
Azumarill
Blastoise
Blaziken
Blissey
Buzzwole
Chandelure
Charizard
Cinderace
Clefable
Comfey
Cramorant
Crustle
Decidueye
Delphox
Dodrio
Dragapult
Dragonite
Duraludon
Eldegoss
Espeon
Garchomp
Gardevoir
Gengar
Glaceon
Goodra
Greedent
Greninja
Gyarados
Hoopa
Inteleon
Lapras
Leafeon
Lucario
Machamp
Mamoswine
Meowscarada
Metagross
Mew
MewtwoX
MewtwoY
Mimikyu
Miraidon
Mr. Mime
Pikachu
Sableye
Scizor
Slowbro
Snorlax
Sylveon
Talonflame
Trevenant
Tsareena
Tyranitar
Umbreon
Urshifu
Venusaur
Wigglytuff
Zacian
Zeraora
Zoroark

ページを閉じる処理

page.quit()

処理の最後には上記のようにページを閉じる処理が必要です。こちらがないと再度実行しようとした際に、プロセスが残ってしまい上手く動作しないことがあります。

最終的なソースコード

from DrissionPage import ChromiumPage
page = ChromiumPage()
url = "https://uniteapi.dev/meta"
#Unite APIのページを開く
page.get(url)

kmopaf = page.ele(".sc-9fa03fa-0 kMOPAf")
pokemons = kmopaf.eles(".sc-9fa03fa-1 eeepYv")
for pokemon in pokemons:
  #ポケモン名を取得
    text = pokemon.text
    print(text)
#ページを閉じる
page.quit()

最近は、BOT対策でcloudflareのturnstileを使用するサイトが増えています。そのようなサイトを、一般的なライブラリでスクレイピングするのは非常に難しいです。

ただ、DrissionPageを使用すると簡単に突破できちゃいます。しかもライブラリも使いやすく、情報が少ない中でもプログラムを組むことができました。ぜひ、この機会に試していただければと思います。

ココナラで、スクレイピングを行うサービスを提供しています。今回の記事でご紹介したDrissionPageを使ったスクレイピングにももちろん対応致しますので、気軽にご相談下さい。

また、tipsでFanzaの大きいサンプル画像をボタンをクリックするだけでダウンロードできるchrome拡張機能を販売しています
こちらも要チェック!


この記事が参加している募集

新生活をたのしく

仕事について話そう

この記事が気に入ったらサポートをしてみませんか?