Pythonを使ったスクレイピング
スクレイピングとは、ざっくり言えばウェブページからの情報抽出です。
例えば、あるウェブサイトに掲載されているデータを、CSV等で自分なりに保存したいとします。
データが少ない場合は良いのですが、何千件とデータが存在する場合、手作業では非常に時間がかかるのは言うまでもありません。
また、沢山のサイトから情報を取得する必要があったり、定期的に保存が必要になった場合なども、人力では大変です。
このような場合に活躍するのがスクレイピングです。
スクレイピングには大まかに、2つの方法があります。
・Chrome等のウェブブラウザを立ち上げ、プログラムでその動きを自動化・制御する
・ウェブブラウザを使わず、プログラムのみでHTMLの取得・解析を行う
ウェブブラウザを使わない方法として簡単なものは、「requests」と「BeautifulSoup」を使う方法です。
流れとしては、
・requestsでサーバへリクエストを送り、HTMLを受け取る
・BeautifulSoupでHTMLを解析し、必要な部分だけ抽出する
という流れになります。
それぞれのライブラリは、以下のようにインストール可能です。
pip install requests pip install beautifulsoup4
例として、Python Japanのサイトからニュースを抽出してみましょう。
import requests from bs4 import BeautifulSoup result = requests.get("http://www.python.jp/category/news.html") soup = BeautifulSoup(result.content) titles = soup.find_all("h1") for title in titles: print(title.text)
実行結果
PYTHON.JPのメーリングリストについて 『入門Python 3』『実践Python 3』が出版されました Python 3.5 リリース 書籍『Cython――Cとの融合によるPythonの高速化』が発売になります Python 3.5.0 b1 リリース Python 2.7.10 リリース Pythonドキュメント翻訳プロジェクト サイト移転 【書籍】Pythonエンジニア養成読本[いまどきの開発ノウハウ満載!] (Software Design plus) Python 3.4.3 リリース 【書籍】Pythonプロフェッショナルプログラミング 第2版
このように、非常に簡単に抽出ができました。
次はウェブブラウザを立ち上げる方法、「Selenium」を使ってみます。
pip install selenium
Seleniumのインストールも、pipで簡単に行えます。
from selenium import webdriver driver = webdriver.Firefox() driver.get("http://www.python.jp/category/news.html") titles = driver.find_elements_by_tag_name("h1") for title in titles: print(title.text) driver.close()
上記のコードを実行すると、実際にFirefoxブラウザが立ち上がり、ニュースのタイトルを表示し終わるとブラウザが閉じます。
次に、これらの使い分けについてです。
requestsで受け取るHTMLはあくまでHTMLのソースである点に注意です。
そのためJavaScriptで動的にHTMLを変えているページでは思うように抽出ができません。
ですが、Pythonプログラムのみで完結するため、非常に動作は速いです。
一方、Seleniumはブラウザを立ち上げるため、JavaScriptで動的にHTMLを変えていても、対応可能です。
また、スクリーンショット機能やHTMLの読み込みを待つといった便利な機能もあります。
ブラウザの動きをリアルタイムで見れるため、バグ等の発見も容易です。
しかし、実効速度はブラウザを使わない方法に比べると遅くなります。
どちらを使うか悩む場合は、まずrequests+BeautifulSoup等を試し、上手く抽出ができなければSeleniumに切り替える、
といった方法でも良いでしょう。