python - library - web scraping open source
Scrapy CrawlSpider: cómo acceder a un elemento en diferentes niveles de análisis (1)
Estoy rastreando un sitio web (solo dos niveles de profundidad), y quiero recopilar información de sitios en ambos niveles. El problema con el que me estoy metiendo es que quiero completar los campos de un elemento con información de ambos niveles. ¿Cómo hago esto?
Estaba pensando en tener una lista de elementos como una variable de instancia a la que todos los hilos tendrán acceso (ya que es la misma instancia de la araña), y parse_1 completará algunos campos, y parse_2 tendrá que verificar la clave correcta antes de rellenar el valor correspondiente. Este método parece engorroso, y todavía no estoy seguro de cómo hacerlo funcionar.
Lo que estoy pensando es que debe haber una mejor manera, tal vez de alguna manera pasar un elemento a la devolución de llamada. Sin embargo, no sé cómo hacer eso con el método Request (). Ideas?
De la documentación de scrapy:
En algunos casos, puede interesarle pasar argumentos a esas funciones de devolución de llamada para que pueda recibir los argumentos más adelante, en la segunda devolución de llamada. Puede usar el atributo Request.meta para eso.
Aquí hay un ejemplo de cómo pasar un artículo usando este mecanismo, para poblar diferentes campos de diferentes páginas:
def parse_page1(self, response):
item = MyItem()
item[''main_url''] = response.url
request = Request("http://www.example.com/some_page.html",
callback=self.parse_page2)
request.meta[''item''] = item
return request
def parse_page2(self, response):
item = response.meta[''item'']
item[''other_url''] = response.url
return item
Por lo tanto, básicamente puede raspar la primera página y almacenar toda la información en el elemento y luego enviar el artículo completo con la solicitud de esa url de segundo nivel y tener toda la información en un solo artículo.