PythonでBeautifulSoupを使ってWebスクレイピングをするには?

反応する:

コメント

を作る ウェブスクレイピング Pythonで BeautifulSoup, 必要なライブラリは2つあります: requests ウェブページをダウンロードするには、そして beautifulsoup4 HTMLコードからデータを抽出するために。.

次のコマンドでそれらをインストールしてください pip install requests beautifulsoup4, 、その後、以下のガイドに従って、サイトを段階的にスクレイピングしてください。.

BeautifulSoup を使用したウェブスクレイピングの Python スクリプト:ウェブページからデータを抽出する
BeautifulSoupでPythonでWebスクレイピング。Alucare.frのクリスティーナ

PythonでBeautifulSoupを使ってスクレイピングするための前提条件

始めるにあたって、専門家である必要はありません。スクリプトを読んで実行できれば十分です。 Python 始めるには十分すぎるほどです。.

開始するには、以下のものをインストールする必要があります:

  • インストール Python および開発環境。
  • インストール pip, 、1つのコマンドでPythonライブラリを追加できるツールです。.
  • インストール BeautifulSoup :
pip install beautifulsoup4

パッケージ名にご注意ください: PyPI, 、そうですね beautifulsoup4 記述する必要があります。コードにインポートするモジュールの名前は bs4.

  • インストール Requests ウェブページをダウンロードするには:
pip install リクエスト
  • インストール lxml (オプション)、BeautifulSoupがHTMLの解析に使用する、より高速なパーサー:
pip install lxml

PythonとBeautifulSoupでウェブスクレイピングをするには?

以下は、~を回収するための完全なプロジェクトです。 タイトル ウェブページとすべての リンク そこに含まれているもの。.

BeautifulSoupライブラリを使用したHTMLデータ抽出のためのウェブスクレイピング用Pythonスクリプト
Pythonを使ったウェブスクレイピング BeautifulSoup. ©Christina(Alucare.fr)

ステップ 1: リクエストでページの内容を取得する

ウェブページをダウンロードするには、次のリクエストを送信します。 HTTP GETリクエスト URL へ。これがライブラリの役割です。 Requests.

リクエストがあるたびに、サーバーは ステータスコード すべてがうまくいったかどうかを示すものです。知っておくべき主なものは以下の通りです:

  • 200 成功した。
  • 301 / 302 リダイレクション。
  • 404 ページが見つかりません。
  • 500 内部サーバーエラー。

と Requests, この結果は属性を使って確認します .status_code. 具体的な例を挙げましょう。このコードは、あるサイトへリクエストを送信し、ステータスコードを確認した後、問題がなければHTMLコンテンツの一部を表示します。.

輸入リクエスト

# 対象URL
url = "https://bonjour.com"

# GETリクエストを送る
レスポンス = requests.get(url)

# ステータスコードをチェックする
if response.status_code == 200:
    print("成功: ページが取得されました!")
    html = response.text # ページのHTMLコンテンツ
    print("HTMLコンテンツの抜粋:")
    print(html[:500]) #は最初の500文字だけを表示する
else:
    print(f "エラー: ステータスコード {response.status_code}")

ステップ2:BeautifulSoupでHTMLコードを分析する

次のようにしてページのコンテンツを取得するときは レスポンステキスト, すると単純な文字列が得られます:すべての HTMLコード ページ上にはあるが、現状では利用できない。これを簡単に操作するには、オブジェクトを作成する BeautifulSoup, 、この生のHTMLを、閲覧・解析可能な構造に変換するものです。.

常に次のことを示す パーサー, 、例えば 「html.parser. すると、BeautifulSoupは警告を表示することなく、HTMLを正しく解析します。また、次のようにすることもできます。 lxml, 、より高速で、別途インストールする必要があります。.

from bs4 import BeautifulSoup
インポートリクエスト

url = "https://bonjour.com"
レスポンス = requests.get(url)
html = response.text

# パーサを指定することを推奨する
soup = BeautifulSoup(html, "html.parser")

ステップ3:要素の検索と抽出

HTMLは現在、BeautifulSoupのオブジェクトとなっています。以下の要素を検索して取得することができます。 データ 興味のあるタグを、タグごとに指定してください。3つの方法で、ほとんどのニーズに対応できます。.

find() と find_all() の使用

find() を返す 最初の要素 見つかった。. find_all() を返す 全リスト 対応する要素。.

# タイトルを検索 <h1>
h1 = soup.find("h1")
print(h1.get_text())

# すべてのリンクを取得する <a>
liens = soup.find_all("a")
for lien in liens:
    print(lien.get_text(), lien.get("href"))

属性による要素のターゲティング

HTML属性に基づいて検索を絞り込むことができます。例えば、 クラス, ID あるいは、それ以外のどれでも。. 注意します : Pythonでは、次のように記述します クラス そしていいえ クラス, 、言語の予約語との衝突を避けるため。.

# 特定のIDを持つdivを取得する
container = soup.find("div",)

# 特定のクラスを持つすべてのリンクを取得する
nav_links = soup.find_all("a", class_="nav-link")

select() での CSS セレクタの使用

より詳細な検索を行うには、以下の方法があります。 セレクト 受け付ける CSSセレクタ. ページ全体のHTMLを手作業で調べる必要はなく、特定の部分を正確に指定できます。.

# 記事タイトルの全リンク
article_links = soup.select("article h2 a")

# 全て <a> href属性が "http "で始まるもの。
links_http = soup.select('a[href^="http"]')

BeautifulSoupを使用してHTMLテーブルからデータを抽出する方法

PythonのBeautifulSoupを使用してHTMLテーブルからデータを抽出する
BeautifulSoupを使用してHTMLテーブルからデータを抽出する。©Christina for Alucare.fr

実際のユースケースは、単にタイトルやリンクを取得するだけよりも、多くの場合、より複雑です。あなたは、その’構造化データ抽出 表やリストと同様に、 ページ番号, 、およびスクレイピングでよくある間違い。.

表とリストの抽出

ウェブサイトは多くの場合、データを HTMLテーブル (<table>, <tr>, <th>, <td>または リスト (

    /
      と
    1. 。). これらの構造を実用的なデータに変換するには、行ごと、あるいは要素ごとに処理していく必要があります。.

      あるものを抽出するには HTMLテーブル原理は単純だ:

      • ヘッダーを取得する (<th>)で列見出しを識別する。
      • 各行を順に確認する (<tr>)とセルの検索(<td>) データが含まれているもの。.
      • 情報をリストまたは辞書に格納する。.

      の場合 HTMLリスト (

        どこ
          ) :

          • すべてのタグを特定する
          • 。 と find_all.
          • それらのコンテンツ(テキストまたはリンク)を取得し、Pythonのリストに追加する。.

          これはテーブルを使った例である:

          html = """
          <table>
            <tr>
              <th>苗字</th>
              <th>年齢</th>
              <th>街</th>
            </tr>
            <tr>
              <td>アリス</td>
              <td>25</td>
              <td>パリ</td>
            </tr>
            <tr>
              <td>ボブ</td>
              <td>30</td>
              <td>リヨン</td>
            </tr>
          </table>
          """
          
          # BeautifulSoupオブジェクトの作成
          soup = BeautifulSoup(html, "html.parser")
          
          # 配列からヘッダーを取り出す
          headers = [th.get_text(strip=True) for th in soup.find_all("th")] ヘッダーを配列から取り出す。
          print("Headers:", headers)
          
          # データの行を取り出す(1行目はヘッダーなのでスキップする)
          行 = [].
          for tr in soup.find_all("tr")[1:]:
              cells = [td.get_text(strip=True) for td in tr.find_all("td")].
              if cells:
                  rows.append(cells)
          
          print("Lines :", rows)
          

          ここだよ、 find_all("th") を取得する ヘッダー と find_all("td") 各行のセルを取得します。以下の行をループ処理します。 <tr> を使用して、テーブルを行ごとに再構築する。

          以下はリストに基づいた例である:

          from bs4 import BeautifulSoup
          
          html_list = ""
          
          • アップル</li
          • バナナ</li
          • オレンジ</li </ul """ soup = BeautifulSoup(html_list, "html.parser") # リストからアイテムを取り出す items = [li.get_text(strip=True) for li in soup.find_all("li")]。 print("Extracted list:", items) # ["Apple", "Banana", "Orange"].

          それぞれ

        1. 。 は直接、 Pythonのリスト要素, 、これにより次の結果が得られる [アップル」、「バナナ」、「オレンジ」]。.

          ページネーションとリンクの管理

          多くの場合、データは1ページに収まりきらない。それらはリンクを介して 「次のページ」 または 番号付きページネーション (?page=1, ?page=2, 、など)。どちらの場合も、あなたは カール すべてのページを取得し、データを統合するため。.

          「page」パラメータを用いた例:

          インポートタイム
          インポート リクエスト
          from bs4 import BeautifulSoup
          
          # ページネーション付きURLの例
          base_url = "https://bonjour.com/articles?page={}"
          HEADERS = {"User-Agent": "Mozilla/5.0"}.
          
          all_articles = [] (すべての記事)
          
          # 閲覧するページが5つあると仮定する
          for page in range(1, 6):
              url = BASE_URL.format(page)
              r = requests.get(url, headers=HEADERS, timeout=20)
              if r.status_code == 200:
                  soup = BeautifulSoup(r.text, "html.parser")
                  # 記事タイトルを抽出する
                  articles = [h2.get_text(strip=True) for h2 in soup.find_all("h2", class_="title")].
                  all_articles.extend(articles)
              else:
                  print(f "ページ{page}でエラー(コード:{r.status_code})")
              time.sleep(1.0) # 丁寧さ
          
          print("Articles retrieved:", all_articles)

          手順ごとの簡単な説明:

          • ~を準備する’URL 駐車場付き {} ページ番号を挿入するには。.
          BASE_URL = "https://bonjour.com/articles?page={}
          • 一部のサイトでは、ブラウザの識別情報がないリクエストをブロックします。 User-Agent ボットと間違われないようにしましょう。.
          headers = {"User-Agent": "Mozilla/5.0"}.
          requests.get(url, headers=headers) 
          • ページのループ 1~5.
          for page in range(1, 6):
          • 次のコードでページのHTMLを取得します requests.
          requests.get(url)
          • サイトが応答しない場合の待機時間を制限する(20秒のタイムアウト).
          requests.get(url, timeout=20)
          • このページを以下のツールで分析する BeautifulSoup.
          BeautifulSoup(response.text、"html.parser")
          • すべての 記事の見出し.
          find_all("h2", class_="title")
          • 見つかった記事を総合リストに追加します。.
          all_articles.extend(articles)
          • 「」を入力してください 休憩 各リクエストの間に間隔を空けて、サーバーに過度な負荷をかけず、アクセス禁止にならないようにしてください。.
          time.sleep(1.0)

          ループの後 すべての記事 を含む 全5ページのタイトル.

          よくある過ちと課題

          スクレイピングは、単にボタンを押すだけのものではありません。以下のような障害に頻繁に直面することになります:

          • HTTPエラー : 404 (ページが見つかりません)、, 403 (立ち入り禁止)および 500 (サーバー側のエラー)。.

          管理の例:

          response = requests.get(url)
          if response.status_code == 200:
              print("ページを正常に取得しました")
          elif response.status_code == 404:
              print("エラー:ページが見つかりません")
          else:
              print("返されたステータスコード:", response.status_code)
          
          • スクレイピングをブロックするサイト : 自動リクエストを検知してアクセスをブロックするものもあります。.
          • 動的ページ(JavaScript) : BeautifulSoup ~のみを読み取る 静的HTML. ページがJavaScriptを使ってコンテンツを読み込む場合、何も表示されません。その場合は、次のようなツールを使用する必要があります。 Selenium どこ Playwright.

          ブロックされたりサイトを破損させたりすることなく、効率的にスクレイピングを行うためのベストプラクティスは以下の通りです:

          • 以下の事項を遵守してください robots.txtファイル 分析したいサイトの。.
          • 以下のものを導入する 締め切り クエリ間で time.sleep() サーバーに過度な負荷がかからないようにするため。.
          • 以下のものを使用する 代理人 そして、それらを回して。.
          • 定期的に変更して User-Agent.

          SeleniumとBeautifulSoupでウェブをスクラップするには?

          Pythonを使用して、Chrome上でSeleniumとBeautifulSoupを用いたウェブスクレイピングを行う。.
          SeleniumとBeautifulSoupを使ったChromeでのWebスクレイピング。Alucare.frのクリスティーナ

          Selenium 実際のブラウザを操作する, JavaScriptを実行し、まるで人間が閲覧しているかのようにページを表示します。. BeautifulSoup その後、ページが完全にレンダリングされたらHTMLを解析し、必要なデータをすべて抽出します。.

          ステップ1:SeleniumとBeautifulSoupをインストールする

          ここでは、~の代わりに requests, 、あなたは Selenium ページの内容を取得するためです。次のコマンドで2つのライブラリをインストールしてください:

          pip install selenium beautifulsoup4

          次に、次のものをダウンロードする必要があります。 WebDriver お使いのブラウザのバージョンに合わせて調整されています。Google Chromeの場合は、 ChromeDriver. 選択肢は2つあります:Pythonスクリプトと同じフォルダに配置するか、あるいは’環境変数PATHに追加する お使いのシステム。.

          ステップ 2: Seleniumの設定

          まずはインポートから始めましょう webdriver Seleniumを使用してブラウザを操作する。.

          from selenium import webdriver
          from selenium.webdriver.common.by import By

          次に、ブラウザを起動します。ブラウザがページを開き、 JavaScriptを実行する, 、ここではChrome。.

          driver = webdriver.Chrome()

          ブラウザにどの URL 訪れる。.

          driver.get("https://www.exemple.com")

          ページ上の特定の要素の表示に時間がかかる場合は、Seleniumに最大 10秒.

          driver.implicitly_wait(10)

          ステップ3:ページ・コンテンツの取得

          ページが読み込まれたら、 フルDOM : JavaScriptの実行後に生成されたHTMLソースコード。.

          html_content = driver.page_source

          ステップ4:BeautifulSoupによるHTML解析

          このソースコードを今すぐ ビューティフル・スープ これを利用するには:

          from bs4 import BeautifulSoup
          
          # BeautifulSoupオブジェクトの作成
          soup = BeautifulSoup(html_content, 'html.parser')
          
          # 例:ページ内のすべての見出しを取得する
          titres = soup.find_all('h2')
          for titre in titres:
              print(titre.get_text())

          BeautifulSoupには、次のような強力なメソッドが用意されています。 find(), find_all() および、以下の要素に対するCSSセレクタ 特定して抽出する HTMLの具体的な要素。.

          ステップ5:ブラウザを閉じる

          非常に重要:実行後は必ずブラウザを閉じてください。 リソースを解放する.

          ドライバー終了()

          こうして、あなたは Selenium 為に ヒューマン・ナビゲーションをシミュレート (クリック、スクロール)と、HTML解析におけるBeautifulSoupの効率性を兼ね備えています。これは、JavaScriptでデータを読み込むサイトをスクレイピングするのに最適な方法です。.

          よくある質問

          Pythonでウェブスクレイピングをするのに最適なツールは?

          ~はありません’削り器 汎用的なものではなく、あなたのプロジェクトに合わせたソリューションです。以下に、最もよく使われている3つを紹介します:

          • BeautifulSoup : HTMLを解析してコンテンツを素早く抽出するのに、シンプルで効果的です。初心者の方や小規模なプロジェクトには最適です。.
          • Scrapy : 以下の管理を目的として設計された、包括的なフレームワーク 大量データ 高度な機能を備えています。.
          • Playwright : JavaScriptで生成される複雑なサイトに最適です。実際のブラウザをシミュレートし、人間と同じようにページとやり取りします。.

          BeautifulSoupを使ってdivタグの内容を抽出するにはどうすればよいですか?

          と BeautifulSoup, 特定のタグをターゲットにするには、 CSSセレクタ. タグの内容を取り出すには <div>, 、以下の手順に従ってください。.

          1. 以下の方法でウェブページを取得する requests, 、その後、HTMLを以下の方法で解析する BeautifulSoup.

          from bs4 import BeautifulSoup
          import requests
          
          url = "URL_DE_TON_SITE"  # Remplace par l'URL réelle
          reponse = requests.get(url)
          html_content = reponse.text
          
          soup = BeautifulSoup(html_content, "html.parser")

          2. この方法を使う セレクト CSSセレクタを使ってタグを指定する <div>.

          最初の要素を取得するには、以下を使用してください スープ.select_one. すべての要素を取得するには、以下を使用してください スープセレクト. 以下にHTMLコードの例を示します:

          <div>
            <h2>Titre de l'article</h2>
            <p>Voici le contenu du paragraphe.</p>
          </div>

          では、CSSのセレクタを使った例をご紹介します div.article :

          # Récupérer le premier div avec la classe "article"
          div_article = soup.select_one("div.article")
          
          # Afficher son contenu texte
          if div_article:
              print(div_article.get_text(strip=True))

          3. 中の要素を取り出す <div>.

          # Récupérer le titre à l'intérieur du div
          titre = soup.select_one("div.article h2").get_text()
          
          # Récupérer le paragraphe à l'intérieur du div
          paragraphe = soup.select_one("div.article p").get_text()
          
          print("Titre :", titre)
          print("Paragraphe :", paragraphe)

          RequestsとBeautifulSoupはどのように併用できますか?

          これら2つのライブラリは 追加 :一方はページを読み込み、もう一方はそれを解析する。.

          1. requests HTTPリクエストを送信し、 生のHTMLコード ページの

          import requests
          
          url = "https://sitecible.com"
          response = requests.get(url)  # requête HTTP
          print(response.text)  # affiche le HTML brut

          現時点では、タグだらけの巨大なテキストしかありません(<html>, <div>, <p>など)。

          2. BeautifulSoup この生のHTMLを解析し、それを 組織的な構造. そうすれば、ページ内を移動してタグを見つけ、データを取得することができます。.

          from bs4 import BeautifulSoup
          
          soup = BeautifulSoup(response.text, "html.parser")  # analyse le HTML
          titre = soup.find("h1").get_text()  # extrait le contenu d'un <h1>
          print(titre)

          私のウェブ・スクレイピング・コードが一部のサイトで機能しないのはなぜですか?

          スクリプトが何も取得できない場合があります。一部のサイトでは、コンテンツのすべてを直接HTML形式で提供しておらず、代わりに JavaScript データを動的に読み込むためです。しかし、, BeautifulSoup JavaScriptによって返されたデータを分析できない. その場合は、次のようなツールを活用する必要があります。 Playwright どこ Selenium.

          ウェブスクレイピングにおいてBeautifulSoupはどのような役割を果たすのか?

          BeautifulSoup ~の役割を果たす’HTMLパーサー. ページのコードを、簡単に閲覧できる構造化されたオブジェクトに変換します。つまり、これは 生のHTMLとPythonコード間の変換ツール.

          ウェブスクレイピング:BeautifulSoupとScrapy、どちらが良いか?

          BeautifulSoup と Scrapy は、どちらも~に用いられるとはいえ、実に異なっています。 ウェブスクレイピング.

          BeautifulSoup Scrapy
          HTMLを解析してデータを抽出するためだけのシンプルなライブラリ。 スクレイピングの全プロセス(リクエスト、リンクの追跡、ページネーション、データのエクスポート、エラー処理)を管理する包括的なフレームワークです。.

          BeautifulSoup 初心者には最適な選択肢です。これにより、’PythonによるHTMLデータ抽出 簡単で手っ取り早い。.

          コードの量をできるだけ減らしたい場合は、このツール ブライトデータ コーディングの手間を軽減するために、すぐに使えるデータセットを提供しています。.

          👍あなたの意見
          記事は参考になる
          記事は客観的である
          記事は私の質問に答えている
          コンテンツは最新
          エラーが見つかりましたか? 場所を教えてください!

気に入りましたか?シェアする

このコンテンツはもともと フランス語で (すぐ下のエディタを参照)。DeeplやGoogle翻訳APIを使用して様々な言語で翻訳・校正されており、できるだけ多くの国で利用できるようになっています。この翻訳には毎月数千ユーロのコストがかかっています。もし100 %が完璧でない場合は、コメントを残していただければ修正いたします。校正や翻訳記事の品質向上にご興味のある方は、お問い合わせフォームからメールをお送りください!
私たちは、私たちのコンテンツを改善するためにあなたのフィードバックに感謝します。ご意見・ご感想は、お問い合わせフォームまたは下記までお寄せください。 あなたのコメントは、私たちのウェブサイトAlucare.frの品質を向上させるために常に役立ちます。


Alucareは独立系メディアです。Googleニュースのお気に入りに追加して応援してください:

ディスカッション・フォーラムにコメントを投稿する