tutorial spiders sitemapspider python python-2.7 web-scraping scrapy web-crawler

python - spiders - scrapy yield



el orden de las URL de Scrapy Crawling con la lista larga start_urls y las URL yiels de spider (1)

En primer lugar, por favor, mira este hilo : creo que encontrarás todas las respuestas allí.

el orden de las URL utilizadas por el descargador? ¿Las solicitudes realizadas por just_test1, just_test2 serán utilizadas por el programa de descarga solo después de que se hayan utilizado todas las start_urls? (He realizado algunas pruebas, parece que la respuesta es No)

Tienes razón, la respuesta es No El comportamiento es completamente asincrónico: cuando la araña se inicia, el método start_requests se llama ( fuente ):

def start_requests(self): for url in self.start_urls: yield self.make_requests_from_url(url) def make_requests_from_url(self, url): return Request(url, dont_filter=True)

¿Qué decide la orden? ¿Por qué y cómo es esta orden? ¿Cómo podemos controlarlo?

De forma predeterminada, no hay un orden predefinido, no se puede saber cuándo make_requests_from_url Requests de make_requests_from_url , es asincrónico.

Vea esta respuesta sobre cómo puede controlar la orden. Para abreviar, puede anular las start_requests y marcar las Requests start_requests con la clave de priority (como la yield Request(url, meta={''priority'': 0}) ). Por ejemplo, el valor de priority puede ser el número de línea donde se encontró la url.

¿Es esta una buena manera de manejar tantas URL que ya están en un archivo? ¿Qué más?

Creo que deberías leer tu archivo y ceder start_requests directamente en el método start_requests : mira esta respuesta .

Entonces, deberías hacer algo así:

def start_requests(self): with codecs.open(self.file_path, u"r", encoding=u"GB18030") as f: for index, line in enumerate(f): try: url = line.strip() yield Request(url, meta={''priority'': index}) except: continue

Espero que ayude.

¡Ayuda! Leer el código fuente de Scrapy no es fácil para mí. Tengo una larga lista start_urls . es aproximadamente 3,000,000 en un archivo. Entonces, hago las start_urls así:

start_urls = read_urls_from_file(u"XXXX") def read_urls_from_file(file_path): with codecs.open(file_path, u"r", encoding=u"GB18030") as f: for line in f: try: url = line.strip() yield url except: print u"read line:%s from file failed!" % line continue print u"file read finish!"

Mientras tanto, las funciones de devolución de llamada de mi araña son así:

def parse(self, response): self.log("Visited %s" % response.url) return Request(url=("http://www.baidu.com"), callback=self.just_test1) def just_test1(self, response): self.log("Visited %s" % response.url) return Request(url=("http://www.163.com"), callback=self.just_test2) def just_test2(self, response): self.log("Visited %s" % response.url) return []

mis preguntas son:

  1. el orden de las URL utilizadas por el descargador? ¿Las solicitudes realizadas por just_test1 , just_test2 serán utilizadas por el programa de descarga solo después de que se start_urls utilizado todas las start_urls ? (He realizado algunas pruebas, parece que la respuesta es No)
  2. ¿Qué decide la orden? ¿Por qué y cómo es esta orden? ¿Cómo podemos controlarlo?
  3. ¿Es esta una buena manera de manejar tantas URL que ya están en un archivo? ¿Qué más?

¡¡¡Muchas gracias!!!

Gracias por las respuestas. Pero todavía estoy un poco confundido: de forma predeterminada, Scrapy utiliza una cola LIFO para almacenar las solicitudes pendientes.

  1. Las requests hechas por la función de devolución de llamada de las arañas se darán al scheduler . ¿Quién hace lo mismo con start_url''s requests ? La función spider start_requests() solo genera un iterador sin dar las solicitudes reales.
  2. ¿Todas las requests (start_url''s y callback''s) estarán en la misma cola de solicitud? ¿Cuántas colas hay en Scrapy ?