0

私はscrapyに取り組んでおり、1つのscrapyプロジェクトで2つの異なるURLを持つ2つのスパイダーファイルを作成しました。

そして、2つのスパイダーは、個別に実行すると完全に削ります。実際の問題は、各URLにフェッチするアイテムが異なるため、items.pyファイル内のすべてのアイテムを宣言することです。ここでスクレイピングした後、データをスパイダーの名前で動的に作成されたcsvファイルに保存しています。

たとえば、実行する必要がある場合は、spider1別のメソッドを宣言する必要があります。process_itemアイテムは両方のスパイダーで異なるため、2番目のスパイダーを実行する必要がある場合は、process_item他のメソッドにコメントして別のメソッドを作成する必要があります。2つのprocess_itemメソッドを使用する方法はありますか?以下は私のpipeline.pyコードです

パイプライン.py

from w3c_browser.items import WCBrowserItem
import csv
from csv import DictWriter
from cStringIO import StringIO
from datetime import datetime
class W3CBrowserPipeline(object):
    def __init__(self):
        dispatcher.connect(self.spider_opened, signal=signals.spider_opened)
        dispatcher.connect(self.spider_closed, signal=signals.spider_closed)
        self.brandCategoryCsv = csv.writer(open('wcbbrowser.csv', 'wb'))

    def spider_opened(self, spider):
        spider.started_on = datetime.now()
        if spider.name == 'browser_statistics':
            log.msg("opened spider  %s at time %s" % (spider.name,datetime.now().strftime('%H-%M-%S')))
            self.brandCategoryCsv = csv.writer(open("csv/%s-%s.csv"% (spider.name,datetime.now().strftime('%d%m%y')), "wb"),
                       delimiter=',', quoting=csv.QUOTE_MINIMAL)
        elif spider.name == 'browser_os':
            log.msg("opened spider  %s at time %s" % (spider.name,datetime.now().strftime('%H-%M-%S')))
            self.brandCategoryCsv = csv.writer(open("csv/%s-%s.csv"% (spider.name,datetime.now().strftime('%d%m%y')), "wb"),
                       delimiter=',', quoting=csv.QUOTE_MINIMAL)

    def process_item(self, item, spider):
        self.brandCategoryCsv.writerow([item['year'],
                                        item['internet_explorer'],
                                        item['firefox'],
                                        item['chrome'],
                                        item['safari'],
                                        item['opera'],


        ])
        return item
# For Browser Os
#    def process_item(self, item, spider):
#        self.brandCategoryCsv.writerow([item['year'],
#                                        item['vista'],
#                                        item['nt'],
#                                        item['winxp'],
#                                        item['linux'],
#                                        item['mac'],
#                                        item['mobile'],
#                                        
#
#        ])
#        return item

    def spider_closed(self, spider):
        log.msg("closed spider %s at %s" % (spider.name,datetime.now().strftime('%H-%M-%S')))
        work_time = datetime.now() - spider.started_on
        print str(work_time),"Total Time taken by the spider to run>>>>>>>>>>>"

上記のコードで観察したように、名前を付けてスパイダーを実行すると、形式browser_statisticsのcsvファイルが作成browser_statistics-dateされ、アイテムのデータがcsvファイルに書き込まれます。

しかし、2番目のスパイダーを名前で実行したい場合browser_os、両方のスパイダーがフェッチするアイテムが異なるため、process_itemメソッドが機能しません

誰か教えてもらえますか

とにかく、同じprocess_itemで異なるアイテムを持つ複数のスパイダーを実行することはできますか?

4

1 に答える 1

0

最良のオプションは、process_itemのスパイダー名に基づいてIFELSEを使用できることです。

お気に入り

def process_item(self, item, spider):
    if 'spider1' in spider.name:
        #TODO write CSV for spider1
    else:
        #Should be a spider2
        #TODO write CSV for spider2
    return item
于 2012-11-19T13:35:40.613 に答える