2017-10-28 82 views
0

我正在學習scrapy,我有一些小項目。如何處理scrapy中的重複項?

def parse(self, response): 
    links = LinkExtractor().extract_links(response) 
    for link in links: 
      yield response.follow(link, self.parse) 

    if (some_condition): 
     yield {'url': response.url} # Store some data 

因此,我打開一個頁面獲取所有鏈接的形式,並存儲一些數據,如果我有這個網頁上的一些數據。例如,如果我處理http://example.com/some_page,那麼它會在下次跳過它。而我的任務就是在下一次處理它。我想知道這個頁面已經被處理了,我需要在這種情況下存儲一些其他的數據。它應該是這樣的:

def parse(self, response): 

    if (is_duplicate): 
     yield{} # Store some other data 
    else: 
     links = LinkExtractor().extract_links(response) 
     for link in links: 
       yield response.follow(link, self.parse) 

     if (some_condition): 
      yield {'url': response.url} # Store some data 

回答

1

首先,你需要跟蹤你訪問的鏈接和第二,你要告訴Scrapy要多次親臨相同的頁面。

更改代碼是這樣的:

def __init__(self, *args, **kwargs): 
    super(MySpider, self).__init__(*args, **kwargs) 
    self.visited_links = set() 

def parse(self, response): 
    if response.url in self.visited_links: 
     yield {} # Store some other data 
    else: 
     self.visited_links.add(response.url) 

     links = LinkExtractor().extract_links(response) 
     for link in links: 
      yield response.follow(link, self.parse, dont_filter=True) 

     if (some_condition): 
      yield {'url': response.url} # Store some data 

在構造函數中添加,visited_links是用來跟蹤你已經visisted鏈接。 (這裏我假設你的蜘蛛類被命名爲MySpider,你沒有分享這部分代碼。)在parse中,你首先檢查鏈接是否已經被訪問(URL在visited_links集合中)。如果沒有,則將其添加到已訪問的鏈接集,並在產生新的Request(使用response.follow)時,指示Scrapy不要使用dont_filter=True過濾重複的請求。

+0

這是工作,但它看起來像我這樣做它也會抓取外部鏈接。所以我應該自己過濾它們? – GhostKU

+0

'dont_filter'隻影響重複請求的過濾。 –