W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
請參見以下自定義文件管道中可以重寫的方法:
scrapy.pipelines.files.
FilesPipeline
file_path
(self, request, response=None, info=None, *, item=None)每個下載的項調(diào)用一次此方法。它返回源于指定的 response .
除了 response
,此方法接收原始 request
, info
和 ?item
?
可以重寫此方法以自定義每個文件的下載路徑。
例如,如果文件URL以常規(guī)路徑結(jié)束(例如 https://example.com/a/b/c/foo.png
,您可以使用以下方法將所有文件下載到 files
文件夾及其原始文件名(例如 files/foo.png
):
import os
from urllib.parse import urlparse
from scrapy.pipelines.files import FilesPipeline
class MyFilesPipeline(FilesPipeline):
def file_path(self, request, response=None, info=None, *, item=None):
return 'files/' + os.path.basename(urlparse(request.url).path)
同樣,您可以使用 item
根據(jù)某些項屬性確定文件路徑。
默認情況下 ?file_path()
? 方法返回 full/<request URL hash>.<extension>
.
get_media_requests
(item, info)如工作流上所示,管道將從項目中獲取要下載的圖像的URL。為此,可以重寫 ?get_media_requests()
? 方法并返回每個文件的請求URL::
from itemadapter import ItemAdapter
def get_media_requests(self, item, info):
adapter = ItemAdapter(item)
for file_url in adapter['file_urls']:
yield scrapy.Request(file_url)
這些請求將由管道處理,下載完成后,結(jié)果將發(fā)送到 ?item_completed()
? 方法,作為2元素元組的列表。每個元組將包含 (success, file_info_or_error)
在哪里?
success
是一個布爾值,它是 True
如果圖像下載成功或 False
如果因為某種原因失敗了
file_info_or_error
是包含以下鍵的dict(如果成功是 True
或A ?Failure
? 如果有問題的話。
url
-從中下載文件的URL。這是從 ?get_media_requests()
? 方法。
path
-路徑(相對于 ?FILES_STORE
? )文件的存儲位置
checksum
-A MD5 hash 圖像內(nèi)容的
status
-文件狀態(tài)指示。
2.2 新版功能.
它可以是以下類型之一:
downloaded
-文件已下載。
uptodate
-根據(jù)文件過期策略,文件未下載,因為它是最近下載的。
cached
-文件已被共享同一文件的另一個項目計劃下載。
接收的元組列表 ?item_completed()
? 保證保留從 ?get_media_requests()
? 方法。
以下是 results
論點:
[(True,
{'checksum': '2b00042f7481c7b056c4b410d28f33cf',
'path': 'full/0a79c461a4062ac383dc4fade7bc09f1384a3910.jpg',
'url': 'http://www.example.com/files/product1.pdf',
'status': 'downloaded'}),
(False,
Failure(...))]
默認情況下 ?get_media_requests()
? 方法返回 None
這意味著該項目沒有可下載的文件。
item_completed
(results, item, info)這個 ?FilesPipeline.item_completed()
? 當(dāng)單個項的所有文件請求都已完成時調(diào)用的方法(要么已完成下載,要么由于某種原因失?。?/p>
這個 ?item_completed()
? 方法必須返回將發(fā)送到后續(xù)項管道階段的輸出,因此必須返回(或刪除)該項,就像在任何管道中一樣。
下面是一個 ?item_completed()
? 方法,將下載的文件路徑(傳入結(jié)果)存儲在 file_paths
項目字段,如果該項目不包含任何文件,則將其刪除::
from itemadapter import ItemAdapter
from scrapy.exceptions import DropItem
def item_completed(self, results, item, info):
file_paths = [x['path'] for ok, x in results if ok]
if not file_paths:
raise DropItem("Item contains no files")
adapter = ItemAdapter(item)
adapter['file_paths'] = file_paths
return item
默認情況下, ?item_completed()
? 方法返回項。
請參見以下自定義圖像管道中可以覆蓋的方法:
scrapy.pipelines.images.
ImagesPipeline
這個 ?
ImagesPipeline
? 是FilesPipeline
,自定義字段名并為圖像添加自定義行為。
file_path
(self, request, response=None, info=None, *, item=None)每個下載的項調(diào)用一次此方法。它返回源于指定的 ?response
? .
除了 response
,此方法接收原始 request
, info
和 ?item
?
可以重寫此方法以自定義每個文件的下載路徑。
例如,如果文件URL以常規(guī)路徑結(jié)束(例如 https://example.com/a/b/c/foo.png
,您可以使用以下方法將所有文件下載到 files
文件夾及其原始文件名(例如 files/foo.png
):
import os
from urllib.parse import urlparse
from scrapy.pipelines.images import ImagesPipeline
class MyImagesPipeline(ImagesPipeline):
def file_path(self, request, response=None, info=None, *, item=None):
return 'files/' + os.path.basename(urlparse(request.url).path)
同樣,您可以使用 item
根據(jù)某些項屬性確定文件路徑。
默認情況下 ?file_path()
? 方法返回 full/<request URL hash>.<extension>
.
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: