【问题标题】:Multithreaded screen scraping help needed需要多线程屏幕抓取帮助
【发布时间】:2013-08-10 04:19:25
【问题描述】:

我对 python 比较陌生,我正在使用一个从多个金融网站收集数据的屏幕抓取应用程序。我现在有四个程序。两个在几分钟内运行,另外两个......每个小时。这两个查找我在 csv 文件中拥有的特定股票代码的信息。我正在使用 4,000 多个符号。我知道的足够多,大部分时间都花在了 IO over wire 上。我必须将这些时间缩短到每个小时 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()

【问题讨论】:

    标签: python beautifulsoup screen-scraping


    【解决方案1】:

    你给出的缩写代码有一些错误,所以理解代码有点困难。如果您可以显示更多代码并检查它,将更容易理解您的问题。

    从代码和问题描述中,我有一些建议与大家分享:

    1. run_proc() 函数中,它读取每个符号的网页。如果 url 相同或者某些 url 重复,那么如何只读取一次网页并将它们写入内存或硬件,然后分析每个符号的页面内容?它会保存

    2. BeautifulSoup 代码容易写,但性能有点慢。如果lxml可以做你的工作,将节省大量分析网页内容的时间。

    希望它会有所帮助。

    【讨论】:

    • 感谢您的反馈。我不确定你的意思是什么错误;有些代码是故意缩写的,所以这是不可重现的,不......但大部分代码都在那里,并且运行没有错误。另外..没有一个网址是相同的;循环中写入了不同的 url,每个唯一符号对应一个。不过,我会研究 lxml。谢谢。
    【解决方案2】:

    我从以下帖子中指出了正确的方向(感谢作者顺便说一句):

    How to scrape more efficiently with Urllib2?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-17
      相关资源
      最近更新 更多