使用Scrapy:如何从一些提取的链接下载pdf文件

2024-09-27 23:15:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经创建了从网站中提取一些链接的代码(PDF links,),现在我需要下载这些PDF文件,但我正在努力解决如何做到这一点。代码如下:


    import scrapy


    class all5(scrapy.Spider):
        name = "all5"
        start_urls = [
          'https://www.alloschool.com/course/alriadhiat-alaol-ibtdaii',
        ]

        def parse(self, response):


            for link in response.css('.default .er').xpath('@href').extract():
                 url=response.url
                 path=response.css('ol.breadcrumb li a::text').extract()
                 next_link = response.urljoin(link)
                 yield scrapy.Request(next_link,callback=self.parse_det,meta={'url' : url,'path':path})

        def parse_det(self, response):

            def extract_with_css(query):
                return response.css(query).get(default='').strip()

            yield {
                'path':response.meta['path'],
                'finallink': extract_with_css('a.btn.btn-primary::attr(href)'),
                'url':response.meta['url']

                }


我需要下载的链接是“finallink”。你知道吗

我该怎么解决这个问题?你知道吗


Tags: path代码selfurlpdfparse链接response
1条回答
网友
1楼 · 发布于 2024-09-27 23:15:55

在设置中,您必须激活管道

ITEM_PIPELINES = {'scrapy.pipelines.files.FilesPipeline': 1}

下载文件的文件夹

'FILES_STORE' = '.'

它将下载到FILES_STORE/full

当您生成数据时,必须使用名称files_url

yield {
    'file_urls': [extract_with_css('a.btn.btn-primary::attr(href)')]
    # ... rest ...
}

它必须是列表,即使你有一个文件下载。你知道吗

它应该将PDF下载到具有唯一名称的文件中,您可以在字段files的数据中获得这些文件


剪贴簿:Downloading and processing files and images


编辑:独立代码-无需创建项目即可复制和运行。你知道吗

#!/usr/bin/env python3

import scrapy

class MySpider(scrapy.Spider):

    name = 'myspider'

    start_urls = [
          'https://www.alloschool.com/course/alriadhiat-alaol-ibtdaii',
    ]

    def parse(self, response):

        for link in response.css('.default .er').xpath('@href').extract():
             url = response.url
             path = response.css('ol.breadcrumb li a::text').extract()
             next_link = response.urljoin(link)
             yield scrapy.Request(next_link, callback=self.parse_det, meta={'url': url, 'path': path})

    def parse_det(self, response):

        def extract_with_css(query):
            return response.css(query).get(default='').strip()

        yield {
            'path':response.meta['path'],
            'file_urls': [extract_with_css('a.btn.btn-primary::attr(href)')],
            'url':response.meta['url']
        }


from scrapy.crawler import CrawlerProcess

c = CrawlerProcess({
    'USER_AGENT': 'Mozilla/5.0',

    # save in file as CSV, JSON or XML
    'FEED_FORMAT': 'csv',     # csv, json, xml
    'FEED_URI': 'output.csv', # 

    # download files to `FILES_STORE/full`
    # it needs `yield {'file_urls': [url]}` in `parse()`
    'ITEM_PIPELINES': {'scrapy.pipelines.files.FilesPipeline': 1},
    'FILES_STORE': '.',
})
c.crawl(MySpider)
c.start()

相关问题 更多 >

    热门问题