Scrapy系列:文件下载(附完整代码)

案例爬取的目标是seaborn案例的源文件

地址:http://seaborn.pydata.org/examples/index.html

点击图片进去往下拉一点,就会看到下载的目标链接,通过这个链接把文件下载

 

第一步:使用Item封装数据

注意属性名是固定的,如果需要改属性名,要在settings.py中设置(怎么设置这里就不写了)

 

第二步:编写解析函数

一共有两个解析函数,一个是获取并请求到详情页的函数,一个是在详情页里获取每个案例的下载路径

1.获取详情页的URL并请求

2.获取文件的下载URL

 

第三步:设定文件名和存储路径(可选)

出来效果是这样:

 

第四步:配置settings.py文件

1.不遵守robots协议和USER_AGENT,这个是基本操作

2.设置文件下载路径

3.启用pipelines

 

解析函数:file_spider.py完整代码

from scrapy import Request
from scrapy.spiders import Spider
from seaborn_file_download.items import SeabornFileDownloadItem

class FileDownloadSpider(Spider):
    name = 'file'


    def start_requests(self):
        url = 'http://seaborn.pydata.org/examples/index.html'
        yield Request(url)

    #解析函数,获取案例列表中每个案例的URL地址
    def parse(self, response):
        #获取每个案例的链接地址
        urls = response.xpath("//div[@class='figure align-center']/a/@href").extract()
        for url in urls:
            print("url:",url)
            url = response.urljoin(url)
            yield Request(url,
                          callback=self.parse_file)

    #解析函数-获取源码文件的URL,将其放入key为file_urls的Item中
    def parse_file(self,response):
        href = response.xpath("//a[@class='reference download internal']/@href").extract_first()
        url = response.urljoin(href)
        item = SeabornFileDownloadItem()
        item["file_urls"] = [url]
        yield item

 

Pipeline完整代码

from scrapy.pipelines.files import FilesPipeline
from scrapy import Request
#定义新的文件管道,继承FilesPipeline
class SaveFilePipeline(FilesPipeline):
    #设定文件名并返回
    def file_path(self, request, response=None, info=None):
        #获取文件名并返回,url最后一个“/”后面就是文件的名称
        # return request.url.split("/")[-1]

        #分别将每个文件保存到单独的文件夹下
        #获取文件名
        file_name = request.url.split("/")[-1]
        #确定文件夹名称
        folder_name = file_name.split(".")[0]
        #返回文件夹和文件组合的字符串(相对路径)
        return folder_name + "/" + file_name

 

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值