requestsを用いたpythonでのスクレイピング

今回はpythonのライブラリ、requestsを用いてwebサイトの情報をスクレイピングする手法について記述していこうと思います。

requestsを用いてwebサイトの情報を取得できるようになると、例えば、、、

あるサイトから今日の天気を取得して、その情報を表示するインジケータを作る。
今日の株価を1時間毎にチェックしてファイルに書き出す。

などなど色々なことに応用できると思います。面白いですね。

 

requestsとは

requestsとは、pythonのHTTPライブラリ。

公式サイトのタイトルに “HTTP for Humans” とあることからもわかるように、
HTTPのリクエストをよりシンプルに、より人間が使いやすくなることを心がけたライブラリとなっている。

私自身webのスクレイピングをする際にいろいろなライブラリを試しているが、最終的にこのrequestsが一番使いやすいと感じているので、皆さんにもぜひ覚えていただきたい。

 

requestsのインストール

requestsのインストールはpythonのパッケージ管理ツールpipを用いてインストールすることができます。

$ pip install requests

 

requestsの基本的な使い方

説明するよりも、見ていただいた方が早いと思います。

例として、ここはyahooのホームページの情報を取得するサンプルコードを見ていきましょう。

#!/usr/local/bin/python3
# -*- coding: utf-8 -*-

import requests

r = requests.get( 'https://yahoo.co.jp/' )   # リソースの取得 ここでは例としてyahooのサイトを取得
r.raise_for_status()   # エラー処理。ここで404などのエラーが生じた場合には例外が投げられます

print( r.text )   # 結果は .text に格納されています

たったこれだけで、yahooのホームページの情報を取得することができます。とても簡単です。

 

サンプルコードの解説

import requests
requestsライブラリをインポートします。

r = requests.get( ‘https://XXXXX’ )
getの引数に取得したいページのアドレスを渡すことで、そのサイトのリソースを取得することができます。
サンプルコードでは例として、yahooのアドレスを入力してあります。

get以外のHTTPメソッドも用意されているので、そちらも利用することができます。

r = requests.post('https://httpbin.org/post', data = {'key':'value'})
r = requests.put('https://httpbin.org/put', data = {'key':'value'})
r = requests.delete('https://httpbin.org/delete')
r = requests.head('https://httpbin.org/get')
r = requests.options('https://httpbin.org/get')

r.raise_for_status()
クライアントの要求するページをサーバーが見つけられなかった場合などに発生する404エラーなど、エラーが発生した際に例外を発生させます。

サンプルコードでは例外が発生して処理が終了してしまいますが、例外を検出して何か別処理を行いたい場合には、try~catch構文を使うと良いかと思います。

try:
    r.raise_for_status()
except requests.exceptions.RequestException as err:
    print( "requests error." )

print( r.text )
取得結果は .text の中に格納されています。
requestsでは、サーバーからのコンテンツを自動的にデコードして .text に格納してくれます。

この結果をごにょごにょして得たい情報を取り出します。

ごにょごにょの部分は目的によって人それぞれですので、各自で工夫して処理しましょう。

 

requestsで得たコンテンツを処理する(htmlタグの除去)

requestsにて得たコンテンツは、ものすごい汚い形をしている。

例えば、yahooのページの一部を抜粋すると、、、

<th colspan="7"><a href="https://calendar.yahoo.co.jp/" class="pbcMonth">11月</a><em class="pbcYear">2018</em></th>
</tr></thead>
<tbody><tr>
<td><span class="h">日</span></td>
<td>月</td>
<td>火</td>
<td>水</td>
<td>木</td>
<td>金</td>
<td>土</td>
</tr>

...

このようになる。

htmlで記述されたサイトでは、<div> ~ </div> だったり、<td> ~ </td> だったりと、htmlタグと呼ばれる文書の構造を表す記号が大量に含まれています。

それらを除去する方法について少し記述します。

 

reモジュールを用いてhtmlタグを除去する

pythonには正規表現操作を行うreというモジュールがありますので、そちらを利用します。

正規表現の使い方についてはここでは言及しませんので、各自で調べてください。

>>> import re
>>> p = re.compile(r"<[^>]*?>")   # HTML tags
>>> removed_result = p.sub( "", r.text )

import re
reモジュールのインポート

p = re.compile(r”<[^>]*?>”)
htmlタグを正規表現で表します。

removed_result = p.sub( “”, r.text )
.sub関数を用いて、先ほど取得したサイトの結果に対して、htmlタグを置換します。
(sub関数の第一引数を””とすることで、実質消去している。)

 

reを用いると、先ほどの汚い情報がこのように綺麗になります。

11月2018


日
月
火
水
木
金
土

...

あとは、これを煮るなり焼くなり、、、皆さんにお任せします。

 

 

以上、requestsを用いてwebサイトの情報を取得する方法についてでした。