Pythonでシストレ練習第5章その2
第5章
まずlibフォルダのstock_list_maker.py
#!/usr/bin/env python # -*- coding: utf-8 -*- import os.path import re import urllib.request, urllib.error import codecs # Yahooの銘柄情報ページから情報を取得し、 # 銘柄リストを作るクラス # 証券コード、上場市場、単元株数・売買単位が含まれる class StockListMaker: def __init__(self, market): self.market = market self.data_dir = 'data' self.stock_info = [] # 銘柄情報の取得 def get_stock_info(self, code): data = {} page = self.open_page(code) if page == None: return text = page.read().decode('utf-8') data = self.parse(text) if data == {}: return data['code'] = code print(code) self.stock_info.append(data) return self.stock_info def open_page(self, code): try: url = 'http://stocks.finance.yahoo.co.jp/stocks/detail/?code={0}.{1}'.format(code, self.market) request = urllib.request.Request(url) return urllib.request.urlopen(request) except urllib.error.HTTPError: print('HTTPError') return except urllib.error.URLError: print('URLError') return # 銘柄情報の保存 def save_stock_list(self, file_name): f = codecs.open(os.path.join(self.data_dir, file_name), 'w', 'utf-8') for data in self.stock_info: txt = '{0},{1},{2}\n'.format(data['code'], data['market_section'], data['unit']) f.write(txt) f.close() # HTMLから銘柄情報を抜き出す def parse(self ,text): sections = [] data = {} reg_market = re.compile('stockMainTabName">([^<]+)<') reg_unit = re.compile('ymuiEditLink mar0"><strong>((?:\d|,)+|---)</strong>株</dd>') for line in text.splitlines(): if reg_market.search(line) != None: sections.append(reg_market.search(line).group(1)) elif reg_unit.search(line) != None: if sections != []: data['market_section'] = sections[0] data['unit'] = self.get_unit(reg_unit.search(line).group(1)) return data return data # 単位株数を得る def get_unit(self, s): if s == '---': return 1 else: pattern = re.compile(',') return pattern.sub('', s)
そして本来はbinフォルダにつくるはずのmake_stock_list.pyだが、
checkフォルダに暫定的につくっている。
#!/usr/bin/env python # -*- coding: utf-8 -*- import sys from lib.stock_list_maker import StockListMaker # 東証銘柄の銘柄リストを作る # 使い方:python bin\make_stock_list.py file_name ??? # file_nameは省略可。省略すると"tosho_list.txt"になる argvs = sys.argv if len(argvs) == 1: file_name = "tosho_list.txt" else: file_name = argvs[1] slm = StockListMaker('t') for code in range(1301, 10000, 1): slm.get_stock_info(code) slm.save_stock_list(file_name) input()
htmlはPythonだとパーサーを使うのが一般的と書いてあったが、
パーサーの使い方がいまいちわからなかったので、
とりあえず今の段階ではRubyと同じ正規表現を使っている。
第5章終わり、6章に続く。
- 作者: 柴田淳
- 出版社/メーカー: ソフトバンククリエイティブ
- 発売日: 2012/08/29
- メディア: 単行本
- 購入: 1人 クリック: 13回
- この商品を含むブログ (37件) を見る