イメージの命名規則を更新変更パイプライン
これは恥ずかしいですが、それは私のオリジナルパイプラインでの問題は、私は私の設定でそれを有効にするには忘れていたということが判明しました。とにかく、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
を 'についてfields_to_export'、コンストラクタにリストを渡してみてください: 'CsvItemExporter(file、fields_to_export = ['accesion'、...])' – eLRuLL
運がありません。私は前と同じ出力を得ています。私が作ったitems.csvは、刻み、タイトル、アクセス権、image_urls、画像、日付順に私に与えてくれます。 問題の一部は、画像パイプラインと競合する可能性がありますか?独自のメカニックが舞台裏で隠れていますか? – Tric