2012-02-17 18 views
27

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:Scrapy: ¿Seguir el enlace para obtener datos adicionales del ítem?

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 la Título, Fecha de vencimiento, y detalles para cada fila. Título y Fecha de vencimiento están disponibles de inmediato en la página ...

pero los detalles mismos no están en la mesa -, sino más bien, un enlace a la página que contiene los detalles (si es que doesn 't tiene sentido aquí es 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 artículo alrededor con devoluciones de llamada y peticiones, incluso después de leer a través de la sección deCrawlSpider del Scrapy documentación.

Respuesta

24

Por favor, lea primero el docs para entender lo que digo.

La respuesta:

para raspar campos adicionales que se encuentran en otras páginas, en una dirección URL extracto de método de análisis de la página con información adicional, crear y devolver a partir de ese método de análisis de un objeto Request con esa URL y pasan ya datos extraídos a través de su parámetro meta.

how do i merge results from target page to current page in scrapy?

+0

¿Hay un código básico ejemplo en alguna parte? – fortuneRice

+0

@fortuneRice, no estoy seguro si los ejemplos están actualizados: http://stackoverflow.com/questions/11150053 http://stackoverflow.com/questions/13910357/how-can-i-use-multiple-requests-and -pass-items-in-between-them-in-scrapy-python/13911764 # 13911764 – warvariuc

+0

esta es la parte relevante de los documentos: http://doc.scrapy.org/en/latest/topics/spiders.html – tback

1

También puede utilizar Python functools.partial para pasar un item otros o cualquier otro dato serializables a través de argumentos adicionales a la próxima devolución de llamada Scrapy.

Algo así 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 
14

Un ejemplo de scrapy documentation

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 
Cuestiones relacionadas