Pythonを使ってBloombergからデータスクレイビングする話
こんばんは、気づいたらUSのマーケット開いてますね、夜です。
SPXは順調に過去最高値を目指して行進中です。
さて、今日のテーマはタイトル通りです。個人でもマーケットのリアルタイムデータが取りたい的なモチベーションでデータスクレイビングを思い立ち、通貨・商品のデータも揃ってるBloombergから拝借するかーみたいなノリでおもむろにコーディングし始めた感じです。
当方スクレイビングは初心者なこともあり、ネットの記事のツギハギでようやく完成しました。データ乞食するためにソースコードまで乞食する、情けない限りです。
まず参考にしたサイトがこれ。
これが大枠です。ところがPython3に適用するところで問題発生。
そこで参考にしたサイトがこれ。
スクレイビングの基礎知識って意味でこれも。
これで完成したのが以下のコード(ほぼ丸パクリ)。
# coding: UTF-8 import urllib3 from bs4 import BeautifulSoup # アクセスするURL url = "https://www.bloomberg.co.jp/quote/SPX:IND" # URLにアクセスする htmlが帰ってくる http = urllib3.PoolManager() response = http.request('GET',url) # htmlをBeautifulSoupで扱う soup = BeautifulSoup(response.data, "html.parser") # div要素全てを摘出する→全てのdiv要素が配列に入ってかえされます→[<div class="m-wficon triDown"></div>, <div class="l-h... div = soup.find_all("div") # print時のエラーとならないように最初に宣言しておきます。 price = "" # for分で全てのspan要素の中からClass="price"となっている物を探します for tag in div: # classの設定がされていない要素は、tag.get("class").pop(0)を行うことのできないでエラーとなるため、tryでエラーを回避する try: # tagの中からclass="n"のnの文字列を摘出します。複数classが設定されている場合があるので # get関数では配列で帰ってくる。そのため配列の関数pop(0)により、配列の一番最初を摘出する # <div class="hoge" class="foo"> → ["hoge","foo"] → hoge string_ = tag.get("class").pop(0) # 摘出したclassの文字列にpriceと設定されているかを調べます if string_ in "price": # priceが設定されているのでtagで囲まれた文字列を.stringであぶり出します price = tag.string # 摘出が完了したのでfor分を抜けます break except: # パス→何も処理を行わない pass # 摘出した価格を出力します。 print(price)
次回は時系列データを取ってきたり、銘柄ごとにデータ取ったりみたいな話になると思います。では。