Scrapy: ¿Seguir el enlace para obtener datos adicionales del artículo?

No tengo un problema de código específico. No estoy seguro de cómo abordar el siguiente problema logísticamente con el marco de Scrapy:

La estructura de los datos que quiero raspar suele ser una fila de tabla para cada elemento. Muy sencillo, ¿verdad?

En última instancia, quiero raspar el título , la fecha de vencimiento y los detalles de cada fila. El título y la fecha de vencimiento están disponibles de inmediato en la página …

PERO los detalles mismos no están en la tabla, sino más bien, un enlace a la página que contiene los detalles (si eso no tiene sentido aquí hay una tabla):

|-------------------------------------------------| | Title | Due Date | |-------------------------------------------------| | Job Title (Clickable Link) | 1/1/2012 | | Other Job (Link) | 3/2/2012 | |--------------------------------|----------------| 

Me temo que todavía no sé cómo pasar logísticamente el elemento con devoluciones de llamada y solicitudes, incluso después de leer la sección CrawlSpider de la documentación de Scrapy.

Por favor, primero lea los documentos para entender lo que digo.

La respuesta:

Para eliminar campos adicionales que están en otras páginas, en un método de análisis, extraiga la URL de la página con información adicional, cree y regrese desde ese método de análisis un objeto Solicitar con esa URL y pase los datos ya extraídos a través de su meta .

¿Cómo combino los resultados de la página de destino con la página actual en scrapy?

Un ejemplo de la documentación de scrapy

 def parse_page1(self, response): item = MyItem() item['main_url'] = response.url request = scrapy.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 

También puede usar Python functools.partial para pasar un item o cualquier otro dato serializable a través de argumentos adicionales a la próxima callback de Scrapy.

Algo como:

 import functools # Inside your Spider class: def parse(self, response): # ... # Process the first response here, populate item and next_url. # ... callback = functools.partial(self.parse_next, item, someotherarg) return Request(next_url, callback=callback) def parse_next(self, item, someotherarg, response): # ... # Process the second response here. # ... return item