Acelerar el raspador web

Estoy raspando 23770 páginas web con un raspador web bastante simple usando scrapy . Soy bastante nuevo en scrapy e incluso python, pero me las arreglé para escribir una araña que hace el trabajo. Sin embargo, es muy lento (tarda aproximadamente 28 horas en rastrear las 23770 páginas).

He buscado en la página web de scrapy las listas de correo y en el scrapy , pero parece que no encuentro recomendaciones genéricas para escribir rastreadores rápidos para principiantes. Tal vez mi problema no sea la araña en sí, sino la forma en que lo ejecuto. Todas las sugerencias son bienvenidas!

He enumerado mi código a continuación, si es necesario.

 from scrapy.spider import BaseSpider from scrapy.selector import HtmlXPathSelector from scrapy.item import Item, Field import re class Sale(Item): Adresse = Field() Pris = Field() Salgsdato = Field() SalgsType = Field() KvmPris = Field() Rum = Field() Postnummer = Field() Boligtype = Field() Kvm = Field() Bygget = Field() class HouseSpider(BaseSpider): name = 'House' allowed_domains = ["http://boliga.dk/"] start_urls = ['http://www.boliga.dk/salg/resultater?so=1&type=Villa&type=Ejerlejlighed&type=R%%C3%%A6kkehus&kom=&amt=&fraPostnr=&tilPostnr=&iPostnr=&gade=&min=&max=&byggetMin=&byggetMax=&minRooms=&maxRooms=&minSize=&maxSize=&minsaledate=1992&maxsaledate=today&kode=&p=%d' %n for n in xrange(1, 23770, 1)] def parse(self, response): hxs = HtmlXPathSelector(response) sites = hxs.select("id('searchresult')/tr") items = [] for site in sites: item = Sale() item['Adresse'] = site.select("td[1]/a[1]/text()").extract() item['Pris'] = site.select("td[2]/text()").extract() item['Salgsdato'] = site.select("td[3]/text()").extract() Temp = site.select("td[4]/text()").extract() Temp = Temp[0] m = re.search('\r\n\t\t\t\t\t(.+?)\r\n\t\t\t\t', Temp) if m: found = m.group(1) item['SalgsType'] = found else: item['SalgsType'] = Temp item['KvmPris'] = site.select("td[5]/text()").extract() item['Rum'] = site.select("td[6]/text()").extract() item['Postnummer'] = site.select("td[7]/text()").extract() item['Boligtype'] = site.select("td[8]/text()").extract() item['Kvm'] = site.select("td[9]/text()").extract() item['Bygget'] = site.select("td[10]/text()").extract() items.append(item) return items 

¡Gracias!

Aquí hay una colección de cosas para probar:

  • Usa la última versión desechable (si no la estás usando ya)
  • comprobar si se utilizan middlewares no estándar
  • intente boost las configuraciones CONCURRENT_REQUESTS_PER_DOMAIN , CONCURRENT_REQUESTS ( docs )
  • desactivar el registro LOG_ENABLED = False ( docs )
  • intente yield un elemento en un bucle en lugar de recostackr elementos en la lista de items y devolverlos
  • usar el cache local de DNS (ver este hilo )
  • verifique si este sitio está utilizando el umbral de descarga y limita su velocidad de descarga (vea este hilo )
  • registrar el uso de la cpu y la memoria durante la ejecución de la araña: vea si hay algún problema allí
  • intenta ejecutar la misma araña en el servicio de scrapyd
  • vea si grequests + lxml funcionará mejor (pregunte si necesita ayuda para implementar esta solución)
  • intente ejecutar Scrapy en pypy , vea Ejecutar Scrapy en PyPy

Espero que ayude.

Mirando su código, diría que la mayor parte de ese tiempo se gasta en solicitudes de red en lugar de procesar las respuestas. Se aplican todos los consejos que @alecxe proporciona en su respuesta, pero sugeriría la configuración HTTPCACHE_ENABLED , ya que almacena en caché las solicitudes y evita hacerlo por segunda vez. Ayudaría en los siguientes rastreos e incluso en el desarrollo sin conexión. Ver más información en los documentos: http://doc.scrapy.org/en/latest/topics/downloader-middleware.html#module-scrapy.contrib.downloadermiddleware.httpcache

También trabajo en el desguace web, utilizando C # optimizado, y termina enlazado a la CPU, por lo que estoy cambiando a C.

El análisis HTML sopla la memoria caché de datos de la CPU, y bastante seguro de que su CPU no está usando SSE 4.2, ya que solo puede acceder a esta función utilizando C / C ++.

Si realiza los cálculos matemáticos, estará enlazado rápidamente, pero no a la memoria.

Una solución para acelerar su scrapy es configurar sus start_urls apropiadamente.

Por ejemplo, si nuestros datos de destino se encuentran en http://apps.webofknowledge.com/doc=1 donde el número de documentos oscila entre 1 y 1000 , puede configurar su start_urls en los siguientes start_urls :

  start_urls = [ "http://apps.webofknowledge.com/doc=250", "http://apps.webofknowledge.com/doc=750", ] 

De esta manera, las solicitudes comenzarán de 250 a 251,249 y de 750 a 751,749 simultáneamente, por lo que obtendrá 4 veces más rápido en comparación con start_urls = ["http://apps.webofknowledge.com/doc=1"] .