2012-06-20 7 views
5

Estoy rastreando un sitio web (solo dos niveles de profundidad), y quiero recopilar información de los 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?Scrapy CrawlSpider: cómo acceder al elemento en diferentes niveles de análisis

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 el tecla correcta antes de completar 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 manera mejor, 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?

Respuesta

8

De la documentación scrapy:

En algunos casos es posible que estén interesados ​​en pasar argumentos a las funciones de devolución de llamada para que pueda recibir los argumentos más tarde, en la segunda devolución de llamada. Puede usar el atributo Request.meta para eso.

Aquí hay un ejemplo de cómo pasar un elemento utilizando este mecanismo, para rellenar los 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 

Así que, básicamente, se puede raspar primera página y almacenar toda la información en el punto y luego enviar toda elemento con la solicitud de esa url de segundo nivel y tener toda la información en un solo elemento.

+0

Solía ​​hacer esto colocando la información en la URL. De esta manera parece mejor, especialmente para los artículos que no codifican bien en las URL. ¡Gracias! – Muhd

+1

Si tengo dos páginas (página 2 y página 3) que tienen partes de la información que se deben llenar también, ¿cómo puedo llamarlas secuencialmente en dos diferentes scrapy.Requests? Puedo pasar el elemento medio lleno en 'meta' a ambos, pero quiero asegurarme de que el 'elemento' final tenga datos de la página 1 + página 2 + página 3 - todos juntos – dowjones123

Cuestiones relacionadas