[英]scrapy: yield request from callback called by signal
我有一個爬蟲,它可以抓取一些數據並為管道生成一個項目。 然后,管道檢查數據庫中是否存在此數據。 如果沒有,它會丟棄該項目。 蜘蛛是信號連接的,以調用 item_drop 信號的回調。 我想從 item_dropped 回調中向不同的 url 發出另一個請求,以使用其他數據填充同一項目。 如果我沒有在回調中包含 yield 語句,它會觸發,但如果我這樣做,它不會,我不知道為什么。
(為簡潔而簡化)
MySpider.py:
def from_crawler(cls, crawler, *args, **kwargs):
spider = super(MySpider, cls).from_crawler(crawler, *args, **kwargs)
crawler.signals.connect(spider.item_dropped, signal=signals.item_dropped)
return spider
[ ...parse start url and yield to pipeline here... ]
def item_dropped(self, item, response, exception, spider,):
print("ITEM ERROR CAUGHT")
yield Request(
url="http://www.example.com/api/data",
callback=self.parse_request_2,
cb_kwargs=dict(item=item))
我的管道.py:
def process_item(self, item, spider):
/* ORM model mapping */
data = Data(
name = item['name']
)
data_exists = self.session.query(exists().where(Data.name == item['name'])).scalar()
if data_exists is False:
raise DropItem("DATA_INCOMPLETE")
我嘗試這樣做的原因是新對象不斷添加到第一個 url 中,因此我需要反復刮擦它,但它不包含該項目所需的所有數據。 然后我需要刮取不同的 url 以將其他數據添加到該項目,但只有一次,該項目第一次添加到數據庫中。
如何讓 scrapy 從 item_dropped 回調中產生另一個請求? 更重要的是,我是否以正確的方式進行此操作,還是有更好的方法來完成此操作? 我知道我可以從蜘蛛內部進行數據庫檢查並在那里實現回調邏輯,但我不希望蜘蛛和管道都打開數據庫會話。
您無法從該信號中產生請求。
您必須將代碼移動到蜘蛛中間件或將其移動到蜘蛛中的請求回調中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.