はじめに
Webスクレイピングは、Webサイトからデータを取得してプログラムで処理する技術です。Pythonでは「Beautiful Soup」と「Requests」ライブラリを使うことで、簡単にWebページのデータを収集できます。この記事では、Beautiful SoupとRequestsを使ってWebページから特定のデータを抽出する基本的な方法を紹介します。
Webスクレイピングでの準備:ライブラリのインストール
Webスクレイピングには、まず必要なライブラリをインストールする必要があります。以下のコマンドでインストールを行います。
pip install requests beautifulsoup4
- Requests:WebページにHTTPリクエストを送り、ページのHTMLソースを取得します。
- Beautiful Soup:HTMLソースを解析し、必要なデータを抽出します。
Beautiful SoupとRequestsを使った基本のWebスクレイピング
まずは、RequestsでWebページのHTMLソースを取得し、Beautiful Soupで解析する基本的な流れを確認しましょう。
import requests
from bs4 import BeautifulSoup
# スクレイピング対象のURL
url = "https://example.com"
# HTTPリクエストを送信してHTMLを取得
response = requests.get(url)
# BeautifulSoupでHTMLを解析
soup = BeautifulSoup(response.text, 'html.parser')
# タイトルタグを取得して表示
print(soup.title.text)
コードの解説
requests.get(url)
で指定したURLにリクエストを送り、HTMLデータを取得します。BeautifulSoup(response.text, 'html.parser')
でHTMLをパースし、解析できる形に変換します。soup.title.text
で<title>
タグ内のテキストを抽出します。
Webページから特定の要素を取得する方法
次に、Webページの中から特定のタグやクラスを持つ要素を取得する方法について見ていきましょう。
特定のタグを取得
以下のコードでは、ページ内のすべての<h2>
タグを取得し、その内容を表示します。
for header in soup.find_all('h2'):
print(header.text)
特定のクラスを持つ要素を取得
クラス名を指定して特定の要素だけを抽出したい場合には、find_all()
メソッドにclass_
引数を使用します。
# クラス名 'example-class' を持つすべてのdiv要素を取得
elements = soup.find_all('div', class_='example-class')
for element in elements:
print(element.text)
class_
の「_」はPythonの予約語とクラス名が重ならないようにするためのもので、クラス名そのものには含まれません。
特定の属性値を持つ要素の取得
リンクや画像のURLを取得したい場合、特定の属性値(例えば、href
やsrc
)を指定して情報を取得することも可能です。
# ページ内のすべてのリンク(aタグ)のhref属性を取得
for link in soup.find_all('a'):
print(link.get('href'))
上記のコードでは、ページ内の<a>
タグからすべてのhref
属性を取り出しています。
実践例:ニュースサイトの見出しをスクレイピング
次に、実際のニュースサイトの見出し一覧を取得する例を示します。ここでは例として「Example News」という架空のサイトを想定しています。
url = "https://example-news.com"
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
# ニュース見出しを持つクラスを指定して見出しを取得
headlines = soup.find_all('h3', class_='news-headline')
for headline in headlines:
print(headline.text)
このように特定のクラスを指定することで、目的の見出しだけを効率よく抽出できます。
Webスクレイピングの注意点
サイトの利用規約を確認する
スクレイピングを行う際は、対象サイトの利用規約やrobots.txtファイルを確認し、スクレイピングが許可されているかを必ずチェックしてください。違法なスクレイピングは法律に抵触する恐れがあります。
リクエスト間隔を設ける
一度に大量のリクエストを送ると、サーバーに負担をかけてしまいます。例えば、time.sleep()
を使ってリクエスト間隔を設けると、サーバーへの負荷を軽減できます。
import time
# 1秒間隔を空けながらページのリンクを取得
for i in range(10):
# ここでページデータの取得や処理を行う
time.sleep(1)
まとめ
この記事では、Pythonを使ったWebスクレイピングの基本について解説しました。RequestsとBeautiful Soupを組み合わせることで、シンプルにデータを取得し、必要な情報を抽出することができます。ただし、スクレイピングはリソースの許可と適切なリクエスト制御が重要ですので、対象サイトの規約を守りつつ活用してください。
Webスクレイピングに慣れてきたら、さらに高度な操作やAPIの活用も視野に入れてみてください。