成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何正確使用 Scrapy 自帶的 FilesPipeline?

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

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字段,除了這兩個必備字段外,你還可以任意增加其他字段。


 

 

啟動FilesPipeline

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

  1. 'scrapy.pipelines.files.FilesPipeline': 1 

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

修改以后如下圖所示:

 

下載圖片

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

 

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

獲取結果

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

 

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

 

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

修改請求頭

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

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

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

 

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

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

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

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

 

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

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

 

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

最后考大家一個問題,FilesPipeline發起的請求,會經過下載器中間件嗎?如果要添加代理 IP 應該怎么做?歡迎大家在本文下面評論回復。

參考資料

 

[1]官方文檔: https://docs.scrapy.org/en/latest/topics/media-pipeline.html#using-the-files-pipeline

本文轉載自微信公眾號「未聞Code」,可以通過以下二維碼關注。轉載本文請聯系未聞Code公眾號。

 

責任編輯:武曉燕 來源: 未聞Code
相關推薦

2010-02-03 15:40:37

Python函數

2019-11-14 16:23:07

MySQL索引數據庫

2011-04-21 17:29:13

Linuxgssftp

2015-03-31 14:15:12

JavaJava事件通知

2022-09-07 08:58:58

Node.js框架

2018-12-05 09:00:00

RedisRedis Strea數據庫

2010-07-07 10:25:00

SQL Server索

2023-12-26 11:56:14

Go通道編程

2010-01-18 17:23:55

函數

2022-11-23 08:00:00

開發Regulator調試

2010-01-18 17:23:55

函數

2021-03-15 12:23:24

Pythonyield代碼

2011-04-27 16:38:31

投影機

2021-06-08 21:36:24

PyCharm爬蟲Scrapy

2017-10-31 20:45:07

JavaJava8Optional

2014-04-09 09:32:24

Go并發

2011-08-17 11:10:26

Win7問題步驟錄制器

2010-05-18 15:58:39

MySQL觸發器

2010-02-25 10:10:29

WCF使用Header

2010-08-26 10:36:44

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91免费观看视频 | 国产精品久久久久久久久久免费看 | 中文无吗| 亚洲一区二区在线播放 | 亚洲第一中文字幕 | 成人免费一区二区三区视频网站 | 日韩精品一二三 | av大片 | 欧美一区二区三区视频在线播放 | 日韩视频高清 | 日韩一区二区精品 | 国产99视频精品免费视频7 | 亚洲高清视频一区二区 | 久久精品一二三影院 | 91传媒在线观看 | 成人精品一区二区三区中文字幕 | 中文字幕成人在线 | 亚洲欧洲小视频 | 日韩精品一区二区三区视频播放 | 日韩精品a在线观看图片 | 丁香五月网久久综合 | 在线日韩欧美 | 精品国产免费一区二区三区演员表 | 亚洲精品1 | 成人h电影在线观看 | 精品国产一区二区三区性色 | 中文字幕免费视频 | 亚洲二区视频 | 欧美一区二区三区在线免费观看 | 欧美99久久精品乱码影视 | 99久久精品国产一区二区三区 | 狠狠干美女 | 日韩亚洲欧美一区 | 亚洲精品一区二区三区中文字幕 | 午夜日韩精品 | 日韩精品一区二区不卡 | 欧美国产一区二区 | 久久久久久久国产 | 精品视频一区二区三区 | 国产ts人妖一区二区三区 | 国产精品免费大片 |