2017-10-19 18 views
0

私はスパイダー(下記)を持っていますが、最初に実行するたびに10日ごとにCronジョブを実行したいと考えています。アイテムをCSVの適切なフィールドに追加するのではなく、フィールドを書き換えます。どのように何回実行しても、フィールドヘッダーの1つのグループとその下のすべてのデータのみを持つようにするにはどうしたらよいですか?私はCsvItemExporterクラスで周りの混乱に持っているとinclude_headers_line = Falseに設定されますが、私はプロジェクト構造にそのクラスを追加する場所を確認していないことのように治療用CSV出力重複フィールド

import scrapy 

class Wotd(scrapy.Item): 
    word = scrapy.Field() 
    definition = scrapy.Field() 
    sentence = scrapy.Field() 
    translation = scrapy.Field() 


class WotdSpider(scrapy.Spider): 
    name = 'wotd' 
    allowed_domains = ['www.spanishdict.com/wordoftheday'] 
    start_urls = ['http://www.spanishdict.com/wordoftheday/'] 
    custom_settings = { 
     #specifies exported fields and their order 
    'FEED_EXPORT_FIELDS': ['word','definition','sentence','translation'] 
    } 

def parse(self, response): 
    jobs = response.xpath('//div[@class="sd-wotd-text"]') 
    for job in jobs: 
     item = Wotd() 
     item['word'] = job.xpath('.//a[@class="sd-wotd-headword-link"]/text()').extract_first() 
     item['definition'] = job.xpath('.//div[@class="sd-wotd-translation"]/text()').extract_first() 
     item['sentence'] = job.xpath('.//div[@class="sd-wotd-example-source"]/text()').extract_first() 
     item['translation'] = job.xpath('.//div[@class="sd-wotd-example-translation"]/text()').extract_first() 
     yield item 

は、私がScrapyのドキュメント上で読んでいたものから、それが見えます。

答えて

0

まず、現在のプロジェクト構造を共有していないので、具体的な例でどこに配置するのがアドバイスしにくいですか。

あなたのプロジェクト名はmy_projectとしましょう。メインのプロジェクトディレクトリ(settings.pyが含まれている1)の下では、このコンテンツをファイルexporters.pyを作成します。

import scrapy.exporters 

class NoHeaderCsvItemExporter(scrapy.exporters.CsvItemExporter): 
    def __init__(self, file, join_multivalued=', ', **kwargs): 
     super(NoHeaderCsvItemExporter, self).__init__(file=file, include_headers_line=False, join_multivalued=join_multivalued, **kwargs) 

クラスの標準的なCSVの輸出国からNoHeaderCsvItemExporter継承、ちょうど私たちはヘッダ行が出力に含まれたくないことを指定します。

次に、CSV形式の新しいエクスポータクラスをsettings.pyまたはスパイダーのcustom_settingsに指定する必要があります。後でオプションを使用して、あなたの現在のアプローチに続いて、それは次のようになります。

custom_settings = { 
    'FEED_EXPORT_FIELDS': ['word','definition','sentence','translation'], 
    'FEED_EXPORTERS': { 
     'csv': 'my_project.exporters.NoHeaderCsvItemExporter', 
    } 
} 

ただ、このクラスを使用して、任意のヘッダ行がないことに注意してCSVではなく、さらに最初の輸出のために含まれています。

+0

ありがとう、これは私が探していたものです。私はあなたの変更なしでヘッダーを設定してから変更を加え、魅力的に働きました。ご協力いただきありがとうございます! – GainesvilleJesus