スキップしてメイン コンテンツに移動

PythonでBSスクレイピング

PythonでBSスクレイピング

はじめに

近年、Web上に溢れる情報を効率的に収集・分析するニーズが高まっています。Python自動化とBeautifulSoupを組み合わせることで、HTML解析やWebスクレイピングを簡単に実装でき、タグ取得やクラス検索、データ抽出といった作業を高速化できます。さらにlxmlパーサを利用すれば、パース速度と正確性を両立し、情報収集やクローリングのプロセスを自動化することが可能です。本記事では、初心者から実務レベルまで、Pythonを使ったWebスクレイピングの実装手順と応用テクニックを詳しく解説します。

基礎知識・概念

まずは、Webスクレイピングに必要な概念を整理します。
HTML解析:Webページの構造を理解し、必要な情報を抽出するためにHTMLをパースします。
タグ取得:特定のタグ(例:divspan)を取得し、データを取り出します。
クラス検索class属性で要素を絞り込み、目的のデータを効率的に取得します。
データ抽出:テキストや属性値を取り出し、CSVやJSONへ保存します。
lxml:高速で堅牢なパーサ。BeautifulSoupと組み合わせることで、パース速度を大幅に向上させます。
これらを組み合わせることで、Python自動化の枠組みが完成します。

実装・設定の詳細

以下では、Python自動化とBeautifulSoupを使ったWebスクレイピングの実装例を示します。まずは環境構築から始めます。

pip install requests beautifulsoup4 lxml

次に、サンプルコードを解説します。ここでは、ニュースサイトのトップ記事を取得し、タイトルとリンクを抽出します。

import requests
from bs4 import BeautifulSoup

# 1. 取得したいURL
url = 'https://example.com/news'

# 2. HTTP GETリクエスト
response = requests.get(url, headers={'User-Agent': 'Mozilla/5.0'})
response.raise_for_status()  # エラー時に例外を投げる

# 3. BeautifulSoupでHTMLをパース(lxmlを指定)
soup = BeautifulSoup(response.text, 'lxml')

# 4. タグ取得:h2タグ内のaタグを検索
articles = soup.select('h2.article-title a')

# 5. データ抽出:テキストとhref属性
for a in articles:
    title = a.get_text(strip=True)
    link = a['href']
    print(f'{title} - {link}')

ポイント解説:

  • requestsでHTTPリクエストを送信。User-Agentを設定することで、サイト側のブロックを回避しやすくなります。
  • BeautifulSoupにlxmlを指定すると、パース速度が向上し、構文エラーが少なくなります。
  • CSSセレクタ(select)を使うと、クラス検索が簡単に行えます。例:.article-titleはクラス名で絞り込み。
  • get_text(strip=True)で余計な空白を除去し、クリーンなテキストを取得。

さらに、複数ページをクロールしたい場合は、ページ番号をURLに付与し、ループで取得します。

for page in range(1, 6):
    page_url = f'https://example.com/news?page={page}'
    # 省略:上記と同様の処理

応用テクニック

基本的なスクレイピングをマスターしたら、実務で役立つ応用テクニックに挑戦しましょう。

1. JavaScriptで生成されたコンテンツの取得

多くのサイトはJavaScriptで動的にデータをロードします。requestsだけでは取得できないため、SeleniumやPlaywrightを併用します。以下はSeleniumを使った例です。

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
options.add_argument('--headless')
driver = webdriver.Chrome(options=options)

driver.get('https://example.com/dynamic')
html = driver.page_source
soup = BeautifulSoup(html, 'lxml')
# 以降は通常のBeautifulSoup処理

2. 大量データの効率的保存

CSVやJSONに保存する際、pandasを使うと便利です。以下はJSONへの書き込み例です。

import json

data = [{'title': t, 'link': l} for t, l in zip(titles, links)]
with open('articles.json', 'w', encoding='utf-8') as f:
    json.dump(data, f, ensure_ascii=False, indent=2)

3. 失敗時のリトライロジック

ネットワーク障害やサイト側の制限に備えて、リトライを実装します。requestsのSessionRetryを組み合わせると簡単です。

from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry

session = requests.Session()
retry = Retry(total=5, backoff_factor=1, status_forcelist=[502, 503, 504])
adapter = HTTPAdapter(max_retries=retry)
session.mount('https://', adapter)
session.mount('http://', adapter)

response = session.get(url)
Check: 実務で役立つポイント!

トラブルシューティング

スクレイピング中に遭遇しやすいエラーと対処法をまとめます。

  • 403 Forbidden:User-Agentを偽装するか、リクエスト頻度を下げる。
  • HTML構造の変更:CSSセレクタを動的に取得するか、XPathを併用して柔軟に対応。
  • 文字化け:レスポンスのencodingを確認し、response.encoding = 'utf-8'で修正。
  • メモリ不足:大量データを一括で保持せず、ストリーム書き込みやバッチ処理を行う。
  • IPブロック:プロキシを使用するか、IPローテーションを導入。

まとめ

Python自動化とBeautifulSoupを組み合わせることで、HTML解析・タグ取得・クラス検索・データ抽出を効率的に行えます。lxmlパーサを活用すればパース速度が向上し、情報収集やクローリングの自動化が実現します。次のステップとしては、SeleniumやPlaywrightでJavaScript生成データを取得し、pandasでデータ処理を行うことで、実務レベルのスクレイピングフレームワークを構築できます。

この記事はAI技術を活用して作成されましたが、内容は慎重に確認されています。

コメント