Использование Scrapy для поиска и загрузки pdf файлов с веб-сайта

Мне поручили вытаскивать pdf файлы с веб-сайтов с помощью Scrapy. Я не новичок в Python, но Scrapy - это очень новое для меня. Я экспериментировал с консолью и несколькими рудиментарными пауками. Я нашел и изменил этот код:

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)

Я запускаю этот код в командной строке с помощью

scrapy crawl mySpider

и я ничего не получаю. Я не создал элемент scrapy, потому что хочу обходить и загружать файл, а не метаданные. Я был бы признателен за любую помощь в этом.

Ответ 1

Логика паука кажется неправильной.

Я быстро просмотрел ваш сайт и, кажется, есть несколько типов страниц:

Таким образом, правильная логика выглядит так: сначала выберите страницу # 1, затем получите страницы №2, и мы можем загрузить эти страницы № 3.
Однако ваш паук пытается извлечь ссылки на # 3 страницы непосредственно со страницы # 1.

Редакция:

Я обновил ваш код, и вот что-то, что действительно работает:

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)