はじめに
特定の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自体の深掘りはしませんでした。
対象によっては異なるメソッドを使うほうが効率がよかったりするでしょうから、ぜひマニュアルをご一読くださいませ。
以上でした。