ホーム >  Python >  Beautiful Soup4でWebサイト解析


Posted:2018/05/31 9:00:37 AM|Category : Python

Beautiful Soup4でWebサイト解析

Pythonでスレイピングを行います。今回は、Beautiful Soup4を使ってWebサイトを解析します。

Beautiful Soup4でWebサイト解析

Beautiful Soupとは、HTMLの内容を解析するためのPythonライブラリです。

前回は、RequestsでWebページのデータを取得しました。今回は、HTMLを解析して「技評ネコ通信」のページから記事に関する情報を抽出します。

前提

①仮想環境、本番環境どちらでも構いませんが、CentOS7にPython3とvenvがインストールされているものとします。VPSに作った方法ですが、共通ですので以下をご参考に。

ConoHaのVPSにPython3環境を作る

②スクレイピングに使用するPythonパッケージ(Requests、Beautiful Soup4)をインストールします。

Pythonのウェブスクレイピング環境を作る(Requests、Beautiful Soup4)

ホスト環境

ホスト環境はUbuntuですが、WindowsでもMacでもOKです。

OS Ubuntu 16.04.1 LTS 64bit
Virtualbox 5.1
Vagrant 1.9.5

ゲスト環境

OS CentOS 7.1.1503
Python 3.6.1
pip 9.0.1
Webサーバ Apache/2.4.6 (CentOS)
mod_wsgi 4.5.17

Beautiful Soup4でサイトを取得

①venvの仮想環境から、そのままコマンドでpythonの対話モードを起動します。

python

②以下のコードを記述して実行します。RequestsオブジェクトのcontextにHTMLが入ります。そのデータを元にBeautifulSoupオブジェクトを生成します。

>>> import requests
>>> from bs4 import BeautifulSoup
>>> r = requests.get('http://gihyo.jp/lifestyle/clip/01/everyday-cat')
>>> soup = BeautifulSoup(r.content, 'html.parser')

titleタグの情報を取得します。

>>> title = soup.title

オブジェクトの型を確認します。型はTag型です。

>>> type(title)
<class 'bs4.element.Tag'>

タイトルタグを表示します。

>>> print(title)
<title>技評ねこ部通信|gihyo.jp … 技術評論社</title>

タイトルタグの内容を表示。

>>> print(title.text)
技評ねこ部通信|gihyo.jp … 技術評論社

サイトの一件分のデータを取得

soupオブジェクトのfind()は、任意のタグの情報を取得します。id、classなどhtmlの属性とタグ情報を取得します。

>>> div = soup.find('div', class_='readingContent01')

class属性の場合だけPythonの予約語のclassとかぶります。classを指定する場合は「class_」と指定します。

div.find(‘li’)でdivタグの中の最初のliタグを取します。

>>> li = div.find('li')

aタグの中の文字列を表示します。

>>> print(li.a.text)
2018年2月28日 技評ねこ部の投稿コーナー!

文字列の中のsplit()で日付とタイトルに分割して、それを表示します。

>>> li.a.text.split(maxsplit=1)
['2018年2月28日', '技評ねこ部の投稿コーナー!']

サイトの全データを取得

soupオブジェクトには、「find_all()」というメソッドがあります。これは、指定した条件に合致するすべてのタグを取得します。以下の例では、すべてのliタグを取得します。また取得したデータをCSV形式で出力します。

>>> div = soup.find('div', class_='readingContent01')
>>> for li in div.find_all('li'):
...     url = li.a['href']
...     date, text = li.a.text.split(maxsplit=1)
...     print('{},{},{}'.format(date, text, url))
... 

以下のよな結果が表示されます。

2018年2月28日,技評ねこ部の投稿コーナー!,http://gihyo.jp/lifestyle/clip/01/everyday-cat/201802/28
2018年2月27日,これは親子か兄弟か?,http://gihyo.jp/lifestyle/clip/01/everyday-cat/201802/27
2018年2月26日,三毛ねこ祭り,http://gihyo.jp/lifestyle/clip/01/everyday-cat/201802/26
2018年2月23日,近付きすぎるねこ3,http://gihyo.jp/lifestyle/clip/01/everyday-cat/201802/23
2018年2月22日,ねこの日,http://gihyo.jp/lifestyle/clip/01/everyday-cat/201802/22
2018年2月21日,さびこーず,http://gihyo.jp/lifestyle/clip/01/everyday-cat/201802/21
2018年2月20日,一時期迷子になっていたぐれこ,http://gihyo.jp/lifestyle/clip/01/everyday-cat/201802/20
2018年2月19日,2匹いる!,http://gihyo.jp/lifestyle/clip/01/everyday-cat/201802/19
2018年2月16日,ねこ発見!ねこ発見!,http://gihyo.jp/lifestyle/clip/01/everyday-cat/201802/16
2018年2月15日,DNAはきっと同じ,http://gihyo.jp/lifestyle/clip/01/everyday-cat/201802/15
2018年2月14日,ケンカするほどだから仲がいいはず,http://gihyo.jp/lifestyle/clip/01/everyday-cat/201802/14
2018年2月13日,ねこ接近中ねこ接近中,http://gihyo.jp/lifestyle/clip/01/everyday-cat/201802/13
2018年2月9日,近付きすぎるねこ2,http://gihyo.jp/lifestyle/clip/01/everyday-cat/201802/09
2018年2月8日,近付きすぎるねこ,http://gihyo.jp/lifestyle/clip/01/everyday-cat/201802/08
2018年2月7日,ねこ隠し撮り,http://gihyo.jp/lifestyle/clip/01/everyday-cat/201802/07
2018年2月6日,一触触発!,http://gihyo.jp/lifestyle/clip/01/everyday-cat/201802/06
2018年2月5日,雪とねこ2,http://gihyo.jp/lifestyle/clip/01/everyday-cat/201802/5
2018年2月2日,雪とねこ,http://gihyo.jp/lifestyle/clip/01/everyday-cat/201802/02
2018年2月1日,技評界隈ねこ相関図,http://gihyo.jp/lifestyle/clip/01/everyday-cat/201802/01
2018年1月31日,技評ねこ部の投稿コーナー!,http://gihyo.jp/lifestyle/clip/01/everyday-cat/201801/31

トラックバック用のURL
プロフィール

名前:イワサキ ユウタ 職業:システムエンジニア、ウェブマスター、フロントエンドエンジニア 誕生:1986年生まれ 出身:静岡県 特技:ウッドベース 略歴 20

最近の投稿
人気記事
カテゴリー
広告