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

基本概念

Webスクレイピングとは、プログラムを用いてユーザーの操作を模倣し、大量のHTTPリクエストを自動で送信してデータを取得する技術である。

スクレイピングの種類

汎用クローラ(General Crawler)

検索エンジン(Google、Baiduなど)が使用するシステムの一部であり、インターネット上のウェブページを可能な限りダウンロードし、ローカルにミラーリングする。その後、キーワード抽出や広告除去などの処理を行い、検索インターフェースを提供する。

フォーカスドクローラ(Focused Crawler)

特定の目的に沿って必要なデータのみを抽出する。例えば、映画タイトルとレビューだけを取得し、ページ全体を保存しない。

インクリメンタルクローラ(Incremental Crawler)

ウェブサイトの更新を監視し、変更された部分のみを再取得する方式。

robots.txt プロトコル

robots.txt はウェブサイトのルートディレクトリに配置されるASCIIテキストファイルであり、検索エンジンのクローラに対してアクセス可能なパスと禁止パスを指定する。ただし、これはあくまで合意に基づくものであり、法的拘束力はない。また、フォーカスドクローラはこのプロトコルを無視することが一般的である。

典型的なスクレイピングフロー

  1. 対象URLを指定
  2. HTTPリクエストを送信
  3. レスポンスを受信
  4. データを解析
  5. 結果を永続化(ファイルやDBに保存)

実装例

基本的なHTTP GETリクエスト

import urllib.request

def fetch_page():
    url = "http://www.baidu.com/"
    response = urllib.request.urlopen(url)
    raw_data = response.read()
    html_content = raw_data.decode("utf-8")
    with open("baidu.html", "w", encoding="utf-8") as file:
        file.write(html_content)

fetch_page()

文字列とバイト列の変換

text = "example"
byte_data = text.encode("utf-8")  # str → bytes
restored_text = byte_data.decode("utf-8")  # bytes → str

日本語を含むURLのエンコードとリクエスト

import urllib.parse
import urllib.request
import string

def search_with_keyword():
    base_url = "http://www.baidu.com/s?wd="
    keyword = "スクレイピング"
    full_url = base_url + keyword
    safe_chars = string.printable
    encoded_url = urllib.parse.quote(full_url, safe=safe_chars)
    response = urllib.request.urlopen(encoded_url)
    content = response.read().decode("utf-8")
    with open("search_result.html", "w", encoding="utf-8") as f:
        f.write(content)

search_with_keyword()

注意:URLに非ASCII文字(例:日本語、中国語)が含まれる場合、urllib.parse.quote() を使ってパーセントエンコーディングを行う必要がある。そうでないと、UnicodeEncodeError が発生する可能性がある。

タグ: Python Web Scraping urllib robots.txt HTTP

6月5日 21:27 投稿