Compruebe el stock de la lista de referencias -- python campo con performance campo con scrapy camp codereview Relacionados El problema

Check the stock of references list


5
vote

problema

Español

Hice esta araña que comprueba el stock de la lista de referencias (alrededor de 3500 referencias).

Ahora, la araña toma alrededor de 37 segundos para desechar las referencias de 400. La CPU es de alrededor del 5%, la tarjeta de red (1Gbps) alrededor del 18%. Mi conexión a Internet es de 300 mbps simétricos y solo está conectado a esta computadora.

¿Alguna idea de mejorar el rendimiento? ¿Es este un buen desempeño? Tal vez el enrutador ISP es un cuello de botella?

  y7  
Original en ingles

I did this spider that checks the stock of references list (around 3500 references).

Now the spider takes around 37 seconds to scrap 400 references. The CPU is around 5%, the network card (1Gbps) around 18%. My internet connection is 300Mbps simetric and it's only connected to this computer.

Any idea to improve performance? Is this a good performance? Maybe ISP router is a bottleneck?

import scrapy from scrapy.crawler import CrawlerProcess   class Spider(scrapy.Spider):     name = "Spider"      start_urls = ['URLS']      def __init__(self, references=None, *args, **kwargs):         super(ktmSpider, self).__init__(*args, **kwargs)      def parse(self, response):         return scrapy.FormRequest.from_response(             response,             formdata={'UserName': 'username', 'Password': 'password'},             callback=self.after_login         )      def after_login(self, response):         ref = references.pop()         yield scrapy.Request(url="url" + ref, callback=self.parse_stock)      def parse_stock(self, response):         self.f.write(response.selector.xpath('//*[@id="priceDetails"]/form/div[2]/text()').extract_first() + ',')         self.f.write(response.selector.xpath('//*[@id="priceDetails"]/form/div[8]/div[1]/span/span[2]/text()').extract_first() + ',')         self.f.write(response.selector.xpath('//*[@id="priceDetails"]/form/div[8]/div[1]/span/span[1]/i/@style').extract_first() + '\n')          while len(references) > 0:             ref = references.pop()             yield scrapy.Request(url="url" + ref, callback=self.parse_stock)    f = open("references.txt") references = f.read().splitlines()  process = CrawlerProcess({     'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)',     'LOG_LEVEL': 'INFO',     'AUTOTHROTTLE_ENABLED': 'True',     'AUTOTHROTTLE_START_DELAY': '0.1',     'AUTOTHROTTLE_TARGET_CONCURRENCY': '100' })  process.crawl(ktmSpider, references=references, stockFile="file.txt") process.start() 
        

Lista de respuestas

3
 
vote
vote
La mejor respuesta
 

La extensión de aceleración automática puede causar altos retrasos de descarga. Ofrezca la extensión para ver qué sería el tiempo resultante, o limitará el retraso máximo a través de AUTOTHROTTLE_MAX_DELAY .


Además, puede emitir múltiples solicitudes del método after_login() en lugar de mantener la cola de referencias:

  def after_login(self, response):     for ref in references:         yield scrapy.Request(url="url" + ref, callback=self.parse_stock)   

Además, en lugar de escribir en el archivo de una araña directamente, puede usar una tubería de salida CSV:

  import csv   class CSVWriterPipeline(object):     def __init__(self):         self.writer = csv.writer(open('file.txt', 'wb'))      def process_item(self, item, spider):         self.writer.writerow([item["field1"], item["field2"], item["field3"])         return item   

Dónde field14 , field25 , 9988776655544336 son los campos de su artículo:

  class MyItem(Item):     field1 = Field()     field2 = Field()     field3 = Field()   

que se debe establecer en el parse_stock() devolución de llamada:

  def parse_stock(self, response):     item = MyItem()     item["field1"] = response.xpath('//*[@id="priceDetails"]/form/div[2]/text()').extract_first()     item["field2"] = response.xpath('//*[@id="priceDetails"]/form/div[8]/div[1]/span/span[2]/text()').extract_first()     item["field3"] = response.xpath('//*[@id="priceDetails"]/form/div[8]/div[1]/span/span[1]/i/@style').extract_first()     return item   

Entonces, deberías habilitar la tubería:

  after_login()0  

o curso, mejora el "campo" y los nombres de las clases de "artículo" para ser más significativas.


Hay otras cosas, como usar la memoria caché de DNS local, puede intentar acelerar su araña:

  • acelerar el raspador web

y, como un tema de referencia de "script de script", consulte esta publicación .

 

Auto-throttling extension may cause high download delays. Either turn the extension off to see what would the resulting time be, or limit the maximum delay via AUTOTHROTTLE_MAX_DELAY.


Also, you may issue multiple requests from the after_login() method instead of keeping the queue of references:

def after_login(self, response):     for ref in references:         yield scrapy.Request(url="url" + ref, callback=self.parse_stock) 

Also, instead of writing to the file from a spider directly, you can use a CSV output pipeline:

import csv   class CSVWriterPipeline(object):     def __init__(self):         self.writer = csv.writer(open('file.txt', 'wb'))      def process_item(self, item, spider):         self.writer.writerow([item["field1"], item["field2"], item["field3"])         return item 

Where field1, field2, field3 are your item fields:

class MyItem(Item):     field1 = Field()     field2 = Field()     field3 = Field() 

Which should be set in the parse_stock() callback:

def parse_stock(self, response):     item = MyItem()     item["field1"] = response.xpath('//*[@id="priceDetails"]/form/div[2]/text()').extract_first()     item["field2"] = response.xpath('//*[@id="priceDetails"]/form/div[8]/div[1]/span/span[2]/text()').extract_first()     item["field3"] = response.xpath('//*[@id="priceDetails"]/form/div[8]/div[1]/span/span[1]/i/@style').extract_first()     return item 

Then, you would need to enable the pipeline:

process = CrawlerProcess({     'ITEM_PIPELINES', {          '__main__.CSVWriterPipeline': 100     },     'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)',     'LOG_LEVEL': 'INFO',     'AUTOTHROTTLE_ENABLED': 'True',     'AUTOTHROTTLE_START_DELAY': '0.1',     'AUTOTHROTTLE_TARGET_CONCURRENCY': '100' }) 

Or course, improve the "field" and "item" class names to be more meaningful.


There are other things, like using local DNS cache, you may try to speed up your spider:

  • Speed up web scraper

And, as a "running Scrapy from script" reference topic, please see this post.

 
 
 
 

Relacionados problema

2  Scrapy Spider para productos en un sitio  ( Scrapy spider for products on a site ) 
Recientemente presenté una muestra de código para un proyecto de raspado web y fue rechazado sin comentarios sobre lo que no les gustó. El mensaje, mientras q...

3  Microservice para raspar imágenes con apio  ( Microservice for scraping images with celery ) 
Hice un proyecto, que raspa las imágenes de forma asíncrona y las guarda en un contenedor. Tengo acceso a ellos a través del volumen. Scrapony encuentra imáge...

6  Párrafo del sitio web para anuncios  ( Website parser for advertisements ) 
Soy nuevo en Python y he escrito la araña en el marco de scrapy que analiza algunos sitios web de publicidad y continúan los datos. La araña funciona como esp...

5  Analizando una página web de carga lenta con secado en combinación con selenio  ( Parsing a slow loading webpage with scrapy in combination with selenium ) 
He escrito un raspador en Python Scrapy en combinación con Selenium para raspar 1000 nombres de empresas y sus ingresos de un sitio web. El sitio tiene habili...

2  Scrapy - Muy procesal - ¡Alternativas mejores?  ( Scrapy very procedural better alternatives ) 
class PropFinal(CrawlSpider): name = "propfinal" allowed_domains = [over 200 allowed domains here] start_urls = ["http://www.putnam-fl.com/coc/in...

6  Raspando una página web que copia con la lógica de Scrapy  ( Scraping a webpage copying with the logic of scrapy ) 
Hoy, mientras se acerca a un tutorial hecho por ScrapingHub en Scrapy sobre cómo generalmente trata con una página web mientras se raspara su contenido. Pude ...

2  Extracción de datos  ( Data extraction ) 
Escribí este código en Python / Scrapy for Data Extraction. Funciona bien para mí, pero soy Newbie en Python, por lo que cualquier sugerencia para la optimiza...

1  Extraer ciertos productos de una página web usando secado  ( Extracting certain products from a webpage using scrapy ) 
He escrito un script en Python Scrapy para cosechar varios nombres de productos y precio de los libros.Toscrape. La razón por la que envío este pequeño código...

2  Use Scrapy para encontrar imágenes duplicadas a través de páginas  ( Use scrapy to find duplicate images across pages ) 
Estoy tratando de usar Scrapy para encontrar URL de imágenes que se usan más de una vez en un sitio web en todas las páginas. Esta es mi araña: # -*- cod...

4  Recordo web desde el libro de amarillo  ( Webscraping from yellowbook ) 
Soy bastante bueno en la programación Python, pero, por supuesto, quiero escribir código de limpiador. Este es un script simple que raspes conduce al amaril...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos