🔍

【学習ログ】スクレイピングの始め方

2025/02/28に公開

スクレイピングの基本

スクレイピングとは、プログラムを使ってWebサイトのデータを自動的に取得し、加工・分析する技術のことです。そのため、スクレイピングを使えば、以下のようなことができます。

  • ニュースサイトから最新の見出しを取得
  • ECサイトから商品の価格を取得して比較
  • SNSや旅行サイトなどの投稿を集めてトレンド分析

スクレイピングのルールと注意点

スクレイピングは便利ですが、ルールを守らないと法的リスクやアクセス制限を受けることがあります。

  1. robots.txtを確認する
    ・Webサイトには「robots.txt」というファイルがあり、スクレイピングを許可・禁止するルールが記載されています。
    ・各サイトのhttps://〇〇.com/robots.txt にアクセスすると、そのサイトのスクレイピングポリシーを確認することができます。
スクレイピングポリシーの重要な記述パターン

Disallow: / → サイト全体のスクレイピングが禁止
Disallow: /directory/ → 特定ディレクトリ以下が禁止
Allow: / → サイト全体のスクレイピングが許可

  1. 利用規約をチェック
    ・Webサイトによっては、利用規約でスクレイピングを明確に禁止している場合があります。
  2. 過剰なリクエストは送らない
    ・短時間で大量のアクセスをすると、サーバーに負荷をかけてしまい、IPをブロックされる可能性があります。
  3. APIがあるならAPIを使う
    ・Webサイトによっては公式APIを提供しており、スクレイピングせずにデータを取得できる場合があります。その場合はAPIを使いましょう。

スクレイピングの実装方法

ライブラリーのインストール手順

まずは、必要なライブラリをインストールします。

pip install requests beautifulsoup4

ライブラリーの概要は以下の通りです。

requests:WebページのHTMLを取得 
BeautifulSoup:HTMLを解析し、必要なデータを抽出

今回はスクレイピング練習専用のサイト(https://books.toscrape.com)から情報を取得してきました。

コード

main.py
import requests
from bs4 import BeautifulSoup

def scrape_webpage(url):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
    }
    
    try:
        # ページの取得
        response = requests.get(url, headers=headers, timeout=30)
        # 文字化けを防ぐ
        response.encoding = response.apparent_encoding
        # HTMLの解析
        soup = BeautifulSoup(response.text, 'html.parser')
        
        # 本の情報を取得
        books = []
        for book in soup.select('article.product_pod'):
            title = book.h3.a['title']  # 本のタイトルを取得
            price = book.select_one('p.price_color').text  # 価格を取得
            books.append({
                'title': title,
                'price': price
            })
        
        result = {
            'page_title': soup.title.text.strip() if soup.title else '',
            'books': books
        }
        
        return result
    
    except requests.RequestException as e:
        print(f"エラーが発生しました: {e}")
        return None

if __name__ == "__main__":
    # スクレイピング対象のURL
    target_url = "https://books.toscrape.com/"
    
    # スクレイピングの実行
    result = scrape_webpage(target_url)
    
    if result:
        print("=== Webページの情報 ===")
        print(f"ページタイトル: {result['page_title']}")
        print("\n=== 本の一覧 ===")
        for i, book in enumerate(result['books'], 1):
            print(f"{i}. タイトル: {book['title']}")
            print(f"   価格: {book['price']}")

実行

ターミナル上でこちらを実行すると

python main.py

以下のような情報を取得することができます。

=== Webページの情報 ===
ページタイトル: All products | Books to Scrape - Sandbox

=== 本の一覧 ===
1. タイトル: A Light in the Attic
   価格: £51.77

2. タイトル: Tipping the Velvet
   価格: £53.74

(以下続く...

まとめ

今回はPythonの勉強の一環で、スクレイピングを初めて実装してみました。思っていたより、スムーズに情報の取得ができ、工夫次第では色々なデータを取得することができるなと感じました。今後は、他のサイトのデータを取得したり、取得したデータをExcelに保存してデータの分析などを行いたいです。

参考文献

https://www.tohoho-web.com/wwwxx079.htm
https://note.com/brave_kalmia697/n/nec94245044bc
https://supersoftware.jp/tech/20221102/17953/

ヘッドウォータース

Discussion