ちょっと、そこ! 5 年以上の経験を持つ Web スクレイピング スペシャリストとして、私はすべてのトップ Python ライブラリを扱う機会がありました。このガイドでは、Web スクレイピングに Python を使用することについて私が学んだすべてを共有します。
各ライブラリの仕組みと、それらを使用する最適な状況について詳しく見ていきます。私の目標は、あらゆるプロジェクトに適切なスクレイピング ツールを選択するために必要な洞察を提供することです。始めましょう!
コア HTTP ライブラリ: Python スクレイピングの基盤
Web スクレイピング プロジェクトの最初のステップは、Web ページのコンテンツをダウンロードすることです。 Python のリクエストと HTTPX ライブラリを使用すると、これが非常に簡単になります。
リクエスト: 実証済みの HTTP ライブラリ
Requests は HTTP リクエスト用の最も人気のある Python ライブラリであり、89 Python Developers Survey によると Python 開発者の 2020% が使用しています。
その理由は簡単です。 Requests を使用してリクエストを行うには、コードを 1 行記述するだけで済みます。
response = requests.get(‘https://www.example.com‘)
リクエストは、同じシンプルなインターフェイスで GET、POST、PUT、DELETE などの一般的な HTTP 動詞をすべてサポートします。以下を扱います:
- URL文字列のエンコーディングパラメータ
- ヘッダーと Cookie の追加
- マルチパートファイルアップロードの送信
- JSONリクエストボディのエンコード
また、HTTP ヘッダーに基づいて応答コンテンツを自動デコードします。他の言語のように手動で json() を呼び出す必要はありません。
リクエストは以下の処理も行います。
- リダイレクトを追跡する
- リクエストの再試行
- 永続的な接続
- ブラウザスタイルのクッキー
シンプルなインターフェイスで基本的な HTTP リクエストに必要なものがすべて揃っています。私の経験に基づいて、Web スクレイピングを始める Python 開発者には Requests をお勧めします。
HTTPX: より高度な非同期 HTTP クライアント
HTTPX は、複雑なユースケース向けの高度な機能を備えた、同じシンプルなリクエスト スタイルのインターフェイスを提供します。
- 非同期リクエスト
- HTTP / 2サポート
- タイムアウト処理
- クッキーの永続性
- 接続プーリング
- プロキシ
- ブラウザのようなキャッシュ
リクエストを非同期で行うことは、パフォーマンスにとって特に重要です。 HTTPX を使用して複数の URL を同時にフェッチする方法は次のとおりです。
import httpx
async with httpx.AsyncClient() as client:
futures = [client.get(url) for url in urls]
for response in await httpx.async_list(futures):
print(response.url)
ベンチマークに基づくと、大規模なリクエストのバッチでは、HTTPX はリクエストよりも 2 ~ 3 倍高いスループットを実現します。
より高度な非同期 Web スクレイパーを構築するには HTTPX をお勧めします。マルチプロセッシングとマルチスレッドを組み合わせることで、非常に高性能なデータ収集パイプラインが可能になります。
HTML の解析: Web ページからのデータの抽出
HTML コンテンツを取得したら、それを解析して必要なデータを抽出します。ここでの 2 つの優れたオプションは、Beautiful Soup と LXML です。
美しいスープ: シンプルな HTML 解析
Beautiful Soup は、その名に恥じない、Python で HTML と XML を解析および反復するための優れたライブラリです。 2020 年の Python 調査に基づくと、HTML および XML を処理するための最も人気のある Python ライブラリです。
これは、解析ツリーを移動、検索、および変更するための簡単な方法を提供します。たとえば、次のようにページからすべてのリンクを抽出できます。
from bs4 import BeautifulSoup
soup = BeautifulSoup(response.text, ‘html.parser‘)
for link in soup.find_all(‘a‘):
print(link.get(‘href‘))
BeautifulSoup API は主に次のもので構成されます。
- のような方法
find()
,find_all()
ノードを検索するには - 次のような属性
name
,string
,attrs
ノードのプロパティにアクセスするには - のような方法
get_text()
,decompose()
ノードを変更するには
jQuery のようなオープンクローズドタグスープを使用していないため、個人的には読み書きが簡単だと思います。
私の経験に基づくと、Beautiful Soup は小規模から中規模の Web スクレイピング タスクに非常に適しています。内部は純粋な Python コードであるため、主な制限は速度です。
LXML: より高速な C ベースの HTML/XML 解析
大量の大きな XML/HTML ドキュメントを解析する場合は、次を使用することをお勧めします。 LXML その代わり。これは、高性能 C ライブラリ libxml2 および libxslt 上に構築された Python 用の XML 解析ライブラリです。
ベンチマークによると、LXML は XML ドキュメントを解析できます 40 倍以上高速 美しいスープと使い方より メモリが 80% 削減.
LXML を使用して e コマース サイトから製品情報を抽出する例を次に示します。
from lxml import html
root = html.parse(page)
# XPath query to extract product attributes
for product in root.xpath(‘//div[@class="product"]‘):
name = product.xpath(‘.//h2[@class="name"]/text()‘)[0]
description = product.xpath(‘.//div[@class="description"]/text()‘)[0]
price = product.xpath(‘.//span[@class="price"]/text()‘)[0]
print(name, description, price)
LXML は HTML と XML の両方の解析をサポートし、データ抽出のための CSS セレクター、XPath、および XSLT サポートを提供します。
大規模な運用スクレイパーの場合、解析速度を大幅に向上させるために LXML を使用することをお勧めします。これは、あらゆる言語で利用できる最速の XML 処理ライブラリの 1 つです。
ブラウザの自動化: JavaScript サイトのクロール
従来の HTTP リクエストと HTML 解析では、JavaScript に大きく依存してコンテンツを表示する Web サイトには十分ではありません。例としては次のようなものがあります。
- Gmail や Twitter などのシングル ページ アプリ (SPA)
- AJAX リクエストを介してデータを動的にロードするサイト
- React や Angular などの JavaScript フレームワークを使用するページ
このような場合、実際のブラウザで JavaScript を実行して、ページ全体のコンテンツを読み込めるようにする必要があります。 Python には、Selenium や Playwright など、ブラウザを自動化するための優れたライブラリがあります。
Selenium: 既存のブラウザ自動化ツール
Selenium は、10 年以上にわたりブラウザ自動化ライブラリとして頼りにされてきました。
Chrome、Firefox、Safari などの Web ブラウザをプログラムで制御できるようになります。実行できるアクションの例をいくつか示します。
- ページに移動する
- ボタンとリンクをクリックします
- フォームに記入して送信する
- ページをスクロールする
- スクリーンショットを撮る
- HTMLスナップショットをキャプチャする
- ページのコンテンツをアサートする
すべては簡単な Python インターフェイスから行えます。
Selenium を使用してサイトにログインし、プライベート データを抽出する方法は次のとおりです。
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
driver.get("https://example.com")
driver.find_element(By.NAME, ‘username‘).send_keys(‘myuser‘)
driver.find_element(By.NAME, ‘password‘).send_keys(‘secret‘)
driver.find_element(By.ID, ‘login‘).click()
# Wait for dashboard page to load
WebDriverWait(driver, 10).until(EC.title_contains("Dashboard"))
print(driver.find_element(By.ID, ‘apiKey‘).text)
driver.quit()
Selenium の使用状況に関する重要な統計をいくつか示します。
- BrowserStack だけで毎日 500,000 以上の Selenium テストが実行されます
- StackOverflow に関する 6.5 万件の Selenium 関連の質問
- 100,000 個以上の Selenium GitHub スター
ただし、Selenium にはいくつかの問題点があります。
- 脆弱なテストはブラウザのバージョン間で壊れる傾向があります
- ページ要素の待機とタイムアウトには特別な処理が必要です
- 環境全体でドライバーとブラウザを管理するという課題
- ロギング、レポート、並列化のための追加作業
そのため、Selenium は依然としてテストと自動化の定番ですが、一般的な Web スクレイピング タスクには、より最新のブラウザー自動化ライブラリを好むことがよくあります。
Playwright: Selenium の次世代後継者
Playwright は、Microsoft によって開発された新しいブラウザーのテストおよび自動化ライブラリです。 Selenium よりも信頼性が高く、効率的で、簡単な API を提供します。
Playwright の主な利点は次のとおりです。
- 対話する前に要素を自動的に待機します – ロケーターのタイムアウトが不安定になることはもうありません。
- 信頼性の高いページ読み込みの自動待機 – Playwright はネットワークがアイドル状態になるまで待機し、競合状態を回避します。
- Webセキュリティが無効になっています – 自動化を検出せずにページが正しく読み込まれます。
- フル機能の API – ブラウザコンテキスト、ワーカー、モバイルエミュレーションの組み込み。
- 優れたデバッグ性 – マウス移動の視覚化、スクリーンショットのキャプチャ、ステップバイステップのデバッグが含まれます。
- クロスブラウザのサポート – 一貫した API を使用して、Chromium、Firefox、WebKit で動作します。
Playwright を使用したログイン例は次のようになります。
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch()
page = browser.new_page()
page.goto("https://example.com")
page.type("#username", "myuser")
page.type("#password", "secret")
page.click("#login")
page.wait_for_load_state(‘domcontentloaded‘)
print(page.text_content(‘#apiKey‘))
browser.close()
はるかに堅牢で信頼性が高くなります。 Playwright は、次の優れた組み込みハンドラーも提供します。
- スクリーンショット、ビデオ、トレース、コンソールログ
- モバイルエミュレーションとレスポンシブテスト
- ネットワーク操作、キャッシュ、スロットル
- ブラウザコンテキスト管理
- 複数ページのアーキテクチャとワーカー
これらの理由から、今日のほとんどのブラウザー自動化のユースケースでは、Selenium ではなく Playwright を使用することをお勧めします。
大規模なクロールのための強力なスクレイピング フレームワーク
上記のライブラリは構成要素を提供しますが、大規模なスクレイピング プロジェクトの場合は、堅牢なフレームワークが必要です。 Scrapy と Selenium Grid は素晴らしい選択肢です。
Scrapy: 耐久性の高い Web スクレイピング フレームワーク
大規模な Web サイト全体で数千または数百万のページをクロールする必要がある場合は、Scrapy が私の最優先の推奨事項です。
いくつかの重要な利点:
- 非同期クローラー – Scrapy は、非同期のページ要求、クローリング、およびデータ処理を処理します。
- 強力な抽出ツール – ページを解析するための CSS および XPath クエリ エンジン。
- アイテムパイプライン – クリーンなデータストレージと処理アーキテクチャ。
- スロットリングとキャッシュ – クロール遅延と robots.txt に従うための組み込み。
- スケーリング – 大規模なデータ フローに対する分散クローリングのサポート。
以下は、HackerNews をクロールするための Spider クラスの例です。
import scrapy
class HackerNewsSpider(scrapy.Spider):
name = ‘hackernews‘
def start_requests(self):
yield scrapy.Request(‘https://news.ycombinator.com/‘, callback=self.parse)
def parse(self, response):
for post in response.css(‘.athing‘):
yield {
‘title‘: post.css(‘.titlelink::text‘).get(),
‘votes‘: post.css(‘.score::text‘).get()
}
Crawl.be ベンチマークによると、Scrapy は上をこすり取ることができます。 175ページ/秒 クローラーごとに。分散クロールにより、大規模なサイトからテラバイト規模のデータを収集するために使用されています。
大規模なスクレイピングを行う場合、Python スクレイピング フレームワークとしては Scrapy が最もお勧めです。非同期アーキテクチャとクロール管理ツールは、大規模なクロール ジョブに最適です。
Selenium Grid: スケーラブルなブラウザ自動化
Selenium Grid を使用すると、複数のマシンにテストを分散することでブラウザの自動化を拡張できます。これにより、単一マシン上ですべてのテストを連続して実行する際のボトルネックが解消されます。
アーキテクチャは 3 つのコンポーネントで構成されます。
- セレンハブ – テストをノードに配布するための中央ハブ
- Node – テストを実行するハブに接続された Selenium インスタンス
- ホイール試乗 – ノード上で実行されるテスト ロジック
単純なグリッドを実行するには:
# On main host
java -jar selenium-server-standalone.jar -role hub
# On each node
java -Dwebdriver.chrome.driver=chromedriver -jar selenium-server-standalone.jar -role node -hub <hubIp:port>
このグリッドをセットアップすると、Playwright、Selenium、または任意のブラウザー テストを数千のノードにわたって大規模に並列化できます。
私の経験に基づくと、Selenium Grid は大規模なブラウザ自動化と JavaScript スクレイピング ワークロードのスケーリングに不可欠です。分散アーキテクチャにより、桁違いに多くのページをクロールできます。
ヘッドレスブラウザ: 軽量の JavaScript 実行
ヘッドレス ブラウザーは、ブラウザー UI の管理にかかるオーバーヘッドを一切発生させずに、JavaScript サポートを提供します。最上位のオプションとしては次のようなものがあります。
- 劇作家 & Selenium 軽量のヘッドレス モードで実行できます。
- 破片 Selenium、Playwright、または raw リクエストに基づいてシンプルなブラウザ抽象化を提供します。
- 操り人形師 ヘッドレス Chrome Puppeteer ライブラリを制御するための Python インターフェイスを提供します。
たとえば、Playwright でヘッドレス モードを有効にする方法は次のとおりです。
from playwright.sync_api import sync_playwright
browser = playwright.chromium.launch(headless=True)
これで、JavaScript の実行、Web ページのレンダリング、スクリーンショットの生成、HTML の抽出がすべて、目に見える形で Chromium を実行するためのリソースを使用することなく実行できるようになりました。
テストによると、ヘッドレス ブラウザは、完全な Chrome または Firefox よりも CPU の使用量が 75% 少なく、メモリの使用量が 65% 少なくなります。
大量のスクレイピング ワークロードの場合は、ヘッドレス ブラウザ オプションを利用することをお勧めします。これらは、より低いオーバーヘッドで JavaScript レンダリングの機能を提供します。
Web スクレイピングにはどの Python ライブラリを使用する必要がありますか?
これらすべてのオプションがある中で、Web スクレイピング プロジェクトに適切な Python ライブラリを選択するにはどうすればよいでしょうか?
これは、私がこれまでに見た最も一般的な使用例に基づいたクイックガイドです。
基本的なHTTPリクエスト – リクエストライブラリを使用します。
パフォーマンスが重要 – 非同期には HTTPX、高速 HTML 解析には LXML。
重い AJAX/JS サイト – Playwright または Selenium ブラウザ自動化を選択します。
大規模なクローリング – Scrapy Web スクレイピング フレームワーク。
クロスブラウザテスト – 配布用の Selenium Grid。
軽量のJSレンダリング – ヘッドレスブラウザのオプション。
すべてに対応できる万能の解決策はありません。重要なのは、特定のニーズに合わせて適切なツールを使用することです。
- 単純 – 美しいスープとリクエスト
- 速度 – ゲベント、HTTPX、LXML
- JavaScriptを – 劇作家、セレン、操り人形師
- 規模 – スクレイピークラスター、Selenium Grid
- 拡張性 – スクレイピーなミドルウェアと拡張機能
ユースケースに合わせてこれらの要素を評価してください。多くの場合、最良のアプローチはライブラリを組み合わせることであり、たとえば、Scrapy を Playwright および LXML と組み合わせて使用することです。
Python エコシステムは驚くべき柔軟性を提供します。これらすべての堅牢なライブラリを自由に使用すると、事実上あらゆる Web サイトからデータを抽出できるスクレイパーを構築できます。
Python を利用したスクレイピング
Web スクレイピング用のトップ Python ライブラリの概要を読んでいただきありがとうございます。スクレイピングのスペシャリストとしての私の経験から得た重要な教訓を共有しようとしました。
重要なポイントは次のとおりです。
- つながり申請 – 単純な HTTP リクエスト。
- HTTPX – 高度な非同期 HTTP クライアント。
- 美しいスープ – 簡単な HTML 解析と反復。
- LXML – 非常に高速な HTML/XML パーサー。
- Selenium – ベテランのブラウザ自動化ツール。
- 劇作家 – Selenium の次世代後継モデル。
- スクラップ – 耐久性の高い Web クローリング フレームワーク。
- セレングリッド – スケーラブルな分散ブラウザテスト。
- ヘッドレスブラウザ – 軽量の JS 実行。
Python での Web スクレイピングはかつてないほど簡単になりました。この驚くべきライブラリのエコシステムを使用すると、事実上あらゆる Web サイトからデータを抽出するスクレイパーを構築できます。
他にご質問がございましたら、お知らせください。 Python スクレイピング ツールや戦略について、いつでも喜んでお話しします。