Question

SO je l'ensemble suivant de code d'analyse des informations délicieux. Il imprime des données à partir d'une page Délicieux dans le format suivant

Signet | Nombre de personnes

Signet | Nombre de personnes etc ...

Je l'habitude d'utiliser la méthode suivante pour trouver cette information.

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)

Mais le problème est que certains signets ont un certain nombre na pas de personnes, alors j'ai décidé d'analyser différent pour que j'obtenir les données simultanément et imprimer les signets et le nombre de personnes côte à côte.

EDIT: Je l'ai de 15 - 5 secondes avec cette version mise à jour, suggestions plus

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)

La performance de c'est terrible si, prend 17 secondes pour analyser la première page, et environ 15 secondes par la suite sur une machine assez décente. Il dégradé de manière significative lors du passage du premier bit de code à la deuxième bit. Est-ce que je peux faire pour imporve ici perf?

Était-ce utile?

La solution

Je ne comprends pas pourquoi vous assignez à vote - deux fois. La première mission est inutile et même assez lourd, car il doit analyser le document entier - à chaque itération. Pourquoi?

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

Autres conseils

Si vous êtes préoccupé par la performance que vous pourriez jeter un oeil à quelque chose qui parle à l'API délicieux, plutôt que l'écran de grattage, à savoir pydelicious . Par exemple:

>>> 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'

BeautifulSoup fait beaucoup plus que ce dont vous avez besoin dans ce cas. Si vous voulez vraiment tourner la manivelle jusqu'à la vitesse, alors je suggère de prendre une approche plus fondamentale de urllib + un analyseur simple, ligne par ligne.

Parsing une page de la taille de l'exemple « asd » devrait prendre bien moins d'une seconde sur une machine moderne.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top