2014-01-08 1 views
5

Это мой custom_filters.py файл:Игнорировать уже посещенные адреса в Scrapy

from scrapy.dupefilter import RFPDupeFilter 

class SeenURLFilter(RFPDupeFilter): 

    def __init__(self, path=None): 
     self.urls_seen = set() 
     RFPDupeFilter.__init__(self, path) 

    def request_seen(self, request): 
     if request.url in self.urls_seen: 
      return True 
     else: 
      self.urls_seen.add(request.url) 

Добавлена ​​строка:

DUPEFILTER_CLASS = 'crawl_website.custom_filters.SeenURLFilter' 

в settings.py

Когда я проверяю файл CSV сгенерированный он показывает один URL-адрес много раз. Это неправильно?

+1

Вы можете добавить строки журнала в вашем DupeFilter 'метода request_seen', чтобы понять, что происходит на –

ответ

2

От: http://doc.scrapy.org/en/latest/topics/item-pipeline.html#duplicates-filter

from scrapy.exceptions import DropItem 

class DuplicatesPipeline(object): 

    def __init__(self): 
     self.ids_seen = set() 

    def process_item(self, item, spider): 
     if item['id'] in self.ids_seen: 
      raise DropItem("Duplicate item found: %s" % item) 
     else: 
      self.ids_seen.add(item['id']) 
      return item 

Тогда в вашем settings.py добавить:

ITEM_PIPELINES = { 
    'your_bot_name.pipelines.DuplicatesPipeline': 100 
} 

EDIT:

Для проверки дубликатов URL-адресов с помощью:

from scrapy.exceptions import DropItem 

class DuplicatesPipeline(object): 
    def __init__(self): 
     self.urls_seen = set() 

    def process_item(self, item, spider): 
     if item['url'] in self.urls_seen: 
      raise DropItem("Duplicate item found: %s" % item) 
     else: 
      self.urls_seen.add(item['url']) 
      return item 

Для этого требуется url = Field(). Что-то вроде этого (items.py):

from scrapy.item import Item, Field 

class PageItem(Item): 
    url   = Field() 
    scraped_field_a = Field() 
    scraped_field_b = Field() 
+2

это только проверяет повторяющиеся записи при создании файла результатов (то есть CSV-файл) , это не будет проверять наличие дубликатов URL-адресов внутри вашего паука. – mattes

Смежные вопросы