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


No tengo un problema de código específico, simplemente no estoy seguro de cómo abordar el siguiente problema logísticamente con el framework Scrapy:

La estructura de los datos que quiero raspar es típicamente una fila de tabla para cada elemento. Bastante sencillo, ¿verdad?

Finalmente quiero raspar la Título, Fecha de Vencimiento, y Detalles para cada fila. Title and Due Date are immediately available on the page...

PERO el Los detalles por sí mismos no están en la tabla but 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.

Author: Tshepang, 2012-02-17

3 answers

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

La respuesta:

Para raspar 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 devuelva desde ese método de análisis un objeto de solicitud con esa URL y pase los datos ya extraídos a través de su parámetro meta.

¿Cómo puedo combinar los resultados de la página de destino a la página actual en scrapy?

 25
Author: warvariuc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:10:11

Un ejemplo de documentación 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
 15
Author: Chitrasen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-15 13:33:48

También puede usar Python functools.partial para pasar un item o cualquier otro dato serializable a través de argumentos adicionales a la siguiente devolución de llamada 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
 2
Author: Jan Wrobel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-25 10:43:45