Web Scraping
機械学習のためのデータ収集技術
はじめに
Web Scrapingとは、Webサイトから記事情報や画像を抽出する技術のことで、Web Crawler あるいはWeb Spider とも呼ばれます。近年、機械学習に用いる学習データ(例えば犬と猫の画像)を大量に取得する目的で、この技術が必要になることが多くなりました。
ご注意ください
WebScrapingは、人間が記事を読む場合と違って、プログラムが短時間に大量のリクエストを行います。通常の Webサーバーが想定する以上の負荷をかけることになるので*1、アクセス頻度などを考えて相手に迷惑をかけないよう、注意が必要です。
簡単な方法
Webスクレイピングというキーワードで検索すると、Python を使った方法が多くヒットしますが、作業の目的によっては、いわゆるクローラーを使えば簡単に目的が達成されます。例えば、特定のWebページにリンクされた画像の収集であれば、フリーのWebクローラーツールや、ブラウザの拡張機能を使って、簡単に実現できます。
- Webクローラーツールを使う
Google:Webクローラーツール
- ブラウザの拡張機能を使う
- Firefox アドオン
- Chrome 拡張機能
- Scraper
Python でプログラムを書く
Pythonでは Scrapy という有名なフレームワークがありますが、フレームワークというのはそれなりに学習コストがかかります。ここでは、古くから使われている、Requests と BeautifulSoup のみを使って、簡単なコードでそれを実現する事例を紹介します。以下が前提となります。
以下、Requests によるページの取得と BeautifulSoup による要素情報の取得の仕方について順に解説します。
Requests によるページの取得
Requests は、Webページを取得・解析するためのライブラリです。
- まずは、pip コマンドで requests をインストールして下さい。
$ pip install requests
注)Python3系であればコマンドは pip3、2系であれば pip です。
- 以下のソースを sample.py として、カレントディレクトリに置いて下さい。
import requests r = requests.get('https://design.kyusan-u.ac.jp/index.html',verify=False) print("// HEADER //////////////") print(r.headers,"\n") print("// HTML CONTENT ////////") print(r.content,"\n")
- プログラムの解説
- import 文で Request を読み込みます。
- requests.get()関数でurlを指定すると、ページの情報が取得できるので、これを変数 r に格納しています。
- r.header でページのヘッダー情報が取得できます。
- r.content でページの内容が取得できます。
- カレントディレクトリで以下を実行すると結果が表示されます。
$ python sample.py
- 結果をターミナル出力ではなく、テキストファイルとして書き出したい場合は、以下のようにファイル名を指定してリダイレクトして下さい。
$ python sample.py > result.txt
Beautiful Soup による要素情報の抽出
Beautiful Soup は、HTMLを指定してその情報を抽出する場合に使用します。
- まずは、pip コマンドで Beautiful Soup をインストールして下さい。
$ pip install beautifulsoup4
- BeautifulSoup は以下のように2つの引数を指定します。
- 第一引数:解析対象を指定
- 第二引数:パーサを指定 "html.parser"
- 以下を sample2.py として、カレントディレクトリに置いて下さい。
import requests from bs4 import BeautifulSoup r = requests.get('https://design.kyusan-u.ac.jp/socialdesign/',verify=False) soup = BeautifulSoup(r.content, "html.parser") print(soup.find("h1"))
- プログラムの解説
- import で Request を、また from で Beautiful Soup から bs4 モジュールを読み込みます。
- requests.get() 関数で URL の示すページの情報を読み込みます。
- ページのコンテンツを HTMLパーサーで解析して、変数 soup に格納。
- soup.find でタグ指定すると、当該部分(先頭のひとつ)を表示できます。
- カレントディレクトリで以下を実行すると結果が表示されます。
$ python sample2.py <h1 id="pageTitle"><a href="・・">SocialDesign</a> </h1>
- プログラムの最終行を以下のようにすると、テキストのみ抽出されます。
print(soup.find("h1").text)
- soup.find では、先頭の1つしか選ばれませんが、soup.find_all を使うと、すべてのタグを抽出できます。以下のソースでは、h3 タグのテキストをすべて抽出します(最後の2行が異なるだけです)。
import requests from bs4 import BeautifulSoup r = requests.get('https://design.kyusan-u.ac.jp/socialdesign/',verify=False) soup = BeautifulSoup(r.content, "html.parser") for i in soup.find_all("h3"): print(i.text)