Я использую простой CrawlSpider, который я использую для сбора метаданных, в списке из примерно 10 тысяч разных доменов. Цель состоит в том, чтобы сканировать каждый веб-сайт целиком.
Поскольку это «широкий обход», я дал ему 6 единиц для запуска и загрузил CONCURRENT_REQUESTS до 900, сохраняя AUTOTHROTTLE_TARGET_CONCURRENCY до 1.
Он будет работать довольно быстро в первый час, а затем будет медленно снижаться, примерно через 3 часа скорость будет составлять 50 единиц в минуту, что, я думаю, немного, когда у нас 900 параллельных запросов.
Я мог бы увеличить его в среднем до 250 элементов / минут, увеличив AUTOTHROTTLE_TARGET_CONCURRENCY до 50, но некоторые веб-сайты давали бы мне много исключений по таймауту.
Итак, мой вопрос: я что-то не так делаю? Даже когда я запускаю «верх» на пауке, я вижу, что в начале он работал между 60% -90%, сейчас он на 5% макс.
Вот мой файл settings.py
SPIDER_MODULES = ['crawl_everything.spiders']
NEWSPIDER_MODULE = 'crawl_everything.spiders'
SPIDER_MIDDLEWARES = {
'scrapy.spidermiddlewares.offsite.OffsiteMiddleware': True,
}
BOT_NAME='bot'
USER_AGENT='bot'
ROBOTSTXT_OBEY = True
HTTPCACHE_ENABLED = False
LOG_LEVEL = 'WARNING'
DELTAFETCH_RESET=True
CONCURRENT_REQUESTS = 900
CONCURRENT_REQUESTS_PER_IP=20
DOWNLOAD_DELAY=1
DOWNLOAD_TIMEOUT = 30
REACTOR_THREADPOOL_MAXSIZE = 100
AUTOTHROTTLE_ENABLED=False
LOG_LEVEL = 'INFO'
COOKIES_ENABLED = False
RETRY_ENABLED = False
REDIRECT_ENABLED = True
AJAXCRAWL_ENABLED = True
Вот мой паук
class CrawlEverythingSpider(CrawlSpider):
name = "crawl_everything"
allowed_domains = domains
start_urls = urls
rules = (
Rule(LinkExtractor(),
callback='parse_item',
follow=True
),
)
def parse_item(self, response):
item = {}
item['url'] = response.url
try:
item['title'] = response.xpath("//title/text()").extract_first()
except (AttributeError, NotSupported) as e:
return
meta_names = response.xpath("//meta/@name").extract()
meta_properties = response.xpath("//meta/@property").extract()
for name in meta_names:
item[name] = response.xpath("//meta[@name='" + name + "']/@content").extract_first()
for property in meta_properties:
item[property] = response.xpath("//meta[@property='" + property + "']/@content").extract_first()
yield item