【问题标题】:Improving BeautifulSoup Perf改进 BeautifulSoup 性能
【发布时间】:2010-12-19 03:15:11
【问题描述】:

所以我有以下一组解析美味信息的代码。它以以下格式从 Delicious 页面打印数据

书签 |人数

书签 |人数 等等……

我曾经使用以下方法来查找此信息。

def extract (soup):
    links = soup.findAll('a',rel='nofollow')
    for link in links:
        print >> outfile, link['href']

    hits = soup.findAll('span', attrs={'class': 'delNavCount'})
    for hit in hits:
        print >> outfile, hit.contents


#File to export data to
outfile = open("output.txt", "w")

#Browser Agent
br = Browser()    
br.set_handle_robots(False)
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]


url= "http://www.delicious.com/asd"
page = br.open(url)
html = page.read()
soup = BeautifulSoup(html)
extract(soup)

但问题是有些书签没有人数,所以我决定对它进行不同的解析,这样我就可以同时获取数据并并排打印出书签和人数。

编辑:用这个更新的版本从 15 到 5 秒得到它,还有更多建议

def extract (soup):
    bookmarkset = soup.findAll('div', 'data')
    for bookmark in bookmarkset:
        link = bookmark.find('a',)
        vote = bookmark.find('span', 'delNavCount')
        try:
            print >> outfile, link['href'], " | " ,vote.contents
        except:
            print >> outfile, "[u'0']"
    #print bookmarkset


#File to export data to
outfile = open("output.txt", "w")

#Browser Agent
br = Browser()    
br.set_handle_robots(False)
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]


url= "http://www.delicious.com/asd"
page = br.open(url)
html = page.read()
soup = BeautifulSoup(html)
extract(soup)

这方面的性能很糟糕,解析第一页需要 17 秒,然后在相当不错的机器上大约需要 15 秒。从代码的第一位到第二位时,它显着下降。我能做些什么来提高这里的性能吗?

【问题讨论】:

  • 还要注意classfind/findAll的第二个位置参数,所以你可以使用soup.find('div', 'data')bookmark.findAll('span', 'delNavCount')

标签: python web-crawler beautifulsoup mechanize delicious-api


【解决方案1】:

我不明白你为什么要分配给vote - 两次。第一个任务是不必要的,而且确实很繁重,因为它必须在每次迭代时解析整个文档。为什么?

   vote = BeautifulSoup(html)
   vote = bookmark.findAll('span', attrs={'class': 'delNavCount'})

【讨论】:

    【解决方案2】:

    如果您关心性能,您可以看看与美味 API 对话的东西,而不是屏幕抓取,即 pydelicious。例如:

    >>> import pydelicious
    >>> pydelicious.get_userposts('asd')
    [{'extended': '', 'description': u'Ksplice - System administration and software blog', 'tags': u'sysadm, blog, interesting', 'url': u'http://blog.ksplice.com/', 'user': u'asd'
    

    【讨论】:

      【解决方案3】:

      BeautifulSoup 在本例中所做的远远超出您的需要。如果您真的想提高速度,那么我建议您采用更基本的 urllib 方法 + 一个简单的逐行解析器。

      在现代机器上解析“asd”示例大小的页面需要不到一秒钟的时间。

      【讨论】:

        猜你喜欢
        • 2019-12-25
        • 2015-03-21
        • 2016-12-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-17
        • 2010-11-01
        相关资源
        最近更新 更多