scrapy内蔵画像とファイルのダウンロード方法MediaPipeline

3265 ワード

scrapyのMediaPipelineは、一般的にFilePipelineとImagesPipelineを使用します.
        最近ダウンロードしたデータの再ダウンロードを避ける
        保管場所と方法の指定
ImagesPipelineでは、追加の機能も提供されています.
        ダウンロードしたすべての画像を共通のフォーマットとモードに変換
        サムネイルの生成
        画像の幅/高さを検出し、最小の制限を満たすことを確認します.
FilePipelineを使用する場合、典型的なワークフロー:
        1.爬虫類の中からitemを取り出し、ファイルのURLをfile_に入れるurls内
        2.item爬虫類から戻り、Item Pipelineに入る
        3.入ってfile_urls内のURLはscrapyのスケジューラとダウンロードによってダウンロードされます.
Images Pipelineを使用する場合のワークフローは大きく異なります.
File Pipelineを使用するには:
        settingsでのITEM_PIPELINEで設定'scrapy.pipelines.files.FilePipeline':1
        itemに2つのフィールドを追加します.
                file_urls = scrapy.Field()
                files = scrapy.Field()
        settingsにダウンロードパスFILES_を追加STORE、ファイルurlが存在するitemフィールド、およびファイル結果情報のitemフィールドFILE_RESULT_FIELD
                FILES_STORE = 'D:\\file_path'
                FILES_URLS_FIELD = 'file_urls'
                FILES_RESULT_FIELD = 'files'
        FILES_の使用EXPIRES設定有効期限
                FILES_EXPIRES=30日で期限切れ
ImagesPipelineを使用すると、さまざまな機能が追加されます.
        IMAGESの使用THUMBSはサムネイルを作成しIMAGES_を使用EXPIRES設定有効期限:
                IMAGES_THUMBS = {
                                                    'small':(50,50),
                                                    'big':(270,270)
                                                    }
                IMAGES_EXPIRES=30日有効期限切れ
        小さな画像をフィルタリングしたい場合は、IMAGES_MIN_HEIGHTおよびIMAGES_MIN_WIDTHを使用して、画像の最小高さ和を設定できます.
自分のファイル名を書き換えられる保存方法
class MyFilesPipeline(FilesPipeline):
    def file_path(self, request, response=None, info=None):
        split_url = str(request.url).split('/')
        kind_name = split_url[-2]
        file_name = split_url[-1]
        return '%s/%s'%(kind_name,file_name)
        # path = urlparse(request.url).path
        # return join(basename(dirname(path)),basename(path))
settingsで設定
ITEM_PIPELINES = {
     #'scrapy.pipelines.files.FilesPipeline':1
     'download_files.pipelines.MyFilesPipeline':1
#    'download_files.pipelines.DownloadFilesPipeline': 300,
}

独自のテキストフォーマットを作成して保存することもできます.
class ExcelItemExporter(BaseItemExporter):
    def __init__(self,file,**kwargs):
        self._configure(kwargs)
        self.file = file
        self.row = 0
        self.wb = xlwt.Workbook()
        self.sheet = self.wb.add_sheet('books')

    def finish_exporting(self):
        self.wb.save(self.file)

    def export_item(self, item):
        items = self._get_serialized_fields(item)
        for col,v in enumerate(x for _,x in items):
            self.sheet.write(self.row,col,v)
        self.row +=1
は、settingsで構成されます.
FEED_EXPORTERS = {'excel':'douban_books.my_exporter.ExcelItemExporter'}
FEED_EXPORT_FIELDS = ['url','ISBN','name','author','publish','publish_time','subtitle','price','pages','series','about_author','content']

FEED_EXPORT_FIELDSでは、データフィールドを保存する順番を設定できます