簡體   English   中英

scrapy:來自信號調用的回調的屈服請求

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM