PythonとAIを使用してニュース記事をスクレイピングする方法

AIやPythonを使用してニューススクレイパーを構築して、見出しや著者などを抽出するか、スクレイパーAPIやデータセットを使用してプロセスを簡略化します。
4 min read
How to Scrape news Articles With Python blog image

このチュートリアルでは以下について説明します。

  • ニューススクレイパーの定義とその有用性
  • それを使ってスクレイピングできるデータの種類
  • Webニューススクレイパーを構築するための最も一般的な2つのアプローチ
  • AIを使ってニューススクレイピングプロセスを構築する方法
  • Pythonでニューススクレイピングスクリプトを作成する方法
  • ニュース記事スクレイピングの課題

さっそく始めましょう!

ニューススクレイパーとは?

ニューススクレイパーは、ニュースサイトからデータを抽出する自動ツールです。見出し、公開日、著者、タグ、記事の内容などの情報を収集します。

ニューススクレイパーは、AIといくつかのWebスクレイピング用のプログラミング言語で構築できます。これらはリサーチ、トレンド分析、ニュース収集ツールの構築に広く使用されており、手動のデータ収集に比べて時間を節約できます。

ニュース記事からスクレイピングするデータ

ニュース記事から抽出できるデータには次のものが含まれます。

  • 見出し:記事のメインタイトルとサブタイトル。
  • 公開日:記事が公開された日付。
  • 著者:コンテンツを書いたライターまたはジャーナリストの名前。
  • コンテンツ:記事の本文。
  • タグ/トピック:記事に関連するキーワードまたはカテゴリ。
  • マルチメディアの添付ファイル:記事に付随する視覚要素。
  • URL:関連記事または参考文献へのリンク。
  • 関連記事:当該の記事に関連する、または類似しているその他のニュース。

ニューススクレイパーの構築方法

ニュース記事からデータを自動的に抽出するソリューションを構築する場合、主に2つのアプローチがあります。

  1. AIを使用したデータ抽出
  2. カスタマイズされたスクレイピングスクリプトの構築

両方の方法を紹介しますので、それぞれの長所と短所を見ていきましょう。詳細な実装手順については、このガイドの後半で説明します。

AIを使用する

このアプローチの背後にある考え方は、ニュース記事のHTMLコンテンツをAIモデルにフィードしてデータ抽出を行うことです。あるいは、ニュース記事のURLをLLM(大規模言語モデル)プロバイダーにフィードして、タイトルやメインコンテンツなどの重要な情報を抽出するように依頼することもできます。

👍 長所

  • ほぼすべてのニュースサイトで利用可能
  • データ抽出プロセス全体を自動化
  • 元のインデント、見出し構造、太字、その他のスタイル要素などのフォーマットを維持可能

👎 短所

  • 高度なAIモデルは独占技術であり、高額になる可能性がある
  • スクレイピングプロセスを完全に制御することはできない
  • 結果にはハルシネーション(不正確または偽造された情報)が含まれる場合がある

カスタマイズされたスクレイピングスクリプトを使用する

ここでの目標は、特定のニュースソースサイトを対象とするスクレイピングボットを手動でコーディングすることです。これらのスクリプトはターゲットサイトに接続し、ニュースページのHTMLを解析し、そこからデータを抽出します。

👍 長所

  • データ抽出プロセスを完全に制御可能
  • 特定の要件を満たすように調整可能
  • サードパーティープロバイダーに依存しないため、費用対効果が高い

👎 短所

  • 設計と保守に技術的知識が必要
  • 各ニュースサイトには専用のスクレイピングスクリプトが必要
  • エッジケース(ライブ記事など)の処理は難しい場合がある

アプローチ1:AIを使ってニュースをスクレイピングする

AIに重労働を代行してもらおうという発想です。これは、クロール機能を備えた最新バージョンのChatGPTのようなプレミアムLLMツールを直接使用するか、AIモデルをスクリプトに統合することで実現できます。後者の場合は、技術的な知識と基本的なスクリプトを書くスキルも必要です。

AIを活用したニューススクレイピングプロセスでは通常、以下のステップが必要です。

  1. データを収集する:HTTPクライアントを使用してターゲットページのHTMLを取得します。クロール機能を備えたChatGPTのようなツールを使用している場合、このステップは自動化されており、ニュースURLをフィードするだけで済みます。
  2. データを前処理する:HTMLを扱う場合は、AIにフィードする前にコンテンツをクリーンアップしてください。これには、不要なスクリプト、広告、またはスタイルの削除が含まれる場合があります。タイトル、著者名、記事本文など、ページの有用な部分に焦点を当ててください。
  3. AIモデルにデータを送信する:ブラウジング機能を備えたChatGPTのようなツールの場合は、記事のURLと精巧なプロンプトを入力するだけ済みます。AIはページを分析し、構造化されたデータを返します。または、クリーンアップされたHTMLコンテンツをAIモデルにフィードし、抽出する情報についての具体的な指示を与えることもできます。
  4. AI出力を処理する:AIの応答は、多くの場合、非構造化または半構造化されています。スクリプトを使用して出力を処理し、目的の形式にフォーマットします。
  5. スクレイピングされたデータをエクスポートする:データベース、CSVファイル、その他のストレージソリューションのいずれであっても、構造化データを任意の形式で保存します。

詳細については、「WebスクレイピングにAIを使用する方法」に関する記事をご覧ください。

アプローチ2:ニューススクレイピングスクリプトの作成

ニューススクレイパーを手動で構築するには、まずターゲットサイトをよく理解しておく必要があります。ニュースページを調べて、その構造、スクレイピングできるデータ、使用するスクレイピングツールを把握しましょう。

シンプルなニュースサイトには、次の2つで十分です。

  • requests:HTTPリクエストを送信するためのPythonライブラリです。Webページの未加工のHTMLコンテンツを取得できます。
  • Beautiful Soup:HTMLやXML文書を解析するためのPythonライブラリです。ページのHTML構造からデータをナビゲートして抽出するのに役立ちます。「Beautiful Soupスクレイピング」のガイドで詳細をご覧ください。

これらをPythonにインストールするには、次を使用します。

pip install requests beautifulsoup4

アンチボット技術を使用しているニュースサイトやJavaScriptの実行が必要なニュースサイトでは、Seleniumなどのブラウザ自動化ツールを使用する必要があります。詳細なガイダンスについては、「Seleniumスクレイピング」に関するガイドを参照してください。

SeleniumをPythonにインストールするには、以下のコマンドを実行してください:

pip install selenium

この場合、プロセスは次のようになります。

  1. ターゲットサイトに接続する:ページのHTMLを取得して解析します。
  2. 関心のある要素を選択する:ページ上の特定の要素(タイトル、コンテンツなど)を識別します。
  3. データを抽出する:これらの要素から必要な情報を引き出します。
  4. スクレイピングされたデータをクリーンアップする:必要に応じて、データを処理して不要なコンテンツをすべて削除します。
  5. スクレイピングされたニュース記事データをエクスポートする:JSONやCSVなどの任意の形式でデータを保存します。

次の章では、CNN、ロイター、BBCからデータを抽出するためのPythonニューススクレイピングスクリプトの例を紹介します。

CNNのスクレイピング

対象ニュース記事:「感謝祭の週末に北極からの突風が襲来、湿った天候が北西部の寒さを和らげる」

これからスクレイピングするCNNの記事

CNNは特定のアンチスクレイピング対策を実施していません。したがって、requestsとBeautiful Soupを使った次のような簡単なスクリプトで十分です。

import requests
from bs4 import BeautifulSoup
import json

# URL of the CNN article
url = "https://www.cnn.com/2024/11/28/weather/thanksgiving-weekend-weather-arctic-storm/index.html"

# Send an HTTP GET request to the article page
response = requests.get(url)

# Parse the HTML content of the page
soup = BeautifulSoup(response.content, "html.parser")

# Extract the title
title_element = soup.select_one("h1")
title = title_element.get_text(strip=True)

# Extract the article content
article_content = soup.select_one(".article__content")
content = article_content.get_text(strip=True)

# Prepare the data to be exported as JSON
article = {
    "title": title,
    "content": content
}

# Export data to a JSON file
with open("article.json", "w", encoding="utf-8") as json_file:
    json.dump(article, json_file, ensure_ascii=False, indent=4)

このスクリプトを実行すると、以下を含むJSONファイルが生成されます。

{
    "title": "Soggy, sloppy conditions smother the chilly Northeast as an Arctic blast takes aim for Thanksgiving weekend",
    "content": "CNN—After the Northeast was hammered by frigid rain or snow on Thanksgiving, a bitter blast of Arctic air is set to envelop much of the country by the time travelers head home this weekend. ... (omitted for brevity)"
}

おめでとうございます!CNNをスクレイピングできました。

ロイターのスクレイピング

対象ニュース記事:「マクロンがパリ・ノートルダム大聖堂の修復に携わった職人を称賛

ロイターには、ブラウザ以外からのリクエストをすべてブロックする特別なアンチボットソリューションが備わっていることに注意してください。requestsまたはその他のPython HTTPクライアントを使用して自動リクエストを作成しようとすると、次のエラーページが表示されます。

<html><head><title>reuters.com</title><style>#cmsg{animation: A 1.5s;}@keyframes A{0%{opacity:0;}99%{opacity:0;}100%{opacity:1;}}</style></head><body style="margin:0"><p id="cmsg">Please enable JS and disable any ad blocker</p><script data-cfasync="false">var dd={'rt':'c','cid':'AHrlqAAAAAMAjfxsASop65YALVAczg==','hsh':'2013457ADA70C67D6A4123E0A76873','t':'fe','s':46743,'e':'da7ef98f4db57c2e85c7ae9df5bf374e4b214a77c73ee80d700757e60962367f','host':'geo.captcha-delivery.com','cookie':'lperXjdnamczWV5K~_ghwm4FDVstzxj76zglHEWJSBJjos3qpM2P8Ir0eNn5g9yh159oMTwy9UaWuWgflgV51uAJZKzO7JJuLN~xg2wken37VUTvL6GvZyl89SNuHrSF'}</script><script data-cfasync="false" src="https://ct.captcha-delivery.com/c.js"></script></body></html>

そのため、ロイターのニュース記事をスクレイピングするには、Seleniumなどのブラウザー自動化ツールを使用する必要があります。その方法は次のとおりです。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
import json

# Initialize the WebDriver
driver = webdriver.Chrome(service=Service())

# URL of the Reuters article
url = "https://www.reuters.com/world/europe/excitement-relief-paris-notre-dame-cathedral-prepares-reopen-2024-11-29/"

# Open the URL in the browser
driver.get(url)

# Extract the title from the <h1> tag
title_element = driver.find_element(By.CSS_SELECTOR, "h1")
title = title_element.text

# Select all text elements
paragraph_elements = driver.find_elements(By.CSS_SELECTOR, "[data-testid^=\"paragraph-\"]")

# Aggregate their text
content = " ".join(p.text for p in paragraph_elements)

# Prepare the data to be exported as JSON
article = {
    "title": title,
    "content": content
}

# Export data to a JSON file
with open("article.json", "w", encoding="utf-8") as json_file:
    json.dump(article, json_file, ensure_ascii=False, indent=4)

上記のスクリプトを起動してもブロックされない場合、出力は次のarticle.jsonファイルになります。

{
    "title": "Macron lauds artisans for restoring Notre-Dame Cathedral in Paris",
    "content": "PARIS, Nov 29 (Reuters) - French President Emmanuel Macron praised on Friday the more than 1,000 craftspeople who helped rebuild Paris' Notre-Dame Cathedral in what he called \"the project of the century\", ... (omitted for brevity)"
}

素晴らしい!ロイターのスクレイピングを実行できました。

BBCのスクレイピング

対象ニュース記事:「ブラックフライデー:お得なセールを見抜いて不当に高い商品を避ける方法

これからスクレイピングするBBCの記事

CNNと同様、BBCにも特定のボット対策ソリューションはありません。したがって、次のようなHTTPクライアントとHTMLパーサーの組み合わせを使用する単純なスクレイピングスクリプトで十分でしょう。

import requests
from bs4 import BeautifulSoup
import json

# URL of the BBC article
url = "https://www.bbc.com/news/articles/cvg70jr949po"

# Send an HTTP GET request to the article page
response = requests.get(url)

# Parse the HTML content of the page
soup = BeautifulSoup(response.content, "html.parser")

# Extract the title
title_element = soup.select_one("h1")
title = title_element.get_text(strip=True)

# Extract the article content
article_content_elements = soup.select("[data-component=\"text-block\"], [data-component=\"subheadline-block\"]")

# Aggregate their text
content = "\n".join(ace.text for ace in article_content_elements)

# Prepare the data to be exported as JSON
article = {
    "title": title,
    "content": content
}

# Export data to a JSON file
with open("article.json", "w", encoding="utf-8") as json_file:
    json.dump(article, json_file, ensure_ascii=False, indent=4)

実行すると、次のarticle.jsonファイルが生成されます。

{
    "title": "Black Friday: How to spot a deal and not get ripped off",
    "content": "The Black Friday sales are already in full swing and it can be easy to get swept up in the shopping frenzy and end up out of pocket - instead of bagging a bargain... (omitted for brevity)"
}

素晴らしい!BBCをスクレイピングできました。

ニューススクレイピングの課題とその克服方法

上の例では、いくつかのニュースサイトをターゲットにして、それらの記事からタイトルとメインコンテンツのみを抽出しました。このシンプルさのせいで、ニュースのスクレイピングが簡単なように見えたかもしれません。実際には、ほとんどのニュースサイトが積極的にボットを検出してブロックしているため、はるかに複雑です。

ウォール・ストリート・ジャーナルのCAPTCHA

考慮すべき課題には次のようなものがあります。

  • スクレイピングされた記事の適切な見出し構造が保たれるようにすること
  • タイトルやメインコンテンツだけでなく、タグ、著者、公開日などのメタデータを取得すること
  • スクレイピングプロセスを自動化して、さまざまなWebサイトの複数の記事を効率的に処理すること

これらの課題に対処するには、次の方法があります。

  • 高度なテクニックを学ぶ:「Pythonを使用したCAPTCHAのバイパス」に関するガイドをチェックし、実用的なヒントについてはスクレイピングチュートリアルをご覧ください。
  • 高度な自動化ツールを使う:ボット対策メカニズムを備えたサイトをスクレイピングするには、Playwright Stealthのような堅牢なツールを使用してください。

とは言え、最善の解決策は専用のニューススクレイパーAPIを活用することです。

Bright DataのニューススクレイパーAPIは、BBC、CNN、ロイター、Googleニュースなどのトップニュースソースをスクレイピングするための、オールインワンで効率的なソリューションを提供します。このAPIでは、次のことが可能になります。

  • ID、URL、ヘッドライン、著者、トピックなどの構造化データの抽出
  • インフラストラクチャ、プロキシサーバー、Webサイトのブロックを心配することなくスクレイピングプロジェクトを拡張
  • ブロックや中断がなくなる

ニューススクレイピングプロセスを合理化し、本来の目的であるデータの分析に集中しましょう!

まとめ

この記事では、ニューススクレイパーとは何か、またニュース記事から取得できるデータの種類について説明しました。加えて、AIベースのソリューションまたは手動スクリプトを使用してソリューションを構築する方法も確認しました。

ニューススクレイピングスクリプトがどれほど洗練されていても、ほとんどのサイトでは自動アクティビティを検出してアクセスをブロックすることができます。この課題の解決策は、さまざまなプラットフォームからのニュースデータの確実な抽出に特化して設計された、専用のニューススクレーパーAPIです。

これらのAPIは、各ニュースソースに合わせた構造化された包括的なデータを提供します。

  • CNN Scraper API:見出し、著者、トピック、公開日、コンテンツ、画像、関連記事などのデータを抽出します。
  • Google News Scraper API:見出し、トピック、カテゴリー、著者、公開日、ソースなどの情報を収集します。
  • Reuters Scraper API:ID、URL、著者、見出し、トピック、公開日などを含むデータを取得します。
  • BBC Scraper API:見出し、著者、トピック、公開日、コンテンツ、画像、関連記事などの詳細を収集します。

スクレイパーを構築したくない場合は、当社のすぐに使えるニュースデータセットをご検討ください。これらのデータセットは事前にコンパイルされており、次のような包括的なレコードが含まれています。

  • BBC News数万件のレコードを含む、すべての主要なデータポイントをカバーするデータセット。
  • CNN News:数十万件のレコードを含む、すべての重要なデータポイントを含むデータセット。
  • Google News:数万件のレコードを含む、すべての重要なデータポイントをカバーするデータセット。
  • Reuters News数十万件のレコードを含む、すべての主要なデータポイントをカバーするデータセット。

当社が提供するジャーナリスト向けのデータセットをすべてご覧ください。

今すぐ無料のBright Dataアカウントを作成して、当社のスクレイパーAPIをお試しいただくか、当社のデータセットをじっくりご覧ください。

クレジットカードは必要ありません