隗より始めよ

今後はいろいろ考え始めます。

requests-htmlを使ってみた

f:id:mazarimono:20180929221145j:plain

9月のはんなりPythonではスクレイピングのハンズオンをやってみました。

その時に直前にpyconjpがありまして、そこでスクレイピングに関する発表もあったので資料を見ていたらrequests-htmlというライブラリがあることが分かりました。

hannari-python.connpass.com

http://docs.python-requests.org/en/master/

これまでrequestsとbs4を使っていたのですが、requests-htmlがめちゃ便利なのでご紹介します。2つを使って書くよりもかなりコードが短くなるのがうれしい上に、javascriptを使ったサイトでもデータが取れます。



普通のスクレイピング

まずは四季報のサイトをスクレイピングしてみます。速報ニュースのタイトルを取ってみます。

shikiho.jp

from requests_html import HTMLSession
session = HTMLSession()
r = session.get('https://shikiho.jp/')
titles = r.html.find('.news_text')

for title in titles:
    print(title.text)

これで速報のトップページにある速報が全部とれます。

★本日の【イチオシ決算】 ネットワン、ノリタケ、ハピネット (…
★本日の【サプライズ決算】速報 (09月28日)
バブル後高値の日経平均、円安で業績期待 米株調整に警戒感も
野村HDなど証券株が堅調、日経平均27年ぶり高値で見直す
ベクトルが大幅反発し新値、国内証券が新規「強気」格付けに
ソフトバンクGが18年半ぶり高値、海外からの資金流入増加
JALCOHDが急反発、不動産事業開始で収益拡大を期待
ソースネクストが6連騰し新値、「ポケトーク」が米国で採用
安川情報が続騰、19年2月期上期は利益率改善し大幅増益で着地
サイバネットSが急落、18年12月期は最終赤字に転落
コマツが強含み基調、建機出荷堅調で「三役好転」維持
アイビー化粧品が大幅安、「レッドパワーセラム」不振で下方修正
王子HDが新高値 「段ボール値上げ」報道で買い反応
吉野家HDが続落、最終赤字転落への下方修正を嫌気
JCRファーマが大幅反発、2Q業績予想の上方修正を好感
米国株式市場はハイテク株主導で上昇、FRBの景気判断も追い風
★本日の【イチオシ決算】 JCRファ、ストライク、NaIT…
★本日の【サプライズ決算】速報 (09月27日)
9日ぶり反落、過熱感を意識し利益確定売り

簡単!findのセレクターの書き方に関しては、requests-htmlのページからリンクされています。

CSS Selectors Reference

classだったら'.'をつけます。上の例の場合、class='news_text'だったので、r.html.find('.news_text')になっています。idだったら'#'をつけます。id = 'about'だと、r.html.find('#about')みたいな感じでいけます。

どんなものが取れるかみたいなのはdir()を使えば見られます。例えば、先のサイトだとでやってみると・・・

from requests_html import HTMLSession
session = HTMLSession()
r = session.get('https://shikiho.jp/')
print(dir(r))

こんな感じのデータが出てきます。

['__attrs__', '__bool__', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__enter__', '__eq__', '__exit__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__nonzero__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_content', '_content_consumed', '_from_response', '_html', '_next', 'apparent_encoding', 'close', 'connection', 'content', 'cookies', 'elapsed', 'encoding', 'headers', 'history', 'html', 'is_permanent_redirect', 'is_redirect', 'iter_content', 'iter_lines', 'json', 'links', 'next', 'ok', 'raise_for_status', 'raw', 'reason', 'request', 'session', 'status_code', 'text', 'url']

全部の意味は分かりませんが、まぁ色々データがあるみたいです。

Javascriptを使ったサイトのスクレイピング

これだけだったら別にrequestsとbs4でできますね。requests-htmlの良いところはjavascriptを使ったサイトからもデータが取れるところです。ちょっとやってみましょう。

JPXのサイトには株価データがありますが、チャートも見られるようになっていて、株価が普通にやると取れません。

from requests_html import HTMLSession

session = HTMLSession()
r = session.get('https://www.jpx.co.jp/')
tpx = r.html.find('.chart-box', first=True)

print(tpx.html)       

実行すると…

データの更新について
[Finished in 1.0s]

値段のところ取れてない・・・。しかし、r.html.render()を上のコードに足すと”がさっ”と帰ってきます。

from requests_html import HTMLSession

session = HTMLSession()
r = session.get('https://www.jpx.co.jp/')
r.html.render()
tpx = r.html.find('.chart-box', first=True)

print(tpx.text)
TOPIX1,817.25+17.14
現在値
前日比
1,817.25
+17.14
2018/09/28 15:00
チャート拡大
JPX日経40016,096.04+158.90
現在値
前日比
16,096.04
+158.90
2018/09/28 15:00
チャート拡大
東証マザーズ指数1,077.55+10.25
現在値
前日比
1,077.55
+10.25
2018/09/28 15:00
チャート拡大
JASDAQ INDEX167.13+1.30
現在値
前日比
167.13
+1.30
2018/09/28 15:00
チャート拡大
東証REIT指数1,777.18+2.42
現在値
前日比
1,777.18
+2.42
2018/09/28 15:00
チャート拡大
データの更新について
[Finished in 4.7s]

たくさん出てきました。

何でも取れるわけではなかった

もう無敵状態!!なんでも取れるとか思っていたら大きな間違いでした。

bloombergのサイトのトランプを追っかけるのページがあります。

https://www.bloomberg.com/features/trump-daily/

これ取れたら便利やなーとか思って、早速やってみました。

from requests_html import HTMLSession
session = HTMLSession()
r = session.get('https://www.bloomberg.com/features/trump-daily/')
r.html.render(sleep=10)
print(r.raise_for_status)
print(r.html)
print(r.html.text)

これを実行すると、違うurlにつながって怒られました。

<bound method Response.raise_for_status of <Response [200]>>
<HTML url='https://www.bloomberg.com/tosv2.html?vid=&uuid=fce1d380-c3e7-11e8-a0da-2794d5dcebd0&url=L2ZlYXR1cmVzL3RydW1wLWRhaWx5Lw=='>
Terms of Service Violation
(以下省略)

はい。なんでも行けるわけではないようです。クッキーがどうのこうの言っているので、クッキーを設定したりしたらいけるのかなぁ・・・。