2013-03-16 3 views
0

Scrapy возвращает два результата для каждого элемента, который я хотел бы очистить. Я мог бы просто удалить дубликаты позже в CSV-файле, но я чувствую, что есть гораздо более элегантное решение, которое я не вижу. Я не знаю, но я думаю, что дублирование также может замедлить сам анализ.Почему репарация возвращает два элемента?

class kickstarter(CrawlSpider): 
    name = 'kickstarter_successful' 
    allowed_domains = ['kickstarter.com']  
    start_urls = ['http://www.kickstarter.com/discover/successful'] 

    rules = (
     Rule(
      SgmlLinkExtractor(allow=r'\?page=\d+'), 
      follow=True 
     ), 
     Rule(
      SgmlLinkExtractor(allow=r'/projects/'), 
      callback='parse_item' 
     ) 
    ) 

    COOKIES_ENABLED = False 
    DOWNLOAD_DELAY = 2 
    USER_AGENT = "ELinks (0.4pre5; Linux 2.6.10-ac7 i686; 80x33)" 

    def parse_item(self, response): 
     xpath = HtmlXPathSelector(response) 
     loader = XPathItemLoader(item=kickstarteritem(), response=response) 

     loader.add_value('url', response.url) 
     loader.add_xpath('name', '//div[@class="NS-project_-running_board"]/h2[@id="title"]/a/text()') 
     loader.add_xpath('launched', '//li[@class="posted"]/text()') 
     loader.add_xpath('ended', '//li[@class="ends"]/text()') 
     loader.add_xpath('backers', '//span[@class="count"]/data[@data-format="number"]/@data-value') 
     loader.add_xpath('pledge', '//div[@class="num"]/@data-pledged') 
     loader.add_xpath('goal', '//div[@class="num"]/@data-goal') 

     yield loader.load_item() 
+0

Проверьте журнал, может быть два разных URLs оба указывают на одну и ту же страницу. –

+0

Да, вы правы, это так. Один раз с «ref = card» и один раз. Наверное, я ничего не могу с этим поделать? Не прерывание сделки. Спасибо. –

ответ

0

Если вы видите два разных адреса в журнале и указывая на той же странице, вы можете канонизировать в URLs себя немного с process_value:

Rule(
    SgmlLinkExtractor(
     allow=r'/projects/', 
     process_value=lambda v: v.replace('ref=card','')), 
    callback='parse_item') 
+0

Сэр, это прекрасно работает. –

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