2017-08-31 38 views
0

在我的Scrapy蜘蛛中,我重寫了start_requests()方法,以便從數據庫中檢索一些可能在抓取中遺漏的項目(孤立項目)。這應該發生在抓取過程結束時。類似的信息(僞代碼):Scrapy spider_idle signal - 需要添加解析項目回調請求

def start_requests(self): 
    for url in self.start_urls: 
     yield Request(url, dont_filter=True) 

    # attempt to crawl orphaned items 
    db = MySQLdb.connect(host=self.settings['AWS_RDS_HOST'], 
         port=self.settings['AWS_RDS_PORT'], 
         user=self.settings['AWS_RDS_USER'], 
         passwd=self.settings['AWS_RDS_PASSWD'], 
         db=self.settings['AWS_RDS_DB'], 
         cursorclass=MySQLdb.cursors.DictCursor, 
         use_unicode=True, 
         charset="utf8",) 
    c=db.cursor() 

    c.execute("""SELECT p.url FROM products p LEFT JOIN product_data pd ON p.id = pd.product_id AND pd.scrape_date = CURDATE() WHERE p.website_id = %s AND pd.id IS NULL""", (self.website_id,)) 

    while True: 
     url = c.fetchone() 
     if url is None: 
      break 
     # record orphaned product 
     self.crawler.stats.inc_value('orphaned_count') 
     yield Request(url['url'], callback=self.parse_item) 
    db.close() 

不幸的是,它看起來好像抓取的休息期間,履帶式隊列把這些孤立的項目 - 所以,實際上,太多的作爲孤立認爲(因爲履帶有在執行數據庫查詢時,尚未在正常爬網中檢索這些項目)。

我需要這個孤兒過程發生在爬行結束 - 所以我相信我需要使用spider_idle信號。

但是,我的理解是,我不能簡單地在我的蜘蛛閒置方法中產生請求 - 相反,我可以使用self.crawler.engine.crawl

我需要請求由我的蜘蛛的parse_item()方法處理(以及爲我配置的中間件,擴展和管道服從)。我怎樣才能做到這一點?

回答

1

已連接到idle signal空閒方法(假設空閒方法稱爲idle_method)應接受spider作爲參數,所以你可以這樣做:

def idle_method(self, spider): 
    self.crawler.engine.crawl(Request(url=myurl, callback=spider.parse_item), spider) 
+0

感謝,正是我一直在尋找對於。相關的這個問題,你可以看看這裏 - https://stackoverflow.com/questions/46073577/scrapy-spider-idle-signal-not-received-in-my-extension - 我不能得到'spider_idle '在我的分機上發射信號。 – BrynJ