私は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で異なるアイテムを持つ複数のスパイダーを実行することはできますか?