PythonプログラムによるWebサイトコンテンツの取得
PythonのウェブスクレイピングプログラムはHTMLをダウンロードし、選択した要素を抽出します。BeautifulSoupはマークアップをタグ、属性、テキスト、リンクの検索可能なツリーに変換します。ワークフローは、リクエスト、検証、解析、選択、保存の順です。web.runではPythonがPyodideを通じて実行されるため、ネットワーク活動とパッケージの読み込みもRun Detailsに表示されます。
PythonプログラムでWebサイトのHTMLをスクレイピング
出力:
ここに出力が表示されます...
出力:
Title: Header
Links found: 9
このサンプルの動作説明
pyfetchは非同期リクエストを送信するため、プログラムはトップレベルでawaitを使用します。- ステータスチェックにより、エラーページが対象ドキュメントとして解析されるのを防ぎます。
response.string()はレスポンスボディを読み取り、BeautifulSoupがhtml.parserで解析します。find("h1")は最初の見出しを返し、find_all("a")はすべてのリンクを返します。
Run DetailsでスクレイパーをF確認する
プログラム終了後にRun Detailsを開きます。スクレイパーが行ったページリクエストと、コード実行に必要なパッケージ活動を分けて表示します。
| Run Detailsのシグナル | 意味 |
|---|---|
| RequestsにF raw.githubusercontent.comへのGETが表示される | スクレイパーがHTMLファイルのダウンロードを試みた |
| リクエストのステータスが200 | ブラウザがページを正常に受信した |
| リクエストが失敗またはブロックされた | 接続と対象サイトのブラウザからのクロスオリジンリクエスト許可を確認する |
| Packagesにbeautifulsoup4が表示される | web.runがbs4のインポートを検出し、サポートされているパッケージを読み込んだ |
| ステータス200だが抽出された値が存在しない | ネットワークは正常;HTMLとセレクターを確認する |
リクエスト横の時間はページ取得時間を示し、合計時間にはパッケージの読み込み、解析、Python実行も含まれます。BeautifulSoupは通常初回実行時にダウンロードされ、現在のランタイムで利用可能な状態を維持するため、以降の実行はより速く完了し、パッケージ活動が表示されない場合があります。
Pythonでウェブサイトをスクレイピングする方法
- 自動アクセスとブラウザリクエストを許可しているページを選択します。
- HTMLをダウンロードし、解析前に成功以外のHTTPステータスを拒否します。
- レスポンスボディから1つのBeautifulSoupオブジェクトを作成します。
- マークアップを調べ、セマンティックタグ、属性、またはCSSセレクターで要素を選択します。
- 抽出したテキストを正規化し、結果を保存する前に相対URLを絶対URLに変換します。
Python BeautifulSoupの追加サンプル
すべてのセクション見出しを抽出する
1つのCSSセレクターで複数の見出しレベルを収集します:
for heading in soup.select("h2, h3"):
print(heading.get_text(" ", strip=True))
セパレーターはネストされたタグのテキストを分離し、strip=Trueは前後の空白を除去します。
リンクを抽出して正規化する
絶対リンク、相対リンク、フラグメントリンクをページURLに対して解決します:
from urllib.parse import urljoin
for link in soup.select("a[href]"):
print(urljoin(url, link["href"]))
[href]セレクターはリンク先のないアンカーを除外し、属性アクセスを安全にします。
BeautifulSoupセレクターの選択
| タスク | セレクター | 結果 |
|---|---|---|
| 最初のページ見出し | soup.find("h1") | 1つのタグまたはNone |
| すべてのリンク | soup.find_all("a") | タグのリスト |
| リンク先のあるリンク | soup.select("a[href]") | CSSセレクターに一致するタグ |
| 記事内の要素 | soup.select("article .item") | 一致する子孫のみ |
1つの要素が期待される場合はfind、タグベースのコレクションにはfind_all、関係や属性でCSSセレクターが明確になる場合はselectを使用します。
Pythonウェブスクレイピングの注意点
- すべてのURLにアクセスできるわけではありません。PyodideはブラウザF内で動作するため、タブでページが開けても、web.runからのクロスオリジンリクエストを拒否する場合があります。
- 存在しない要素には明示的なチェックが必要です。BeautifulSoupはセレクターが一致しない場合
Noneを返すため、すぐにテキストにアクセスするとエラーが発生します。 - JavaScriptで生成されたコンテンツはダウンロードされたHTMLには含まれません。BeautifulSoupはサーバーレスポンスを解析しますがスクリプトは実行しないため、セレクターが一致しない場合はレスポンスボディを確認してください。
クロールルールを遵守し、リクエスト頻度を制限し、変更のないページをキャッシュし、サーバーがリクエスト過多を報告した場合は負荷を下げてください。
制御フローについては、Pythonの例外処理とPythonの条件チェックを参照してください。
FAQ
Pythonのウェブスクレイピングにはどのライブラリを使いますか?
BeautifulSoupはダウンロードしたHTMLを解析・検索します。pyfetchなどのネットワーククライアントがドキュメントを取得し、BeautifulSoupがタグ、属性、またはCSSセレクターで要素を選択します。
BeautifulSoupはJavaScriptサイトをスクレイピングできますか?
BeautifulSoupはサーバーから返されたHTMLを解析しますが、JavaScriptは実行しません。スクリプト実行後にのみ作成される要素は、解析済みドキュメントには表示されません。