scrapy 2.3 擴展媒體管道

2021-06-17 15:17 更新

請參見以下自定義文件管道中可以重寫的方法:

classscrapy.pipelines.files.FilesPipeline
file_path(selfrequestresponse=Noneinfo=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(iteminfo)

如工作流上所示,管道將從項目中獲取要下載的圖像的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(resultsiteminfo)

這個 ?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()? 方法返回項。

請參見以下自定義圖像管道中可以覆蓋的方法:

classscrapy.pipelines.images.ImagesPipeline

這個 ?ImagesPipeline? 是 FilesPipeline ,自定義字段名并為圖像添加自定義行為。

file_path(selfrequestresponse=Noneinfo=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> .

get_media_requests(iteminfo)

工作方式與 FilesPipeline.get_media_requests() 方法,但對圖像URL使用不同的字段名。

必須返回每個圖像URL的請求。

item_completed(resultsiteminfo)

這個 ?ImagesPipeline.item_completed()? 當(dāng)一個項目的所有圖像請求都已完成時(要么已完成下載,要么由于某種原因失?。?,將調(diào)用方法。

工作方式與 FilesPipeline.item_completed() 方法,但使用不同的字段名存儲圖像下載結(jié)果。

默認情況下, ?item_completed()? 方法返回項。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號