相場商売

トレーディングビジネスあれこれ

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章に続く。

みんなのPython 第3版

みんなのPython 第3版