提升BeautifulSoup性能

1 投票
3 回答
616 浏览
提问于 2025-04-16 08:43

我有一段代码,用来解析一些有趣的信息。它会把从一个网站上获取的数据以这样的格式打印出来:

书签 | 人数

书签 | 人数

等等……

我以前用下面的方法来找到这些信息。

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秒,而我的机器性能还不错。从第一段代码到第二段代码,性能明显下降。我能做些什么来提高性能呢?

3 个回答

0

BeautifulSoup的功能比你这次需要的要多得多。如果你真的想提高速度,我建议你用更简单的方法,比如用urllib加上一个简单的逐行解析器。

解析一个像“asd”这样的页面,在现代电脑上应该不到一秒钟就能完成。

3

如果你在乎性能,可以考虑使用一些可以直接与美味API(delicious 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

我不明白你为什么要给 vote 赋值两次。第一次赋值其实是多余的,而且还很费劲,因为它需要每次都解析整个文档。为什么要这样做呢?

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

撰写回答