我对 python 比较陌生,我正在通过一个从多个金融网站收集数据的屏幕抓取应用程序工作。我现在有四个程序。两个在几分钟内运行,另外两个......每个小时。这两个查找我在 csv 文件中的特定股票代码的信息。我正在使用 4,000 多个符号。我知道的足够多,大部分时间都花在了 IO 上。我必须将这些时间缩短到每个小时 1/2 小时(或者,更好。这是否过于雄心勃勃?)这对我来说有任何实际用途。我正在使用 python 3 和 BeautifulSoup。
我在下面有我正在做的事情的一般结构。我已经在概念上缩写了非必要部分。我一次读取多个调用/线程上的许多线程以加快速度,似乎有很多选择。根据我目前所拥有的结构,谁能指出我应该追求的正确方向?这将是一个巨大的帮助。我确信这很明显,但是这个过程与主驱动程序模块中的其他数据下载过程一起被调用。提前致谢...
from bs4 import BeautifulSoup
import misc modules
class StockOption:
def __init__(self, DateDownloaded, OptionData):
self.DateDownloaded = DateDownloaded
self.OptionData = OptionData
def ForCsv(self):
return [self.DateDownloaded, self.Optiondata]
def extract_options(TableRowsFromBeautifulSoup):
optionsList = []
for opt in range(0, len(TableRowsFromBeautifulSoup))
optionsList.append(StockOption(data parsed from TableRows arg))
return optionsList
def run_proc():
symbolList = read in csv file of tickers
for symb in symbolList:
webStr = #write the connection string
try:
with urllib.request.urlopen(webStr) as url: page = url.read()
soup = BeautifulSoup(page)
if soup.text.find('There are no All Markets results for') == -1:
tbls = soup.findAll('table')
if len(tbls[9]) > 1:
expStrings = soup.findAll('td', text=True, attrs={'align': 'right'})[0].contents[0].split()
expDate = datetime.date(int(expStrings[6]), int(currMonth), int(expStrings[5].replace(',', '')))
calls = extract_options(tbls[9], symb, 'Call', expDate)
puts = extract_options(tbls[13], symb, 'Put', expDate)
optionsRows = optionsRows + calls
optionsRows = optionsRows + puts
except urllib.error.HTTPError as err:
if err.code == 404:
pass
else:
raise
opts = [0] * (len(optionsRows))
for option in range(0, len(optionsRows)):
opts[option] = optionsRows[option].ForCsv()
#Write to the csv file.
with open('C:/OptionsChains.csv', 'a', newline='') as fp:
a = csv.writer(fp, delimiter=',')
a.writerows(opts)
if __name__ == '__main__':
run_proc()