Python クロール AI 機械学習

BeautifulSoupを用いて簡単にインターネット上のWebから情報をを収集することができます。 ここではYahooファイナンスから情報を切り出します
Pythonをインストールしている方は、PIPやcondaでインストールしてください lxml、pandas、requestsのインストールも忘れないように

Yahooファイナンスのホームページの仕組みをまず調べます

In [ ]:
# Web scraping Yahooo Finamce
# sony page http://stocks.finance.yahoo.co.jp/stocks/detail/?code=6758.T
    
import requests
from bs4 import BeautifulSoup

def get_stockprice(code):
    base_url = "http://stocks.finance.yahoo.co.jp/stocks/detail/"
    query = {}
    query["code"] = code + ".T"
    ret = requests.get(base_url, params = query)
    soup = BeautifulSoup(ret.content, "lxml")
    stocktable =  soup.find('table', {'class':'stocksTable'})
    print(stocktable)
    symbol =  stocktable.findAll('th', {'class':'symbol'})[0].text
    stockprice = stocktable.findAll('td', {'class':'stoksPrice'})[1].text
    return symbol, stockprice

if __name__ == "__main__":
    symbol, stockprice = get_stockprice("6758")
    print (symbol, stockprice)

Yahooファイナンスのデータ取り込みの関数を作成します

In [106]:
# Web scraping Yahooo Finamce
    
import requests
from bs4 import BeautifulSoup

def get_stockprice(code):
    base_url = "http://stocks.finance.yahoo.co.jp/stocks/detail/"
    query = {}
    query["code"] = code + ".T"
    ret = requests.get(base_url, params = query)
    soup = BeautifulSoup(ret.content, "lxml")
    stocktable =  soup.find('table', {'class':'stocksTable'}) # HP上のtable情報
    symbol =  stocktable.findAll('th', {'class':'symbol'})[0].text # HP上のTH情報
    stockprice = stocktable.findAll('td', {'class':'stoksPrice'})[1].text # HP上のTD情報
    return symbol, stockprice # 会社名と株価を抽出します

抽出したい21件の会社を会社コードで指定します

In [ ]:
import pandas as pd

l = []
l.append("6758")
l.append("8411")
l.append("8306")
l.append("3103")
l.append("6803")
l.append("6502")
l.append("4689")
l.append("8107")
l.append("8303")
l.append("9101")
l.append("8604")
l.append("6501")
l.append("9972")
l.append("6753")
l.append("7201")
l.append("6752")
l.append("9501")
l.append("7011")
l.append("7647")
l.append("7211")
l.append("9104")

抽出します

In [110]:
m =[]
#header = "code", "symbol", "stockprice"
#m.append(header)
for el in l:
    symbol, stockprice = get_stockprice(el)
    print (el, symbol, stockprice)
    m.append([el, symbol, stockprice])

print(m)
6758 ソニー(株) 5,838
8411 (株)みずほフィナンシャルグループ 157.3
8306 (株)三菱UFJフィナンシャル・グループ 522.9
3103 ユニチカ(株) 426
6803 ティアック(株) 195
6502 (株)東芝 3,235
4689 ヤフー(株) 325
8107 (株)キムラタン 38
8303 (株)新生銀行 1,692
9101 日本郵船(株) 1,794
8604 野村ホールディングス(株) 368.4
6501 (株)日立製作所 3,963
9972 アルテック(株) 212
6753 シャープ(株) 1,379
7201 日産自動車(株) 764.6
6752 パナソニック(株) 917.8
9501 東京電力ホールディングス(株) 527
7011 三菱重工業(株) 4,640
7647 (株)音通 27
7211 三菱自動車(株) 501
9104 (株)商船三井 2,597
[['6758', 'ソニー(株)', '5,838'], ['8411', '(株)みずほフィナンシャルグループ', '157.3'], ['8306', '(株)三菱UFJフィナンシャル・グループ', '522.9'], ['3103', 'ユニチカ(株)', '426'], ['6803', 'ティアック(株)', '195'], ['6502', '(株)東芝', '3,235'], ['4689', 'ヤフー(株)', '325'], ['8107', '(株)キムラタン', '38'], ['8303', '(株)新生銀行', '1,692'], ['9101', '日本郵船(株)', '1,794'], ['8604', '野村ホールディングス(株)', '368.4'], ['6501', '(株)日立製作所', '3,963'], ['9972', 'アルテック(株)', '212'], ['6753', 'シャープ(株)', '1,379'], ['7201', '日産自動車(株)', '764.6'], ['6752', 'パナソニック(株)', '917.8'], ['9501', '東京電力ホールディングス(株)', '527'], ['7011', '三菱重工業(株)', '4,640'], ['7647', '(株)音通', '27'], ['7211', '三菱自動車(株)', '501'], ['9104', '(株)商船三井', '2,597']]

pandasで見やすく整形して出力

In [111]:
df = pd.DataFrame(m)
df.columns = ["code", "symbol", "stockprice"]
df