ウェブスクレイピングは、7行程のコードで実装できるので、WEBページからデータを取得するところまでは簡単と言えます。
私は、都内某所で開催されたpythonを使ったウェブスクレイピングの勉強会に参加してきました。使用したプログラミング言語はpythonです。そこで学んだことを書いていきます。
ウェブスクレイピングと聞くと、「ものすごく難しのでは?」と思うかもしれません。私も、非常に難しいという先入観を持っていました。実際にやってみると簡単でした。
スクレイピングは、短いものであれば7行程のソースコードで実装することが可能なのです。
以下のソースコードは、青空文庫のサイトからHTMLデータをダウンロードして、h1タグに該当する文字を出力するものです。スクレイピングに慣れるためには、まず簡単なソースを書いて動かしてみるのが良いと思います。
#ライブラリーを読み込む
from bs4 import BeautifulSoup
import urllib.request as req
#青空文庫のサイトからHTMLデータを取得する
url = "http://www.aozora.gr.jp/index_pages/person148.html"
res = req.urlopen(url)
soup = BeautifulSoup(res, 'html.parser')
#全てのh1タグのテキストを取得する
for s in soup.find_all("h1"):
print(s.text)
スクレイピングをやる上で気をつける点
勉強会では、スクレイピングをやる上で以下の2点を特に気をつけるように言われました。
著作権には気をつけろ
スクレイピングで得たインターネット上の情報には、著作権が存在します。インターネット上で得た情報をダウンロードしてそのままアップデートしてしまうと、著作権の問題が発生し、最悪、訴訟に発展する可能性がありますので、扱いに注意が必要です。スクレイピングで得たデータを分析(例えば、よく使われているキーワードを調べる、機械学習のためのデータなど)に使うのは問題ないです。
負荷対策を実施すること
負荷対策とは、スクレイピング対象のサーバーに負担(1秒間に10アクセスなどのリクエスト)をかけないことです。例えば、サーバーに10000枚ほどの画像があったとして、一度に全ての画像をダウンロードすると、リクエストを専有することになりサーバーに負担がかかります。サーバーを利用する一般ユーザにもアクセスできないなどの影響が出てしまいますので注意が必要です。
負荷対策としては、10枚ダウンロードするごとにsleepを1〜10秒ほど実行するなどしてサーバーを休ませる対策が必要になります。
スクレイピング用のライブラリー
スクレイピングで使うライブラリーは、たくさんあります。この記事では、インターネット上の情報を取得するurllib、HTMLのDOMの解析ができるBeautifulSoupを使います。
urllibライブラリー
インターネット上の情報を取得することができます。具体的には、ネット上からHTMLデータをダウンロードができるようにします。
インストールコマンド:
python2.7系の場合・・・ pip install urllib
python3系の場合・・・pip3 install urllib
BeautifulSoupライブラリー
CCSセレクターを使うことによってHTMLのDOM操作ができ、簡単に指定したデータを取得できます。
インストールコマンド:
python2.7系の場合・・・ pip install beautifulsoup4
python3系の場合・・・pip3 install beautifulsoup4
サンプルソースコード
簡単に実装できるサンプルコードを書きます。このコードは、
h1,h2,h3タグのテキストデータ、タグを除いたテキストデータを取り出すのみですが、初めてスクレイピングをやって見る人には練習になるかと思います。
# -*- coding: utf-8 -*-
from bs4 import BeautifulSoup
import urllib.request as req
import sys
if __name__ == '__main__':
# 変換の元ファイルを読み込む
param = sys.argv
if (len(param) == 0):
print ("Usage: $ python " + param[0] + " number")
quit()
#本来は引数から取得したいが、サンプルコードなのでURLはハードコーディング
#url = param[1]
#WEBサイトを取得
#青空文庫のサイトからHTMLデータを取得する
url = "http://www.aozora.gr.jp/index_pages/person148.html"
res = req.urlopen(url)
soup = BeautifulSoup(res, 'html.parser')
#全てのh1タグのテキストを取得する
print("----------h1のリスト----------")
for s in soup.find_all("h1"):
print(s.text)
#全てのh2タグのテキストを取得する
print("----------h2のリスト----------")
for s in soup.find_all("h2"):
print(s.text)
#全てのh3タグのテキストを取得する
print("----------h3のリスト----------")
for s in soup.find_all("h3"):
print(s.text)
#currentクラスタグの情報
print("----------1つ目のcurrentクラスの情報を取得する----------")
print(soup.select_one(".current").string)
#タグ以外の文字列のみ出力する(かなり汚いが・・・)
print("----------タグ以外の全ての文字列----------")
for s in soup(['script', 'style']):
s.decompose()
str = ' ' . join(soup.stripped_strings)
print(str)
課題
urllib、BeautifulSoupだけでは取得できないサイトが存在します。例えば、Googleの検索結果が該当します。
urllib、BeautifulSoupは静的なWebサイトのみスクレイピングが可能と言えます。
Googleの検索結果のケースは、最初にJavaScriptを読み込んで、その後にAjaxを使ってWebサイトの情報を読み込むタイプのページです。後から、情報を読み込むタイプのページには対応していません。
JavaScriptを使ったページの読込には、Selenium(自動でブラウザーの操作ができる)などのツールを使えば対応できるとのことです。Seleniumを使ったスクレイピングは、初心者から逸脱したテクニックが必要になってくるのでここでは解説しません。
まとめ
スクレイピングと聞くと以外に難しいようにも聞こえますが、実際にやってみると以外に簡単だと思います。まとめサービスなどのWebアプリケーションを作る上で、スクレイピングに興味を持たれた方はぜひ、試してみると良いでしょう。
Webスキルを習得してTwitterやFacebookのようなWebアプリケーション・サービスを作りたい、エンジニアとしてキャリアを積みたい人は以下をクリック