2017-06-14 51 views
1

是否可以按照與它們關聯的日期刮取鏈接?我試圖實現一個每日運行的蜘蛛,它將文章信息保存到數據庫中,但我不想重新刮掉我以前已經刮過的文章 - 例如昨天的文章。我跑過this SO帖子詢問同樣的事情,並建議scrapy-deltafetch pluginScrapy - 按日期刮刮鏈接

但是,這依賴於檢查存儲在數據庫中以前保存的request fingerprints的新請求。我假設,如果每天都在進行一段時間的挖掘,那麼就需要在數據庫上存儲大量的內存開銷,以存儲已被抓取的請求指紋。

因此,給定一個像cnn.com這樣的網站上的文章列表,我想刮掉今天6/14/17發佈的所有文章,但是一旦刮板碰到後來被列爲6/13/17,我想關閉蜘蛛並停止刮擦。 scrapy可以實現這種方法嗎?給定一頁文章,CrawlSpider會從頁面頂部開始並按順序刮掉文章?

剛剛來到Scrapy,所以不知道該怎麼嘗試。任何幫助將不勝感激,謝謝!

+1

我認爲它不是內置於'scrapy'中,但考慮到文章網址應該採用'/ 2017/06/14/politics/two-arrested-brawl-turkish-embassy/index.html'的格式。你有沒有想過解析URL的日期並比較它? – etemple1

+0

@ etemple1不幸的是,在這種情況下'cnn.com'只是一個示例網站,而不是我想要抓取的網站。大多數我想抓取的網站都不包含網址 – ocean800

+0

中的日期啊,好的。那麼你怎麼知道鏈接的「相關日期」呢? – etemple1

回答

1

我使用datetime.strptime(Item['dateinfo'], "%b-%d-%Y")從關於感興趣的項目的拼湊在一起的信息編寫日期。

之後,我只是在我的設置中根據配置的年齡進行檢查,每次調用都可以對其進行覆蓋。如果您發現年齡太舊,或者您可以設置完成標誌並在其他任何代碼中對其執行操作,則可以發出closespider例外。

沒有必要記住的東西。我在每天運行的蜘蛛上使用它,我只是設置了24小時的年齡限制。

+0

謝謝!只是想知道,在實現這個時你使用'CrawlSpider'嗎?鑑於文章列在最新出現在頁面頂部的列表中,我只是想在我第一次「上一個」日期時關閉蜘蛛。但是'CrawlSpider'不會從上到下分析文章鏈接,這意味着它會跳過頁面,我不能立即停止請求。我試圖避免不得不請求頁面上的所有文章......但鑑於'CrawlSpider'沒有按順序進行,這是不可能的嗎? – ocean800

1

您可以使用自定義delta-fetch_key檢查日期和標題作爲指紋。

from w3lib.url import url_query_parameter 

... 

def parse(self, response): 
    ... 
    for product_url in response.css('a.product_listing'): 
     yield Request(
      product_url, 
      meta={'deltafetch_key': url_query_parameter(product_url, 'id')}, 
      callback=self.parse_product_page 
     ) 
    ... 
+0

謝謝,但我想看看如果我可以使用沒有'deltafetch'的方法,就像問題中提到的一樣,而且它使用'Berkeley DB',我不確定它是否與我想要使用的'MongoDB'兼容 – ocean800