2011-08-19 22 views
13

Necesito guardar un archivo (.pdf) pero no estoy seguro de cómo hacerlo. Necesito guardar .pdfs y almacenarlos de tal manera que estén organizados en un directorio de forma similar a como están almacenados en el sitio donde los estoy raspando.¿Debo crear una tubería para guardar archivos con scrapy?

Según lo que puedo deducir, necesito hacer una canalización, pero por lo que entiendo, las tuberías guardan "Artículos" y "Artículos" son solo datos básicos como cadenas/números. ¿Los archivos guardados son un uso adecuado de las tuberías, o debo guardar el archivo en spider en su lugar?

+0

por qué no usar un FEED_EXPORTER en lugar de una ¿PIPELINE? –

Respuesta

14

Sí y no [1]. Si busca un pdf, se almacenará en la memoria, pero si los pdfs no son lo suficientemente grandes como para llenar su memoria disponible, entonces está bien.

Se podría guardar el pdf en la devolución de llamada araña:

def parse_listing(self, response): 
    # ... extract pdf urls 
    for url in pdf_urls: 
     yield Request(url, callback=self.save_pdf) 

def save_pdf(self, response): 
    path = self.get_path(response.url) 
    with open(path, "wb") as f: 
     f.write(response.body) 

Si decide hacerlo en una tubería:

# in the spider 
def parse_pdf(self, response): 
    i = MyItem() 
    i['body'] = response.body 
    i['url'] = response.url 
    # you can add more metadata to the item 
    return i 

# in your pipeline 
def process_item(self, item, spider): 
    path = self.get_path(item['url']) 
    with open(path, "wb") as f: 
     f.write(item['body']) 
    # remove body and add path as reference 
    del item['body'] 
    item['path'] = path 
    # let item be processed by other pipelines. ie. db store 
    return item 

[1] Otro enfoque podría ser URL única tienda pdfs' y use otro proceso para buscar los documentos sin almacenarlos en la memoria. (Por ejemplo wget)

+0

Esto funciona con CrawlSpider, porque pasé horas tratando de implementar el guardado del pdf en la araña y nunca se llama a la función de devolución de llamada. – Kex

+0

@Kex es difícil decir qué está mal sin ver su código. Un error común es anular la devolución de llamada 'parse' o no usar el patrón correcto en los extractores de enlace. – Rolando

+0

Resolví el problema sin esto, ahora descargo los archivos PDF usando SgmlLinkExtractor dentro de las reglas y guardo la respuesta en un archivo pdf. – Kex

3

Es una herramienta perfecta para el trabajo. La forma en que funciona Scrapy es que tienes arañas que transforman páginas web en datos estructurados (elementos). Las tuberías son posprocesadores, pero usan la misma infraestructura asincrónica que las arañas, por lo que es perfecto para buscar archivos de medios.

En su caso, primero debe extraer la ubicación de los archivos PDF en spider, buscarlos en la canalización y tener otra tubería para guardar elementos.

Cuestiones relacionadas