example - scrapy python 3



Dois-je créer un pipeline pour enregistrer des fichiers avec scrapy? (2)

Je dois enregistrer un fichier (.pdf) mais je ne sais pas comment le faire. J'ai besoin de sauvegarder .pdfs et de les stocker de manière à ce qu'ils soient organisés dans des répertoires comme s'ils étaient stockés sur le site. Je les raccroche.

D'après ce que je peux comprendre, j'ai besoin de faire un pipeline, mais d'après ce que je comprends, les pipelines sauvegardent les "Items" et les "items" qui ne sont que des données de base comme des chaînes / nombres. L'enregistrement des fichiers est-il une utilisation appropriée des pipelines, ou devrais-je enregistrer le fichier dans spider à la place?

https://src-bin.com


Answer #1

C'est un outil parfait pour le travail. La façon dont Scrapy fonctionne, c'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 spiders, ce qui en fait un outil idéal pour récupérer des fichiers multimédias.

Dans votre cas, vous devez d'abord extraire l'emplacement des fichiers PDF dans Spider, les récupérer dans un pipeline et disposer d'un autre pipeline pour enregistrer les éléments.


Answer #2

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

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

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 seulement stocker les URL de pdfs et utiliser un autre processus pour aller chercher les documents sans mettre en mémoire tampon. (par exemple wget )





pipeline