スクレイピング
Python3
BeautifulSoup
Requests

pythonでさくっとスクレイピング(Requests + Beautiful Soup 4)

pythonはスクレイピングなども簡単にできるようなライブラリが多く用意されていますが、いまいち調べてみないとどれが最新の情報なのか分からなかったためまとめました。

今回は、URLを叩いて要素を取得するのにRequests、その後の分析にはBeautiful Soupを使っています。


Requestsとは

以下は公式ページの開発ドキュメントから


Requestsは人が使いやすいように作られた、エレガントでシンプルなPythonのHTTPライブラリです。


Pythonは標準で同様の機能を持つurllib2を持っていますが、ものすんごく使いにくいと評判です。例えば公式で紹介されている例では、ベーシック認証でログインするページの要素を取得する場合です。


0_urllib2.py

#!/usr/bin/env python

# -*- coding: utf-8 -*-

import urllib2

gh_url = 'https://api.github.com'

req = urllib2.Request(gh_url)

password_manager = urllib2.HTTPPasswordMgrWithDefaultRealm()
password_manager.add_password(None, gh_url, 'user', 'pass')

auth_manager = urllib2.HTTPBasicAuthHandler(password_manager)
opener = urllib2.build_opener(auth_manager)

urllib2.install_opener(opener)

handler = urllib2.urlopen(req)

print handler.getcode()
print handler.headers.getheader('content-type')

# ------
# 200
# 'application/json'



1_requests.py

#!/usr/bin/env python

# -*- coding: utf-8 -*-

import requests

r = requests.get('https://api.github.com', auth=('user', 'pass'))

print r.status_code
print r.headers['content-type']

# ------
# 200
# 'application/json'


と言うわけで、Requestsを使うとサクッと取得することができます。Anaconda環境ではpipの代わりにconda install requestsでインストールできます。


Beautiful Soup(BS)とは

BSは、先ほどのRequestsで取得したHTMLファイルから望むデータを取得するためのライブラリです。最新バージョンは4系でPython3に対応しています。これもcondaを使ってconda install beautifulsoup4でインストールできます。


スクレイピングをしてみる

以下のような感じでヤフーのトップページにあるニューストピック一覧を取得してみます。


getYahooNewsTopics.py

import requests

from bs4 import BeautifulSoup
import re

#初回のみ
target_url = "https://www.yahoo.co.jp/"
#Requestsを使って、webから取得
r = requests.get(target_url)
#要素を抽出
soup = BeautifulSoup(r.text, 'lxml')

#HTMLファイルとして保存したい場合はファイルオープンして保存
with open('originDataOld.html', mode='w', encoding = 'utf-8') as fw:
fw.write(soup.prettify())

#soup.find_allを用いてリンク先が「news.yahoo.co.jp/pickup」の項目を全て取得
elems = soup.find_all(href=re.compile("news.yahoo.co.jp/pickup"))
for e in elems:
print(e.getText())

# 出力結果
# 自民の誤算 現職閣僚も危機感
# 中川俊直氏、不出馬を表明
# 北ミサイル 「慣れ」危惧も
# カタルーニャ 独立投票が開始
# 冷蔵庫にカメラ パンフ載らず
# 巨人CS進出逃す 球団史上初
# 瀬戸「水泳なので」長いキス
# 佐々木希 白無垢で10月挙式?


やっていることは、Requestsでヤフーのトップページを取得し、そこから正規表現が使えるreライブラリを使用して「news.yahoo.co.jp/pickup」を含むリンクを持つ項目を全て列挙しました。

Soupのfind_all等詳細な説明は参考サイトに詳しく載っていますのでここでは省略します。

具体的にどのような項目を指定して上手くスクレイピングをするかがキモですが、、、力が尽きたのでそのあたりは後ほどアップデートします。。


参考にしたサイト様

PythonとBeautiful Soupでスクレイピング

Requests の使い方 (Python Library)

Requests: 人間のためのHTTP

Beautiful Soup 4.2.0 Doc. 日本語訳