2016/03/02更新

[Python] httplibとBeautifulSoupを用いてWebクローリングを行い、データを収集する

このエントリーをはてなブックマークに追加      

こんにちは、@yoheiMuneです。
今日はPythonでWebクローリングを行って、Web上からデータ収集する方法をブログに残したいと思います。

画像


目次




事前準備

PythonでWebクローリングを行うには、主に以下2ステップを行います。
  1. 指定したURLのHTMLを取得する
  2. 取得したHTMLから必要な情報を読み込む
そして2つ目のHTMLからの情報抽出ですが、Pythonにはいくつか方法がありますが、人気の高いBeautifulSoupを使いたいと思います。BeautifulSoupは以下のコマンドで事前にインストールしておきます。
$ pip install --upgrade beautifulsoup4
無事にインストールができたら準備完了です。



指定したURLからHTMLを取得する

指定したURLからのHTML取得には、urllib.requstを利用します。具体的には以下のようにしてHTMLを取得します。
import urllib.request
url = "http://www.yoheim.net/"
response = urllib.request.urlopen(url)
html = response.read().decode("utf-8")
これでhtmlを取得できればHTML取得の完成です。urlの部分を必要なものに変えれば良いです。
なお、Post通信で取得する必要があったり、認証が必要なページを取得する場合などは、以下のブログをご参照ください。

- [Python] HTTP通信でGetやPostを行う



HTMLを読み込んで必要な情報を得る

HTMLを取得できたら次にHTMLを解釈して必要なデータを取り出します。上記で取得した本サイトトップページでは、最新記事が一覧で表示されていますので、ここではそのタイトルを取得したいと思います。
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, "html.parser")
article = soup.find(class_="articleList")
h2_list = article.find_all("h2")
titles = [h2.string for h2 in h2_list]
これで値の取得ができました。手順としては以下の流れとなります。
  1. BeautifulSoupオブジェクトを生成する
  2. findfind_allを使って、HTML要素を取得する
  3. .stringなどで値を抽出する
BeautifulSoupの使い方については、次のセクションで紹介させていただきます。



BeautifulSoupの使い方

上のようにBeautifulSoupを使うことで、HTMLを解釈して必要な情報を得ることができます。上記で紹介した3ステップに分けて使い方を紹介させていただきたいと思います。なおBeautifulSoupの公式ページは以下ですので、そちらもご参照ください。

- BeautifulSoupの公式ページ(英語)


BeautifulSoupオブジェクトの生成

ここは決まり文句のようなつもりで、以下でインスタンス化できます。
soup = BeautifulSoup(html, "html.parser")


必要なHTML要素の抜き出し

HTML要素を抜き出すために、以下のような仕組みが用意されています。
### 条件に一致する要素を1つ取得する(find)
# HTML要素名
h1 = soup.find("h1")
# クラス名
article = soup.find(class_="articleList")
# ID
header = soup.find(id="header_subtitle")

### 条件に一致する要素を全て取得する(find_all)
# HTML要素名
h2 = soup.find_all("h2")
# クラス名
balls = soup.find_all(class_="ball")
# ID
header = soup.find_all(id="header_subtitle")

# findやfind_allは連ねることもできる
items = soup.find(class_="articleList").find_all("h2")
上記のメソッドを駆使して必要な要素までたどり着きます。


要素から値を抜き出す

必要な要素までたどり着いたらあとは値を抜き出します。
# <h2>タイトルタイトル</h2>
title = h2.string
print(title) # => タイトルタイトル

# <img src="/image/390.jpg" alt="画像"/>
img = soup.find("img")
src = img["src"]
print(src) # => /image/390.jpg
主にこの2つを用いてデータを抜き出していきます。以外と単純明解で使いやすいなーと思ってます。



最後に

今日は、PythonでWebクローリングをして必要な情報を抜き出す方法をブログに書きました。WebクローリングができるようになるとWebに散らばる様々な情報を得ることができるようになるので、夢がかなり広がります。クローリングマニアが存在する理由がすんごくわかる気がしますw。

本ブログでは、フロントエンド・Python・機械学習を中心に発信していきます。気になった方はぜひ、本ブログのRSSTwitterをフォローして頂けると幸いです ^ ^。

最後までご覧頂きましてありがとうございました!





こんな記事もいかがですか?

RSS画像

もしご興味をお持ち頂けましたら、ぜひRSSへの登録をお願い致します。