2016-05-24 3 views
4

Я использую scrapy для сканирования 1000 URL-адресов и хранения скребкового предмета в mongodb. Я бы знал, сколько элементов найдено для каждого URL-адреса. Из статистики scrapy я могу видеть 'item_scraped_count': 3500 Однако мне нужно, чтобы этот счет для каждого start_url отдельно. Существует также referer поля для каждого элемента, который я мог бы использовать для подсчета Каждого URL элементов вручную:Сколько предметов было очищено на start_url

2016-05-24 15:15:10 [scrapy] DEBUG: Crawled (200) <GET https://www.youtube.com/watch?v=6w-_ucPV674> (referer: https://www.youtube.com/results?q=billys&sp=EgQIAhAB) 

Но мне интересно, если есть встроенная поддержка от Scrapy.

+0

Возможно, вы могли бы создать список или словарь, который увеличивает каждый индекс или значение каждый раз, когда он удаляет содержимое для определенной ссылки? Я никогда раньше не использовал scrapy, но это похоже на быстрое решение вашей проблемы. – freddiev4

+1

Не могли бы вы показать своего паука и ожидаемый результат? Благодарю. – alecxe

+0

@ FreddieV4 спасибо, это будет ручной подсчет реферирования, но я предпочитаю делать это в одной партии в конце обхода. – PHA

ответ

5

запрос принят!

есть не что-то на scrapy что напрямую поддерживает это, но вы могли бы отделить его от кода паука с Spider Middleware:

middlewares.py

from scrapy.http.request import Request 

class StartRequestsCountMiddleware(object): 

    start_urls = {} 

    def process_start_requests(self, start_requests, spider): 
     for i, request in enumerate(start_requests): 
      self.start_urls[i] = request.url 
      request.meta.update(start_request_index=i) 
      yield request 

    def process_spider_output(self, response, result, spider): 
     for output in result: 
      if isinstance(output, Request): 
       output.meta.update(
        start_request_index=response.meta['start_request_index'], 
       ) 
      else: 
       spider.crawler.stats.inc_value(
        'start_requests/item_scraped_count/{}'.format(
         self.start_urls[response.meta['start_request_index']], 
        ), 
       ) 
      yield output 

Не забудьте активировать его settings.py:

SPIDER_MIDDLEWARES = { 
    ... 
    'myproject.middlewares.StartRequestsCountMiddleware': 200, 
} 

Теперь вы должны быть способны чтобы увидеть что-то подобное на вашей статистике пауков:

'start_requests/item_scraped_count/START_URL1': ITEMCOUNT1, 
'start_requests/item_scraped_count/START_URL2': ITEMCOUNT2, 
+0

работает как шарм. благодаря! Только одна вещь, которая может быть улучшена: это не показывает URL-адреса с 0 скребками в статистике паука. Есть ли простой способ показать эти URL-адреса с помощью ITEMCOUNT = 0? – PHA

+1

, вы можете также включить в статистику с помощью 'set_value ('mystat", 0) ', поэтому в' process_start_requests' добавьте строку с 'spider.crawler.stats.set_value (" myurl ", 0)' – eLRuLL

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