2016-05-05 5 views
0

イメージの命名規則を更新変更パイプライン

これは恥ずかしいですが、それは私のオリジナルパイプラインでの問題は、私は私の設定でそれを有効にするには忘れていたということが判明しました。とにかく、eLRuLLは正しかった。


私は一貫して私が興味の情報を取得し、私が望む形式で押し出すことができ作業クモを持っている段階でです。私の望むところでは最後のつまずきが、画像パイプラインで保存されたファイルに、より合理的な命名規則を適用しています。 SHA1ハッシュは機能しますが、私はそれを扱うのが本当に不愉快です。

documentationのネーミングシステムの変更方法を理解するのに問題があり、盲目的にthisソリューションを適用していませんでした。私のスクラップの過程で、私はすでに各ページの一意の識別子を取得しています。 1ページに1つしかないので、イメージの名前を付けるために使用したいと思います。

イメージパイプラインも私のパイプラインのfields_to_exportセクションを尊重していないようです。私はイメージURLを抑制して、よりクリーンで読みやすい出力を提供したいと思います。誰かがそれをどうやって行うのか考えているなら、私はとても感謝しています。

私の解析から抜け出したいユニークな識別子はCatalogRecord.add_xpath('accession', './/dd[@class="accession"]/text()')です。あなたは私のスパイダーと私のパイプラインを以下で見つけるでしょう。

スパイダー:

URL = "http://www.nga.gov/content/ngaweb/Collection/art-object-page.%d" 
starting_number = 1315 
number_of_pages = 1311 
class NGASpider(CrawlSpider): 
    name = 'ngamedallions' 
    allowed_domains = ['nga.gov'] 
    start_urls = [URL % i + '.html' for i in range (starting_number, number_of_pages, -1)] 
    rules = (
      Rule(LinkExtractor(allow=('art-object-page.*','objects/*')),callback='parse_CatalogRecord', 
follow=True 
),) 



    def parse_CatalogRecord(self, response): 
     CatalogRecord = ItemLoader(item=NgamedallionsItem(), response=response) 
     CatalogRecord.default_output_processor = TakeFirst() 
     CatalogRecord.image_urls_out = scrapy.loader.processors.Identity() 
     keywords = "reverse|obverse and (medal|medallion)" 
     notkey = "Image Not Available" 
     n = re.compile('.*(%s).*' % notkey, re.IGNORECASE|re.MULTILINE|re.UNICODE) 
     r = re.compile('.*(%s).*' % keywords, re.IGNORECASE|re.MULTILINE|re.UNICODE) 
     if not n.search(response.body_as_unicode()): 
      if r.search(response.body_as_unicode()): 
       CatalogRecord.add_xpath('title', './/dl[@class="artwork-details"]/dt[@class="title"]/text()') 
       CatalogRecord.add_xpath('accession', './/dd[@class="accession"]/text()') 
       CatalogRecord.add_xpath('inscription', './/div[@id="inscription"]/p/text()', Join(), re='[A-Z]+') 
       CatalogRecord.add_xpath('image_urls', './/img[@class="mainImg"]/@src') 
       CatalogRecord.add_xpath('date', './/dt[@class="title"]', re='(\d+-\d+)') 

       return CatalogRecord.load_item() 

パイプライン:

class NgamedallionsPipeline(object): 
    def __init__(self): 
    self.files = {} 

    @classmethod 
    def from_crawler(cls, crawler): 
    pipeline = cls() 
    crawler.signals.connect(pipeline.spider_opened, signals.spider_opened) 
    crawler.signals.connect(pipeline.spider_closed, signals.spider_closed) 
    return pipeline 

    def spider_opened(self, spider): 
    file = open('%s_items.csv' % spider.name, 'w+b') 
    self.files[spider] = file 
    self.exporter = CsvItemExporter(file) 
    self.exporter.fields_to_export = ['accession', 'title', 'date', 'inscription'] 
    self.exporter.start_exporting() 

    def spider_closed(self, spider): 
    self.exporter.finish_exporting() 
    file = self.files.pop(spider) 
    file.close() 

    def process_item(self, item, spider): 
    self.exporter.export_item(item) 
    return item 
+1

を 'についてfields_to_export'、コンストラクタにリストを渡してみてください: 'CsvItemExporter(file、fields_to_export = ['accesion'、...])' – eLRuLL

+0

運がありません。私は前と同じ出力を得ています。私が作ったitems.csvは、刻み、タイトル、アクセス権、image_urls、画像、日付順に私に与えてくれます。 問題の一部は、画像パイプラインと競合する可能性がありますか?独自のメカニックが舞台裏で隠れていますか? – Tric

答えて

1

ディスクに書き込まれた画像の名前を変更に関しては、ここでそれを行うための一つの方法です:

  1. イメージにmetaで何かを追加パイプラインによってオーバーライドによって生成されたRequestget_media_requests()
  2. オーバーライドfile_path()meta

例からその情報を使用するカスタムImagesPipeline

import scrapy 
from scrapy.pipelines.images import ImagesPipeline 


class NgaImagesPipeline(ImagesPipeline): 

    def get_media_requests(self, item, info): 
     # use 'accession' as name for the image when it's downloaded 
     return [scrapy.Request(x, meta={'image_name': item["accession"]}) 
       for x in item.get('image_urls', [])] 

    # write in current folder using the name we chose before 
    def file_path(self, request, response=None, info=None): 
     return '%s.jpg' % request.meta['image_name'] 

エクスポートフィールドについては、@eLRuLLからの提案が私の仕事:

# -*- coding: utf-8 -*- 
import scrapy 
from scrapy import signals 
from scrapy.exporters import CsvItemExporter 


class NgaCsvPipeline(object): 
    def __init__(self): 
     self.files = {} 

    @classmethod 
    def from_crawler(cls, crawler): 
     pipeline = cls() 
     crawler.signals.connect(pipeline.spider_opened, signals.spider_opened) 
     crawler.signals.connect(pipeline.spider_closed, signals.spider_closed) 
     return pipeline 

    def spider_opened(self, spider): 
     ofile = open('%s_items.csv' % spider.name, 'w+b') 
     self.files[spider] = ofile 
     self.exporter = CsvItemExporter(ofile, 
      fields_to_export = ['accession', 'title', 'date', 'inscription']) 
     self.exporter.start_exporting() 

    def spider_closed(self, spider): 
     self.exporter.finish_exporting() 
     ofile = self.files.pop(spider) 
     ofile.close() 

    def process_item(self, item, spider): 
     self.exporter.export_item(item) 
     return item 
+0

あなたのカスタムイメージパイプラインは完全に機能しました。ありがとうございました! – Tric

関連する問題