PythonでWebスクレイピング(BeautifulSoup, Scrapy)
この記事では、Pythonを用いたWebスクレイピングの方法について解説します。BeautifulSoupとScrapyという2つの強力なライブラリを用いて、Webサイトからデータを取得する方法を学びます。それぞれのライブラリの特性や使い分けについても触れます。
目次
BeautifulSoupを使ったWebスクレイピング
BeautifulSoupは、HTMLやXMLを解析するためのPythonライブラリです。手軽にスクレイピングを始められるため、初心者にもおすすめです。requestsライブラリと併用してWebページを取得します。
import requests
from bs4 import BeautifulSoup
url = "https://www.example.com"
response = requests.get(url)
soup = BeautifulSoup(response.content, "html.parser")
title = soup.title.string
print(f"タイトル: {title}")
# 全てのaタグのhref属性を取得
for link in soup.find_all("a"):
print(link.get("href"))
上記コードでは、requestsでWebページを取得し、BeautifulSoupで解析しています。titleタグとaタグを例に、必要な情報を抽出しています。find_allメソッドで複数の要素を取得し、ループ処理で個別に処理することもできます。
Scrapyを使ったWebスクレイピング
Scrapyは、大規模なWebスクレイピングを行うための強力なフレームワークです。BeautifulSoupと比べて、より効率的かつ構造的にスクレイピングできます。Spiderを作成し、クローリングルールを定義します。
# items.py
import scrapy
class ExampleItem(scrapy.Item):
title = scrapy.Field()
url = scrapy.Field()
# spiders/example.py
import scrapy
from ..items import ExampleItem
class ExampleSpider(scrapy.Spider):
name = "example"
start_urls = ["https://www.example.com"]
def parse(self, response):
for article in response.css("article"):
item = ExampleItem()
item['title'] = article.css('h2::text').get()
item['url'] = article.css('a::attr(href)').get()
yield item
Scrapyを使うには、まずプロジェクトを作成し、item.pyとspiderを作成する必要があります。Spiderでは、start_urlsで開始URLを指定し、parseメソッドでデータの抽出ルールを定義します。yieldでItemを返します。scrapy crawl exampleコマンドでスクレイピングを実行し、JSON形式で結果を出力できます。
BeautifulSoupとScrapyの比較
BeautifulSoupはシンプルで手軽に使える一方、大規模なスクレイピングには向いていません。Scrapyは効率的で構造化されたスクレイピングが可能ですが、設定が複雑です。プロジェクトの規模や目的に合わせて適切なライブラリを選択することが重要です。
注意点とエラーハンドリング
Webスクレイピングを行う際には、robots.txtを尊重し、サイトの利用規約に従うことが重要です。また、過剰なリクエストはサイトに負荷をかけるため、適切な間隔でリクエストを送信する必要があります。エラーハンドリングについても考慮し、例外処理を記述することで、プログラムの安定性を高めることができます。
try:
# スクラピング処理
except requests.exceptions.RequestException as e:
print(f"リクエストエラー: {e}")
except Exception as e:
print(f"エラーが発生しました: {e}")
関連記事
- PythonでHTTPリクエストを送信(requests, urllib.request)
- PythonでURLをパース・エンコード・デコード(urllib.parse)
- PythonでJSONを辞書に変換(json.loads)
- Pythonで辞書をJSONに変換(json.dumps)
- PythonでCSVファイルを読み書き(csv)
- PythonでExcelファイルを読み書き (openpyxl, pandas)
- PythonでWebスクレイピング(BeautifulSoup, Scrapy)
- Pythonでtry-except文による例外処理
- Pythonでpdbを使ってデバッグ
- Pythonでprintデバッグ