Попытка загрузить PDF-файлы с помощью Scrapy в Pycharm

Я пытался заставить Scrapy загрузить все PDF-файлы с веб-сайта, однако я не могу заставить его фактически загружать файлы. Сканер работает нормально и переходит на все страницы URL-адреса, однако ничего не загружается.

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

Кроме того, я также хотел бы загрузить только файлы, содержащие spec_sheet, если это возможно (расположенные в разделе загрузок любого из источников света на веб-сайте, а также назвать PDF-файлы теми, которые они есть на веб-сайте, а не строку случайных букв и номера, когда они загружаются.

Любая помощь приветствуется!

import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule

ITEM_PIPELINES = {'scrapy.pipelines.files.FilesPipeline': 1}
FILES_STORE = '/Users/lukewoods/Desktop/AppDev/LightingPDFs/Martin'

class ZipfilesItem(scrapy.Item):
    file_urls = scrapy.Field()
    files = scrapy.Field()


class MartinSpider(CrawlSpider):
    name = 'martinspider'
    start_urls = ['https://www.martin.com/en/']


    rules = (
        Rule(LinkExtractor(allow=r'products/'), callback='parse_item', follow=True),
        Rule(LinkExtractor(allow=r'product_families/'), callback='parse_item', follow=True),
        Rule(LinkExtractor(allow=r'discontinued_products/'), callback='parse_item', follow=True),
    )

    def parse_item(self, response):
        file_url = response.xpath(("//tr[@class='download-item-row']/a/@href")).get()
        file_url = response.urljoin(file_url)
        item = ZipfilesItem()
        item['file_urls'] = [file_url]
        yield item

person Luke Woods    schedule 19.01.2021    source источник


Ответы (1)


После долгих попыток я добился результатов. В parse_item file_url — это не совсем URL-адрес pdf. Пожалуйста, проверьте приведенный ниже код. И, пожалуйста, следуйте url . Надеюсь, это поможет вам и спасибо за ваш вопрос.

import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule


class MartinSpider(CrawlSpider):
    name = 'martinspider'
    start_urls = ['https://www.martin.com/en/',]
    rules = (
        Rule(LinkExtractor(allow=r'products/'), callback='parse_item', follow=True),
        Rule(LinkExtractor(allow=r'product_families/'), callback='parse_item', follow=True),
        Rule(LinkExtractor(allow=r'discontinued_products/'), callback='parse_item', follow=True),
    )

    def parse_item(self, response):
        print(response.url)

        file_url = response.css("div.small-11.columns a::attr('href')").get(default='')
        if file_url:
            file_url = response.urljoin(file_url)
            yield scrapy.Request(url=file_url, callback=self.download_pdf)

    def download_pdf(self, response):
        path = response.url.split('/')[-1]+".pdf"
        with open(path, 'wb') as f:
            f.write(response.body)
person Samsul Islam    schedule 19.01.2021