PythonによるWebスクレイピング入門

1. 前提条件

学習者はPythonの基礎知識(数値型・文字列型・分岐・ループ・関数・リスト型・辞書型・ファイル操作・外部ライブラリ利用)を習得している必要があります。

2. Webスクレイピング基本プロセス

  1. HTTPリクエスト送信
    requestsライブラリでターゲットサイトにリクエストを送信します。リクエストにはヘッダーとボディが含まれますが、JavaScript/CSS実行機能は持たない制限があります。
  2. レスポンス受信
    サーバー側がHTML、JSON文字列、画像などを含むレスポンスを返します。
  3. コンテンツ解析
    正規表現やBeautifulSoup、pyquery等の解析ライブラリで目的データを抽出します。
  4. データ保存
    抽出したデータをテキスト、音声、動画形式でローカルに保存するか、MySQL、MongoDB、Redis等のデータベースに格納します。

3. Requestsライブラリ活用

import requests
画像URL = "http://www.xiaohuar.com/d/file/20141116030511162.jpg"
保存ディレクトリ = "D://pics//"
保存パス = 保存ディレクトリ + 画像URL.split('/')[-1]

try:
    if not os.path.exists(保存ディレクトリ):
        os.makedirs(保存ディレクトリ)
    if not os.path.exists(保存パス):
        レスポンス = requests.get(画像URL)
        with open(保存パス, 'wb') as ファイル:
            ファイル.write(レスポンス.content)
        print("画像保存完了")
    else:
        print("既存ファイルを検出")
except Exception as e:
    print(f"エラー発生: {e}")

4. BeautifulSoupによるHTML解析

from bs4 import BeautifulSoup
import requests

レスポンス = requests.get("http://python123.io/ws/demo.html")
解析ツリー = BeautifulSoup(レスポンス.text, "html.parser")

for リンク in 解析ツリー.find_all("a"):
    print(リンク.get("href"))  # ハイパーリンク抽出

for タイトル in 解析ツリー.find_all("title"):
    print(タイトル.string)  # ページタイトル抽出

5. 正規表現によるデータ抽出

import re

テキスト = "電話番号: 090-1234-5678, メール: example@test.com"
電話パターン = r'(\d{3}-\d{4}-\d{4})'
メールパターン = r'([a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+)'

電話番号 = re.search(電話パターン, テキスト).group(1)
メールアドレス = re.search(メールパターン, テキスト).group(1)

print(f"電話番号: {電話番号}")
print(f"メール: {メールアドレス}")

6. Scrapyフレームワーク

大規模スクレイピングに最適な非同期フレームワークです。コンポーネント構成:

  • エンジン:システム全体のデータフロー制御
  • スケジューラ:URLキュー管理
  • ダウンローダ:HTTP通信処理
  • アイテムパイプライン:データ永続化

Scrapyプロジェクト構築手順

# プロジェクト作成
scrapy startproject 電子書籍スクレイピング

# スパイダー生成
cd 電子書籍スクレイピング
scrapy genspider 電子書籍 スクレイピング対象ドメイン

# 実行コマンド
scrapy crawl 電子書籍 -o 出力ファイル.json

タグ: Python Webスクレイピング requests BeautifulSoup 正規表現

6月12日 00:41 投稿