zoukankan      html  css  js  c++  java
  • scrapy下载post请求的文件

    上次给大家介绍了如何利用scrapy进行图片的抓取及保存,抓一些美女图片可能就遗忘在硬盘里了,实用性不是太强,今天来介绍一下如何使用scrapy进行文件下载。

    网页分析

    目标网站http://bj.wsbedu.com/php/showz-459-ry51p.html,

    这是一个小学课件的网站中的其中一篇课文的ppt,今天就来实战如何通过爬虫把ppt拿下,看一下网页

    image.png

    点击红框就可以进行下载,先利用浏览器走一遍,用fiddler抓取一下流程,

    image.png

    可以看出是一个post请求,看一下需要post哪些信息,

    image.png

    有下面几个值,接下来看一下网页结构,image.png

    第一个红框中是我们请求的链接,第二个红框里是post的参数,分析到这里就可以着手写代码了。


    代码部分

    item,spider前面部分定义还是老样子,我只写了抓取一个课件的代码,抓取到的post参数,放在一个字典里作为item传出去。

    data1 = response.xpath('//input[@name="name1"]/@value').extract_first()
    data2 = response.xpath('//input[@name="name2"]/@value').extract_first()
    ......

    item = KejianItem()
    data = {'name1':data1,'name2':data2,'name3':data3,'Submit':data4}
    item['data'] = data
    item['file_urls'] = file_urls
    item['res_url'] = response.url

    这里我们不仅把下载文件的链接传出去了,而且还把网页链接传入item中,这将会在下面解释为什么。

    之后就可以写pipelines代码了,scrapy为我们打造好了一个FilesPipeline类专门用来下载文件,

    from scrapy.pipelines.files import FilesPipeline
    import scrapy

    class FilePipeline1(FilesPipeline):
        def get_media_requests(self, item, info):
            yield scrapy.FormRequest(url = item['file_urls'],formdata=item['data'],
                     headers={'Referer':item['res_url']},meta={'data':item['data']})

        def file_path(self, request, response=None, info=None):
            data = request.meta['data']
            folder_name = data['name2']
            filename = '{}'.format(folder_name)
            return filename

    导入FilesPipeline,写一个类继承它,第一个函数是下载文件的函数,因为是post请求,我们要用FormRequest,将data传入,然后加了headers,这是因为如果不加,网站会提示我们盗链了,就是这个样子,

    image.png

    所以在headers中加上Referer参数,告诉网站我们就是从本网页来的,这样就可以正常下载了,也是为什么要把网页的链接也传入item,第二个函数是有关下载到本地的,将获取到的name2作为文件的名称,是这样子的《1. 窃读记  PPT课件1.rar》,在settings里把该pipelines激活,基本大功告成,运行结果:

    image.png

    已经下载好了该文件。

    我只是演示了一下如何下载一个ppt,若想下载多个只需调整一下代码即可,这样只要我们写个爬虫,文件就会自动进入电脑,比一个一个手动下载要快又省力。

    大家也可以关注一下我的公众号噢,有精选的学习资源,和最新的爬虫及数据分析实战。

     

                   

  • 相关阅读:
    mongodb
    python中读取文件的read、readline、readlines方法区别
    uva 129 Krypton Factor
    hdu 4734
    hdu 5182 PM2.5
    hdu 5179 beautiful number
    hdu 5178 pairs
    hdu 5176 The Experience of Love
    hdu 5175 Misaki's Kiss again
    hdu 5174 Ferries Wheel
  • 原文地址:https://www.cnblogs.com/python-dd/p/9629881.html
Copyright © 2011-2022 走看看