PYTHON MEBY

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}")

関連記事