NODRIVERを使ったウェブスクレイピング
2025年のNODRIVERを使ったウェブスクレイピング
このガイドでは、NODRIVERが何であるか、なぜそれが異なるのか、そしてコーディングやスクレイピングが全く初めての方でも、どのようにしてウェブスクレイパーを構築できるかを説明します。
NODRIVERとは?
NODRIVERは、Pythonベースのブラウザ自動化ツールです。これを使うことで、ウェブサイトを開き、操作し、データを収集することができます — すべてコードを通じて行います。
多くのスクレイピングツールとは異なり、NODRIVERはSeleniumやPuppeteerに依存していません。また、ChromeDriverも使用していません。代わりに、独自の方法でブラウザを制御します。これにより、いくつかの利点があります:
- 従来のツールよりも検出を回避しやすい。
- セットアップ要件が少ない。
- 現代の非同期プログラミングをサポートしている。
MCPサーバーでスクレイピングを改善する
CAPTCHAや高度なボット対策を含む大規模または複雑なウェブスクレイピングのためのシンプルで安価なソリューションが必要な場合は、Bright Dataのモデルコンテキストプロトコル(MCP)を検討すべきです。
私はBright Dataとは提携していませんが、MCPサーバーを使うのが本当に好きです。彼らのMCPサーバーを使うことで、すべての製品に一箇所からアクセスできます。利用可能なすべてのツールを確認してください。
さて、NODRIVERに戻りましょう!
なぜウェブスクレイピングにNODRIVERを使用するのか?
Selenium、Playwright、Puppeteerなどの多くのツールがすでに存在します。それでは、なぜ誰かがNODRIVERを考慮すべきなのでしょうか?
いくつかの理由を挙げます:
1. 外部ドライバーが不要
従来のツールであるSeleniumはChromeDriverを必要とし、インストールや更新が面倒です。NODRIVERはそれを必要としません。PythonとChromeベースのブラウザ(ChromeやBraveなど)だけが必要です。
2. シンプルなセットアップ
NODRIVERは、次の1つのコマンドでインストールできます:
pip install nodriver
他のセットアップは必要ありません。複雑なパスやシステム変数を扱う必要もありません。
3. 設計上非同期
ほとんどのスクレイピングライブラリは同期的です。つまり、一度に1つのタスクしか実行できません。NODRIVERは非同期関数を使用しており、より短時間で多くのことを行うことができます — 一度に複数のページをスクレイピングするのに最適です。
4. 検出回避能力が高い
ウェブサイトはボットを検出する能力が向上しています。NODRIVERはSeleniumやPuppeteerと同じパターンに従わないため、場合によっては検出を回避できます。
最初のNODRIVERスクリプトのセットアップ
NODRIVERを使用してシンプルなウェブサイトをスクレイピングする手順を見ていきましょう。
ステップ1: NODRIVERをインストール
ターミナルを開いて、次のコマンドを実行します:
pip install nodriver
Python 3.7以上がインストールされていることを確認してください。
ステップ2: 基本的なスクリプトを書く
こちらがNODRIVERスクリプトの基本的な骨組みです:
import nodriver
async def main():
browser = await nodriver.start()
page = await browser.get("https://example.com")
await page.close()
if __name__ == '__main__':
nodriver.loop().run_until_complete(main())
このスクリプトはブラウザを開き、ウェブサイトを訪れ、そして閉じます。
ページをナビゲートし、データを収集する
次に、実際のデータを収集する方法を詳しく見ていきましょう。
例: ウェブサイトからの引用をスクレイピング
例えば、https://quotes.toscrape.comのようなウェブサイトから引用を収集したいとします。このサイトはスクレイピングの練習用に作られています。
ここでは、1ページのすべての引用を収集する方法を示します:
import nodriver
async def main():
browser = await nodriver.start()
page = await browser.get("https://quotes.toscrape.com")
quotes = await page.select_all("div.quote")
for quote in quotes:
text = (await quote.query_selector("span.text")).text
author = (await quote.query_selector("small.author")).text
print(f"{text} - {author}")
await page.close()
if __name__ == '__main__':
nodriver.loop().run_until_complete(main())
複数ページの処理
多くのウェブサイトはデータを複数のページに分割しています。これをページネーションと呼びます。
それを処理するには、「次へ」ボタンを検出し、それがなくなるまで新しいページを訪れ続ける必要があります。
以下のようにします:
import nodriver
async def main():
browser = await nodriver.start()
base_url = "https://quotes.toscrape.com"
next_url = "/"
while next_url:
page = await browser.get(base_url + next_url)
quotes = await page.select_all("div.quote")
for quote in quotes:
text = (await quote.query_selector("span.text")).text
author = (await quote.query_selector("small.author")).text
print(f"{text} - {author}")
next_btn = await page.select("li.next > a")
if next_btn:
attrs = next_btn.attributes
for i in range(len(attrs)):
if attrs[i] == "href":
next_url = attrs[i + 1]
break
else:
next_url = None
await page.close()
if __name__ == '__main__':
nodriver.loop().run_until_complete(main())
このバージョンはすべてのページを巡回し、見つけたすべての引用を印刷します。
データの抽出と保存
データを印刷する代わりに、ファイルに保存することができます。JSONはこの目的に適したフォーマットです。
スクレイピングした引用をJSONファイルに保存する方法は以下の通りです:
import nodriver
import json
async def main():
browser = await nodriver.start()
base_url = "https://quotes.toscrape.com"
next_url = "/"
data = []
while next_url:
page = await browser.get(base_url + next_url)
quotes = await page.select_all("div.quote")
for quote in quotes:
text = (await quote.query_selector("span.text")).text
author = (await quote.query_selector("small.author")).text
tags = [tag.text for tag in await quote.query_selector_all("a.tag")]
data.append({"quote": text, "author": author, "tags": tags})
next_btn = await page.select("li.next > a")
if next_btn:
attrs = next_btn.attributes
for i in range(len(attrs)):
if attrs[i] == "href":
next_url = attrs[i + 1]
break
else:
next_url = None
await page.close()
with open("quotes.json", "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=4)
if __name__ == '__main__':
nodriver.loop().run_until_complete(main())
これを実行すると、すべてのスクレイピングした内容を含むquotes.jsonファイルが作成されます。
NODRIVERの現在の課題
NODRIVERは強力ですが、まだ新しいため、いくつかのバグや機能が不足しています。
1. ヘッドレスモードが機能しない場合がある
ブラウザを表示せずにNODRIVERを実行する(ヘッドレスモード)と、時々失敗します。これはバグか、ボット検出を避けるための機能かもしれません。
2. 属性の抽出がスムーズでない
要素の属性を取得しようとすると、NODRIVERは辞書ではなくリストを返します。これにより、扱いが難しくなります。例えば:
Get Data Journal’s stories in your inbox
Join Medium for free to get updates from this writer.
attrs = element.attributes
# [‘href’, ‘/page/2/’]
必要なものを見つけるために、このリストをループする必要があります。
3. 限られたプロキシサポート
プロキシを使用することは、真剣なスクレイピングにとって重要です。NODRIVERにはcreate_context()メソッドがありますが、十分なドキュメントがありません。将来的には機能するかもしれませんが、現時点では運次第です。
NODRIVERの良い使用例
NODRIVERは以下の用途に適しています:
- 非同期スクレイピングの学習
- 簡単なボット検出の回避
- 小規模なウェブサイトのスクレイピング
- アイデアの迅速なテスト
ログインフロー、CAPTCHA、またはIP禁止がある複雑なプロジェクトに取り組んでいる場合は、今のところSeleniumやPlaywrightが必要かもしれません。
NODRIVERの代替
NODRIVERがニーズに合わない場合、検討すべきいくつかの優れたツールがあります:
Playwright
- 完全に非同期
- ヘッドレスモードをサポート
- 待機、認証、ファイルダウンロードのための組み込みサポート
Selenium
- 非常に成熟している
- 多くのブラウザをサポート
- 大きなコミュニティと多数のチュートリアル
Scrapy
- 大規模なスクレイピングに最適
- セレクタとパイプラインで動作
- 複数ページをクロールし、データを保存するために構築されている
NODRIVERの未来
NODRIVERはまだ成長中です。その背後にいる開発者は、ボット検出を回避するために人気のあったUndetected Chromedriverの創作者でもあります。この背景があるため、NODRIVERが時間とともにより安定することに自信を持っています。
近く見られることを期待する機能:
- より良い属性処理
- 完全なプロキシサポート
- クリックや入力などのページインタラクションの改善
- 動作するヘッドレスモード
結論
2025年のウェブスクレイピングは、NODRIVERのようなツールを使うことでより速く、簡単になります。少ない設定でシンプルで迅速なスクレイパーを構築することができます。NODRIVERは軽量で使いやすく、SeleniumやPuppeteerを必要とせずに動作します。これにより、小規模なプロジェクトや非同期スクレイピングの学習に最適です。しかし、まだいくつかのバグがあります。プロキシ、CAPTCHA、またはヘッドレスモードを完全にはサポートしていません。より高度なニーズには、PlaywrightやSeleniumのようなツールがより良い選択肢です。しかし、アイデアを迅速にテストしたい場合、NODRIVERは素晴らしい選択肢です。今日のスクレイピングにおいて最も興味深いツールの一つです。
