Pregunta

Así que tengo el siguiente conjunto de código de análisis delicioso información. Imprime los datos de una página deliciosa en el siguiente formato

Favorito | Número de personas

Favorito | Número de personas etc ...

Solía ??usar el siguiente método para encontrar esta información.

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)

Pero el problema era que algunos marcadores, no tienen un número de personas, por lo que decidí analizarlo diferente por lo que iba a obtener los datos de forma simultánea e imprimir los marcadores y el número de personas lado a lado.

EDIT: lo obtuvo de 15 - 5 segundos con esta versión actualizada, alguna sugerencia más

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)

El rendimiento en esto es terrible, sin embargo, toma 17 segundos para analizar la primera página, y alrededor de 15 segundos a partir de entonces en una máquina bastante decente. Se degrada significativamente cuando se pasa de la primera porción de código que el segundo bit. ¿Hay algo que pueda hacer para imporve Potencia aquí?

¿Fue útil?

Solución

No entiendo por qué va a asignar a vote - dos veces. La primera tarea es innecesaria y de hecho bastante pesado, ya que se debe analizar todo el documento - en cada iteración. ¿Por qué?

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

Otros consejos

Si está preocupado por el rendimiento que podría echar un vistazo a algo que habla con el delicioso API, en lugar de la pantalla-raspado, es decir, pydelicious . Por ejemplo:

>>> 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 hace mucho más de lo que necesita en este caso. Si realmente quiere poner encima de la velocidad, entonces yo sugeriría tomar un enfoque más básico de urllib + un simple analizador de línea por línea.

Analizar una página del tamaño del ejemplo "asd" debe tomar muy por debajo de un segundo en una máquina moderna.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top