Python Beautifulsoup4を使ったWEBからの情報の自動収集

,

 CSコンサルティングではPythonを使った業務自動化・データ収集、解析の支援を行っています。今回はその一例としてPythonのライブラリ「BeautifulSoup4」を使った記事のタイトルとURLを自動収集する方法をご紹介します。ただし、サイトによってはスクレイピングを禁止している、もしくはそのデータの2次使用を禁じているところがありますので十分にご注意ください。また、記事本文の流用は著作権法にふれることがあります。

 今回のサンプルはITmediaの記事を参照いたしましたが、一般的にはRSSで収集ができるので本方法を使う必要はありません。あくまで「どうやって要素を取り出すか」という技術的な解説となります。

◆スクレイピングとは

 スクレイピングとは、WEBサイトからデータを得て、任意の情報を抽出することを言います。そのためのPythonにおけるライブラリがBeautifulsoup4です。BeautifulsoupはHTMLやXMLを解析するライブラリで階層構造になっているタグをたどることによって任意の要素を取り出します。タグには<body> <h1> <p> <a> <div> とかがあります。HTMLから要素を検索するにはfind(), find_all()を使って、タグまたは属性(”div”, id=’xxxx’, class_=’xxxx’)を指定してターゲットとなる要素を取り出します。

◆WEBページの解析 

 WEBページで任意の要素を取り出すための準備として、目的とする要素の前後のタグ構造を理解する必要があります。Microsoft Edgeであれば右クリックで「開発者ツールで調査する」、Google Chromeであれば右クリックで「検証」を選択すると右側に解析されがHTMLが表示されます。それを見てどのタグに記事のタイトルが含まれているかを判断してfind_all()パラメーターを指定します。

上記のHTMLをみると<h3> <a href=”URL” >記事タイトル </a> </h3>  の構造となっていることがわかります。従って、要素をとりだすサンプルコードは下記のようになります。 注)あくまでサンプルですので流用した場合の不具合その他については責任は負いかねます。

import requests
from bs4 import BeautifulSoup

def fetch_titles():
response = requests.get(URL)
response.raise_for_status()
soup = BeautifulSoup(response.content, "html.parser")
headings = soup.find_all("h3")
results = []
for h in headings:
a = h.find("a")
if a and a.get("href"):
title = a.get_text(strip=True)
link = a.get("href")
results.append({"title": title, "url": link})
return results

 短いコードで容易に多くの情報をとりだせることができます。(サンプルコードは Microsoft copilotを参照しております。)

◆記事のキーワードによるフィルタリング

次に自分の興味のある記事だけを抜き出すためにキーワードを設定してフィルタリングすることもできます。

KEYWORDS = ["AI", "経済", "PC","ソニー"]

def filter_news_by_keywords(news_list, keywords):
filtered = []
for news in news_list:
title_lower = news["title"].lower()
if len(title_lower) < 20 : # 記事以外のゴミを除くため
continue
match = False
for keyword in keywords:
if keyword.lower() in title_lower:
match = True
break
if match:
filtered.append(news)
return filtered

 if keyword.lower() in title_lower でタイトルの中にキーワードが含まれているかを判断しています。lower()は大文字を小文字化しています。

◆取り出したデータのExcelへの保存

  次に収集したデータをエクセルに保存するのに、収集した日付を付加してpandasライブラリを利用して保存します。

import pandas as pd
from datetime import datetime

def save_to_excel(news_list, filename="news.xlsx"):
today = datetime.now().strftime("%Y-%m-%d")
df = pd.DataFrame([
    {"date": today, "title": news["title"], "url": news["url"]}
for news in news_list
])
df.to_excel(filename, index=False)
return

df(データフレーム)の行を生成するのに内包表現という繰り返しを使用してます。[{“date”: today, “title”: news[“title”], “url”: news[“url”]} for news in news_list]

 df.to_excel は内部でopenpyxlライブラリを使用しています。ライブラリのインストールが必要となります。これによってpandasのデーターフレームを容易にExcelに変換して保存が可能となっています。

◆業務への応用例

 ・社内向けニュースレターの自動作成

 ・マーケティングレポートの素材収集

 ・クライアント向け情報提供の効率化

◆おわりに

 CSコンサルティングでは、Pythonを活用した業務自動化・データ分析・AI活用の支援を行っています。「自社の情報収集を自動化したい」「業務効率を高めたい」などのご相談があれば、お気軽のお問い合わせください。


トップへ戻る