example - ¿Aumenta la concurance de scrapy para diferentes dominios?
scrapy python 3 (1)
Estoy intentando configurar scrapy
para seguir enlaces externos.
Al mismo tiempo, tengo DOWNLOAD_DELAY = 3
, por lo que es cortés con los servidores.
¿Hay alguna forma de configurar scrapy
para comenzar a descargar enlaces externos de forma inmediata y en paralelo?
De los registros, parece que los enlaces externos están en la misma cola que los enlaces internos.
Mi araña es:
16 class RedditSpider(scrapy.Spider):
17 name = "reddit"
18 start_urls = [''https://www.reddit.com/'']
19
20 def parse(self, response):
21 digest = hashlib.md5(response.body).hexdigest()
22 if pages.find_one({''digest'': digest}):
23 return
24 links = LinkExtractor(allow=()).extract_links(response)
25 urls = [l.url for l in links]
26 pages.insert_one({
27 ''digest'': digest,
28 ''url'': response.url,
29 ''links'': urls,
30 ''body'': response.text
31 })
32 for url in urls:
33 yield scrapy.Request(url, callback=self.parse)
Sí, el raspado usualmente raspa páginas en paralelo. Existen estas configuraciones que puede modificar / anular en settings.py de su proyecto scrapy:
- CONCURRENT_REQUESTS
- CONCURRENT_REQUESTS_PER_DOMAIN
(Consulte https://doc.scrapy.org/en/latest/topics/settings.html#concurrent-requests )
Valores recomendados:
Si bien CONCURRENT_REQUESTS_PER_DOMAIN debe establecerse en valores no demasiado altos para ser cortés con los servidores (por ejemplo, un dígito bajo), CONCURRENT_REQUESTS debe ser lo más alto posible (sin quedarse sin memoria) ... por lo que se recomienda un valor superior a 100 aquí.
Desafortunadamente la cola en scrapy no es perfecta, si tienes más de CONCURRENT_REQUESTS para el mismo dominio (por ejemplo, reddit) en los primeros lugares de tu cola, estos bloquearán el procesamiento de otras solicitudes en paralelo hasta que se hayan procesado suficientes y primero los dominios externos se asignan a las ranuras de procesamiento.
Así que tener un valor CONCURRENT_REQUESTS que sea lo más alto posible es la clave aquí.