У меня много пауков-скраперов, и кажется, что моя память только поднимается, но никогда не возвращается назад. Кажется, что у меня есть утечка памяти, при запуске команды консоли telnet я получаю это:
>>> prefs()
Live References
HtmlResponse 59 oldest: 35s ago
MySpider 1 oldest: 238s ago
Request 45942 oldest: 235s ago
Selector 59 oldest: 34s ago
>>> prefs()
Live References
HtmlResponse 94 oldest: 35s ago
MySpider 1 oldest: 301s ago
Request 79139 oldest: 298s ago
Selector 93 oldest: 35s ago
Похоже, мои запросы растут с течением времени, но никогда не выпускаются. Я использую scrapy-deltafetch, https://github.com/scrapy-plugins/scrapy-deltafetch, есть ли известная утечка памяти с этим плагином?
Один ответ здесь, Утечка памяти в Scrapy , предложил мне переключить его с LIFO на FIFO, используя эту конфигурацию:
DEPTH_PRIORITY = 1
SCHEDULER_DISK_QUEUE = 'scrapy.squeue.PickleFifoDiskQueue'
SCHEDULER_MEMORY_QUEUE = 'scrapy.squeue.FifoMemoryQueue'
Однако это, похоже, не решило эту проблему. Ответ действительно предлагал мне использовать JOBDIR, но я бы подумал, потому что я использую scrapy-deltafetch, который должен обрабатывать все это для меня? Вместо этого я установил:
MySpider.custom_settings['DELTAFETCH_DIR'] = 'crawler/name'
Вот мой код:
class MySpider(SitemapSpider):
custom_settings = {
'RANDOMIZE_DOWNLOAD_DELAY': True,
'DOWNLOAD_TIMEOUT': 60,
'DEPTH_LIMIT': 0,
'LOG_LEVEL': 'INFO',
'DELTAFETCH_ENABLED': True,
'SPIDER_MIDDLEWARES': {
'scrapy_deltafetch.DeltaFetch': 100,
},
'DOWNLOADER_MIDDLEWARES': {
'rotating_proxies.middlewares.RotatingProxyMiddleware': 610,
'rotating_proxies.middlewares.BanDetectionMiddleware': 620,
},
'ROTATING_PROXY_BAN_POLICY': 'spiders.classes.proxies.policy.MyPolicy',
'RETRY_HTTP_CODES': [500, 502, 503, 504, 522, 524, 408, 403],
'ROTATING_PROXY_PAGE_RETRY_TIMES': 10,
# 'DEPTH_PRIORITY': 1,
# 'SCHEDULER_DISK_QUEUE': 'scrapy.squeues.PickleFifoDiskQueue',
# 'SCHEDULER_MEMORY_QUEUE': 'scrapy.squeues.FifoMemoryQueue',
'TELNETCONSOLE_USERNAME': 'scrapy',
'TELNETCONSOLE_PASSWORD': '7bkYpew6'
}
name = None
allowed_domains = ['allowed_domains']
sitemap_urls = ['start_urls']
def parse(self, response):
# This is for speed testing
le = LinkExtractor()
for link in le.extract_links(response):
yield response.follow(link.url, self.parse)