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:
- 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 sestart_urls
utilizado todas lasstart_urls
? (He realizado algunas pruebas, parece que la respuesta es No) - ¿Qué decide la orden? ¿Por qué y cómo es esta orden? ¿Cómo podemos controlarlo?
- ¿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.
- Las
requests
hechas por la función de devolución de llamada de las arañas se darán alscheduler
. ¿Quién hace lo mismo constart_url''s requests
? La función spiderstart_requests()
solo genera un iterador sin dar las solicitudes reales. - ¿Todas las
requests
(start_url''s y callback''s) estarán en la misma cola de solicitud? ¿Cuántas colas hay enScrapy
?