Улучшение BeautifulSoup Perf - PullRequest
       29

Улучшение BeautifulSoup Perf

1 голос
/ 19 декабря 2010

ТАК У меня есть следующий набор кода, разбирающий вкусную информацию.Он печатает данные со страницы 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 секунд после этого на довольно приличной машине.Он значительно ухудшился при переходе от первого бита кода ко второму.Есть ли что-нибудь, что я могу сделать, чтобы улучшить перфект здесь?

Ответы [ 3 ]

3 голосов
/ 19 декабря 2010

Если вы беспокоитесь о производительности, вы можете взглянуть на что-то, что говорит с восхитительным 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 голосов
/ 19 декабря 2010

Я не понимаю, почему вы присваиваете vote - дважды. Первое назначение не является необходимым и действительно довольно тяжелым, поскольку оно должно анализировать весь документ - на каждой итерации. Почему?

   vote = BeautifulSoup(html)
   vote = bookmark.findAll('span', attrs={'class': 'delNavCount'})
0 голосов
/ 19 декабря 2010

BeautifulSoup делает намного больше, чем нужно в этом случае.Если вы действительно хотите увеличить скорость, я бы предложил более базовый подход urllib + простой построчный синтаксический анализатор.намного меньше одной секунды на современной машине.

...