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,若想下載多個只需調整一下代碼即可,這樣只要我們寫個爬蟲,文件就會自動進入電腦,比一個一個手動下載要快又省力。

大家也可以關注一下我的公眾號噢,有精選的學習資源,和最新的爬蟲及數據分析實戰。

 

 

               

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM