web-dev-qa-db-fra.com

Utilisation de Scrapy pour rechercher et télécharger des fichiers PDF à partir d'un site Web

J'ai été chargé de tirer des fichiers pdf à partir de sites Web à l'aide de Scrapy. Je ne suis pas nouveau sur Python, mais Scrapy est très nouveau pour moi. J'ai expérimenté la console et quelques araignées rudimentaires. J'ai trouvé et modifié ce code:

import urlparse
import scrapy

from scrapy.http import Request

class pwc_tax(scrapy.Spider):
    name = "pwc_tax"

    allowed_domains = ["www.pwc.com"]
    start_urls = ["http://www.pwc.com/us/en/tax-services/publications/research-and-insights.html"]

    def parse(self, response):
        base_url = "http://www.pwc.com/us/en/tax-services/publications/research-and-insights.html"
        for a in response.xpath('//a[@href]/@href'):
            link = a.extract()
            if link.endswith('.pdf'):
                link = urlparse.urljoin(base_url, link)
                yield Request(link, callback=self.save_pdf)

    def save_pdf(self, response):
        path = response.url.split('/')[-1]
        with open(path, 'wb') as f:
            f.write(response.body)

J'exécute ce code sur la ligne de commande avec

scrapy crawl mySpider

et je ne reçois rien en retour. Je n'ai pas créé d'élément fragmentaire parce que je veux explorer et télécharger le fichier, pas de métadonnées. J'apprécierais toute aide à ce sujet.

15
Murface

La logique d'araignée semble incorrecte.

J'ai jeté un coup d'œil à votre site Web et il semble qu'il existe plusieurs types de pages:

  1. http://www.pwc.com/us/en/tax-services/publications/research-and-insights.html la page initiale
  2. Pages Web pour des articles spécifiques, par ex. http://www.pwc.com/us/en/tax-services/publications/insights/australia-introduces-new-foreign-resident-cgt-withholding-regime.html qui pourrait être parcouru de la page # 1
  3. Réel PDF emplacements, par exemple http://www.pwc.com/us/en/state-local-tax/newsletters/salt-insights/assets/pwc-wotc- precertification-period-extended-to-juin-29.pdf qui peut être parcouru à partir de la page # 2

Ainsi, la logique correcte ressemble à: obtenir la page n ° 1 en premier, obtenir ensuite les pages n ° 2, et nous pourrions télécharger ces pages n ° 3.
Cependant, votre araignée essaie d'extraire des liens vers des pages n ° 3 directement à partir de la page n ° 1.

ÉDITÉ:

J'ai mis à jour votre code, et voici quelque chose qui fonctionne réellement:

import urlparse
import scrapy

from scrapy.http import Request

class pwc_tax(scrapy.Spider):
    name = "pwc_tax"

    allowed_domains = ["www.pwc.com"]
    start_urls = ["http://www.pwc.com/us/en/tax-services/publications/research-and-insights.html"]

    def parse(self, response):
        for href in response.css('div#all_results h3 a::attr(href)').extract():
            yield Request(
                url=response.urljoin(href),
                callback=self.parse_article
            )

    def parse_article(self, response):
        for href in response.css('div.download_wrapper a[href$=".pdf"]::attr(href)').extract():
            yield Request(
                url=response.urljoin(href),
                callback=self.save_pdf
            )

    def save_pdf(self, response):
        path = response.url.split('/')[-1]
        self.logger.info('Saving PDF %s', path)
        with open(path, 'wb') as f:
            f.write(response.body)
22
starrify