0

私は比較的 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()
4

2 に答える 2

0

いただいた短縮コードは一部誤りがあり、コードがわかりずらくなっております。より多くのコードを表示して確認できれば、問題を理解しやすくなります。

コードと問題の説明から、いくつかアドバイスがあります。

  1. 関数ではrun_proc()、すべてのシンボルの Web ページを読み取ります。URL が同じであるか、いくつかの URL が繰り返されている場合、Web ページを 1 回だけ読み取り、それらをメモリまたはハードウェアに書き込んでから、すべてのシンボルのページ コンテンツを分析しますか? それは保存します

  2. BeautifulSoupコードを書くのは簡単ですが、パフォーマンスが少し遅くなります。lxmlあなたの仕事をすることができれば、ウェブページのコンテンツを分析する時間を大幅に節約できます.

それが役立つことを願っています。

于 2013-08-10T05:34:25.080 に答える
0

私は次の投稿から正しい方向に向けられました(作者に感謝します):

Urllib2 でより効率的にスクレイピングするには?

于 2013-08-10T20:54:08.403 に答える