HRR Co., Ltd.

技術的な記録を残していくことを目的としています。1次情報を大事にしています。

Python3でWebサイトのスクレイピングをCygwinから

はじめに

特定のWebサイトの情報抜き出しを、Python3でやってみました。
Googleクローラーのようなことをやるのは大変です。
でも、特定のサイトの特定の情報なら、そんなに難しくはないので、ぜひ挑戦してみることをオススメします。

ただし、相手のサイトに迷惑をかけるようなことだけはNGです。
過去捕まった人が出た事例もありますので、ご注意を…。

準備から

まずはPython本体

まずPython3を入れるところから…
Cygwin使ってます。

$ apt-cyg searchall python3
$ apt-cyg install python3

searchallで探すとすぐ見つかりますので、インストールは簡単です。
ただし、"python3"というファイル名になっているので、シムリンクを作成して、"python"で実行できるようにしておきます。
これはお好みでどうぞ。

$ which python3
/usr/bin/python3
$ ln -s /usr/bin/python3 /usr/bin/python
$ python --version
Python 3.6.3

パッケージ管理システムのインストール

pip というPythonのパッケージ管理システムを入れます。

$ apt-cyg searchall pip
$ apt-cyg install python3-pip

注意点として、今回入れるのはPython3用のpipであること。
"python3-pip"を指定しましょう。
install後は"pip3"になることも要注意。

$ which pip3
/usr/bin/pip3
$ ln -s /usr/bin/pip3 /usr/bin/pip
$ pip --version
pip 9.0.1 from /usr/lib/python3.6/site-packages (python 3.6)

こちらもおまけですが、シムリンクを作成してみました。

スクレイピングに便利なパッケージを入れる

Beautiful Soupを使います。
Beautiful Soup Documentation — Beautiful Soup 4.4.0 documentation
XMLやHTMLからデータを取得するためのPythonライブラリ(意訳)」とのこと。
そしてBeautiful Soup 4が最新のようです。

私は普段PHPを使いますが、PHPでは取得したHTMLからの抽出が大変なので、この手のライブラリが充実しているPythonはいいですね。

$ pip search beautifulsoup4
$ pip install beautifulsoup4
Collecting beautifulsoup4
  Downloading https://files.pythonhosted.org/packages/9e/d4/10f46e5cfac773e22707237bfcd51bbffeaf0a576b0a847ec7ab15bd7ace/beautifulsoup4-4.6.0-py3-none-any.whl (86kB)
    100% |????????????????????????????????| 92kB 1.0MB/s
Installing collected packages: beautifulsoup4
Successfully installed beautifulsoup4-4.6.0
You are using pip version 9.0.1, however version 10.0.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.

何やらpipのバージョンが古いと言われてますので、言われたとおり

pip install --upgrade pip

を実行しておくことをオススメします。

ようやくコーディング

特定のサイトを指定するわけにもいかないので、サンプルを提示しようと思います。

# coding: UTF-8

# Webサイトへのアクセスに使うライブラリをimport
import urllib.request
from bs4 import BeautifulSoup

url = "対象のURL"

try:
    # URLにアクセス
    html = urllib.request.urlopen(url)
except:
    print('Cannot open the url.')

try:
    # HTMLのパース
    soup = BeautifulSoup(html, "html.parser")
except:
    print('Cannnot read the html data.')

# HTMLを解析、欲しいデータを持ってくる
targets = soup.select('#contents ul li a')

# タグの中の文字列を取得する
for target in targets:
    text = target.get_text()
    print(text)

HTMLの中から特定のタグを探す手段はたくさんあります。
今回は比較的わかりやすいと思われるCSSセレクタを使いました。

タグの中の文字列を取得する手段も、複数用意されています。
詳細はマニュアルを参照のこと。
Beautiful Soup Documentation — Beautiful Soup 4.4.0 documentation

最後に

今回はサイトから特定のデータを取得することが目的だったので、あまりBeautiful Soup自体の深掘りはしませんでした。
対象によっては異なるメソッドを使うほうが効率がよかったりするでしょうから、ぜひマニュアルをご一読くださいませ。

以上でした。