私は比較的 Python に不慣れで、複数の金融サイトからデータを収集するスクリーン スクレイピング アプリケーションを使用しています。今のところ4つの手続きがあります。2 つはわずか数分で実行され、残りはそれぞれ 2 時間です。これら 2 つは、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()