はじめに
前回、Cloudflareのbot検知を回避する方法として、DrissionPageを紹介させていただきました。
現時点だと、こちらのライブラリは問題なく使えるため、そのまま使用しても問題ありません。
ですが、READMEが中国語なのでとっつきにくい印象があります。また、セキュリティ面に関しても多少不安が残ります。
そこで、より安心して使えるライブラリを紹介します。
nodriver
このライブラリは、Undetected-Chromedriverの開発者が開発した後継のプロジェクトです。
Undetected-Chromedriverのライブラリは前に使っていましたが、なにか問題が起きたことはありませんでした。
なので、DrissionPageよりは安心して使えると思います。
もちろん、絶対に安心ではない点についてはご理解ください。
利便性の高いドキュメント
安全面以外にもこのライブラリを推すポイントがあります。
それは、このnodriverのGitHubリポジトリには、詳細なドキュメントが用意されていることです。
クイックスタートガイドやクラスに実装されたメソッドについての詳細な説明が記載されており、これはとても助かります。
ドキュメントでは、クラスがBrowser、Tab、Elementの3つに分類されており、それぞれのクラスに属するメソッドが体系的に整理されています。
各メソッドについては、引数や返り値の型、説明が明確に記述されているため、開発者にとって利用しやすいリファレンスとなっています。
また、Cursorを使ってドキュメントを読み込むことで、自然言語処理による簡単な実装が可能です。
さらに、各クラスのページをChatGPTやClaudeにコピー&ペーストすることで、それぞれのメソッドについての詳細な解説を得ることができます。
基本的な使い方
それでは、前回同様Cloudflareのbot対策がされているUnite APIを使って、実際に値が取れるか試してみます。
今回はここのゲーム数を取得してみます。
import nodriver as uc
import re
async def main():
browser = await uc.start()
page = await browser.get('https://uniteapi.dev/meta')
await page.wait(5)
game_info = await page.query_selector('#__next > div.sc-bd5970f2-0.krVYZr > div.sc-eaff77bf-0.bvmFlh > h3')
# ゲーム数の抽出
game_count_match = re.search(r"(\d+)\s*games", game_info.text_all)
if game_count_match:
game_count = int(game_count_match.group(1))
else:
game_count = None
print(game_count)
if __name__ == '__main__':
# since asyncio.run never worked (for me)
uc.loop().run_until_complete(main())
実際にCloudflareのbot対策を回避し、取得することを確認しました!
150906
終わりに
DrissionPageが上手く使えなかった方は是非試してみてください。
スクレイピングの幅が広がります。