基本概念
Webスクレイピングとは、プログラムを用いてユーザーの操作を模倣し、大量のHTTPリクエストを自動で送信してデータを取得する技術である。
スクレイピングの種類
汎用クローラ(General Crawler)
検索エンジン(Google、Baiduなど)が使用するシステムの一部であり、インターネット上のウェブページを可能な限りダウンロードし、ローカルにミラーリングする。その後、キーワード抽出や広告除去などの処理を行い、検索インターフェースを提供する。
フォーカスドクローラ(Focused Crawler)
特定の目的に沿って必要なデータのみを抽出する。例えば、映画タイトルとレビューだけを取得し、ページ全体を保存しない。
インクリメンタルクローラ(Incremental Crawler)
ウェブサイトの更新を監視し、変更された部分のみを再取得する方式。
robots.txt プロトコル
robots.txt はウェブサイトのルートディレクトリに配置されるASCIIテキストファイルであり、検索エンジンのクローラに対してアクセス可能なパスと禁止パスを指定する。ただし、これはあくまで合意に基づくものであり、法的拘束力はない。また、フォーカスドクローラはこのプロトコルを無視することが一般的である。
典型的なスクレイピングフロー
- 対象URLを指定
- HTTPリクエストを送信
- レスポンスを受信
- データを解析
- 結果を永続化(ファイルや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 が発生する可能性がある。