Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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. 日本語訳

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした