溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么正確使用Scrapy自帶的FilesPipeline

發布時間:2021-10-21 09:44:28 來源:億速云 閱讀:197 作者:iii 欄目:web開發

這篇文章主要講解了“怎么正確使用Scrapy自帶的FilesPipeline”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“怎么正確使用Scrapy自帶的FilesPipeline”吧!

Scrapy自帶的  FilesPipeline和ImagesPipeline用來下載圖片和文件非常方便,根據它的官方文檔[1]說明,我們可以很容易地開啟這兩個  Pipeline。

如果只是要下載圖片,那么用 FilesPipeline 和 ImagesPipeline 都可以,畢竟圖片也是文件。但因為使用  ImagesPipeline 要單獨安裝第三方庫 Pillow,所以我們以 FilesPipeline 為例來進行說明。

假設爬蟲通過解析網頁的源代碼,獲取到了一張圖片,圖片的地址為:https://kingname-1257411235.cos.ap-chengdu.myqcloud.com/640.gif  當然,png 、 jpg 、甚至 rar、pdf、zip 都可以。

為了使用 Scrapy 自帶的 FilesPipeline來下載這張圖片,我們需要做幾步設置。

定義 items

首先定義任意一個 items,需要確保這個 items  里面,必須包含file_urls字段和files字段,除了這兩個必備字段外,你還可以任意增加其他字段。


怎么正確使用Scrapy自帶的FilesPipeline

啟動FilesPipeline

在settings.py中,找到 ITEM_PIPELINES配置,如果它被注釋了,那么就解除注釋。然后添加如下的配置:

'scrapy.pipelines.files.FilesPipeline': 1

再添加一個配置項FILES_STORE,它的值是你想要保存圖片的文件夾地址。

修改以后如下圖所示:

怎么正確使用Scrapy自帶的FilesPipeline

下載圖片

接下來,就進入到我們具體的爬蟲邏輯中了。在爬蟲里面,你在任意一個 parse 函數中提取到了一張或者幾張圖片的URL 后,把它(們)以列表的形式放入到  item 里面的 file_urls 字段中。如下圖所示。

怎么正確使用Scrapy自帶的FilesPipeline

注意,此時files字段不需要設置任何的值。其他非必需字段就根據你的需求只有設置即可。

獲取結果

由于我們設置了scrapy.pipelines.images.FilesPipeline的優先級為1,是最高優先級,所以它會比所有其他的 Pipeline  更先運行。于是,我們可以在后面的其他Pipeline 中,檢查 item 的 files 字段,就會發現我們需要的圖片地址已經在里面了。如下圖所示:

怎么正確使用Scrapy自帶的FilesPipeline

item 中的 files 字段變成了一個包含字典的列表。字典中有一項叫做path的  Key,它的值就是圖片在電腦上的路徑,例如full/7f471f6dbc08c2db39125b20b0471c3b21c58f3e.gif表示在images文件夾中的full文件夾中的7f471f6dbc08c2db39125b20b0471c3b21c58f3e.gif文件,如下圖所示:

怎么正確使用Scrapy自帶的FilesPipeline

文件名是該文件的 md5值,如果你想重命名,可以在后續的 pipeline 中,根據 path 的值找到文件,然后修改名字。

修改請求頭

看到這里,大家會不會有一個疑問,在使用FilesPipeline的時候,Scrapy 會加上請求頭嗎?它會用哪一個請求頭呢?

實際上,Scrapy 在使用  FilesPipeline和ImagesPipeline時,是不會設置請求頭的。如果網站會監控請求圖片或者文件的請求的請求頭,那么就可以立刻發現這個請求是通過  Scrapy 發起的。

為了證明這一點,我們可以查看FilesPipeline的源代碼:

怎么正確使用Scrapy自帶的FilesPipeline

在  scrapy/pipelines/files.py文件中,可以看到,FilesPipeline是通過get_media_requests方法來構造對圖片的請求對象的。這個請求對象沒有設置任何的請求頭。

上面的截圖是老版本的 Scrapy 的源代碼。新版本的源代碼里面,get_media_requests可能是這樣的:

def get_media_requests(self, item, info):     urls = ItemAdapter(item).get(self.files_urls_field, [])     return [Request(u) for u in urls]

為了手動加上請求頭,我們可以自己寫一個  pipeline,繼承FilesPipeline但覆蓋get_media_requests方法,如下圖所示:

怎么正確使用Scrapy自帶的FilesPipeline

注意,在實際使用中,你可能還要加上 Host 和 Referer。

然后修改settings.py中的ITEM_PIPELINES,指向我們自定義的這個pipeline:

怎么正確使用Scrapy自帶的FilesPipeline

這樣一來,FilesPipeline就能夠正確加上請求頭了。

感謝各位的閱讀,以上就是“怎么正確使用Scrapy自帶的FilesPipeline”的內容了,經過本文的學習后,相信大家對怎么正確使用Scrapy自帶的FilesPipeline這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女