PythonプログラムによるWebサイトコンテンツの取得

PythonのウェブスクレイピングプログラムはHTMLをダウンロードし、選択した要素を抽出します。BeautifulSoupはマークアップをタグ、属性、テキスト、リンクの検索可能なツリーに変換します。ワークフローは、リクエスト、検証、解析、選択、保存の順です。web.runではPythonがPyodideを通じて実行されるため、ネットワーク活動とパッケージの読み込みもRun Detailsに表示されます。

PythonプログラムでWebサイトのHTMLをスクレイピング

出力:

ここに出力が表示されます...

出力:

Title: Header
Links found: 9

このサンプルの動作説明

  1. pyfetchは非同期リクエストを送信するため、プログラムはトップレベルでawaitを使用します。
  2. ステータスチェックにより、エラーページが対象ドキュメントとして解析されるのを防ぎます。
  3. response.string()はレスポンスボディを読み取り、BeautifulSoupがhtml.parserで解析します。
  4. 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でウェブサイトをスクレイピングする方法

  1. 自動アクセスとブラウザリクエストを許可しているページを選択します。
  2. HTMLをダウンロードし、解析前に成功以外のHTTPステータスを拒否します。
  3. レスポンスボディから1つのBeautifulSoupオブジェクトを作成します。
  4. マークアップを調べ、セマンティックタグ、属性、またはCSSセレクターで要素を選択します。
  5. 抽出したテキストを正規化し、結果を保存する前に相対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ウェブスクレイピングの注意点

  1. すべてのURLにアクセスできるわけではありません。PyodideはブラウザF内で動作するため、タブでページが開けても、web.runからのクロスオリジンリクエストを拒否する場合があります。
  2. 存在しない要素には明示的なチェックが必要です。BeautifulSoupはセレクターが一致しない場合Noneを返すため、すぐにテキストにアクセスするとエラーが発生します。
  3. JavaScriptで生成されたコンテンツはダウンロードされたHTMLには含まれません。BeautifulSoupはサーバーレスポンスを解析しますがスクリプトは実行しないため、セレクターが一致しない場合はレスポンスボディを確認してください。

クロールルールを遵守し、リクエスト頻度を制限し、変更のないページをキャッシュし、サーバーがリクエスト過多を報告した場合は負荷を下げてください。

制御フローについては、Pythonの例外処理Pythonの条件チェックを参照してください。

FAQ

Pythonのウェブスクレイピングにはどのライブラリを使いますか?

BeautifulSoupはダウンロードしたHTMLを解析・検索します。pyfetchなどのネットワーククライアントがドキュメントを取得し、BeautifulSoupがタグ、属性、またはCSSセレクターで要素を選択します。

BeautifulSoupはJavaScriptサイトをスクレイピングできますか?

BeautifulSoupはサーバーから返されたHTMLを解析しますが、JavaScriptは実行しません。スクリプト実行後にのみ作成される要素は、解析済みドキュメントには表示されません。