Dois-je créer pipeline pour sauvegarder des fichiers avec scrapy?

je dois sauvegarder un fichier (.pdf) mais je ne sais pas comment le faire. J'ai besoin de l'enregistrer .pdfs et les stocker de telle manière qu'ils sont organisés dans un annuaires un peu comme ils sont stockés sur le site je les racler.

D'après ce que je peux en déduire, j'ai besoin de faire un pipeline, mais d'après ce que je comprends les pipelines, enregistrer "Items" Et "items" sont juste des données de base comme des chaînes/nombres. Est-ce que sauvegarder des fichiers est une bonne utilisation des pipelines, ou devrais-je sauvegarder le fichier dans spider à la place?

13
demandé sur Pawel Miech 2011-08-19 18:51:46

3 réponses

Oui et non[1]. Si vous récupérez un pdf, il sera stocké en mémoire, mais si les fichiers PDF ne sont pas assez grands pour remplir votre mémoire disponible, il est donc ok.

Vous pourriez enregistrer le pdf dans l'araignée rappel:

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 vous choisissez de le faire dans un pipeline:

# 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] une autre approche pourrait être de ne stocker que les urls des fichiers PDF et d'utiliser un autre processus pour récupérer les documents sans les mettre en mémoire tampon. (par exemple,wget)

14
répondu Rolando Max 2011-08-24 00:50:09

il y a une FilesPipeline que vous pouvez utiliser directement, en supposant que vous avez déjà l'url du fichier, le lien montre comment utiliser FilesPipeline:

https://groups.google.com/forum/print/msg/scrapy-users/kzGHFjXywuY/O6PIhoT3thsJ

6
répondu Deming 2014-10-07 22:50:34

C'est un outil parfait pour le travail. La façon dont fonctionne Scrapy est que vous avez des araignées qui transforment les pages web en données structurées (éléments). Les Pipelines sont des post-processeurs, mais ils utilisent la même infrastructure asynchrone que les araignées donc c'est parfait pour récupérer des fichiers média.

dans votre cas, vous devez d'abord extraire l'emplacement des fichiers PDF dans spider, les récupérer dans le pipeline et avoir un autre pipeline pour sauvegarder les articles.

3
répondu Seb 2011-08-20 22:25:18