Scrapy - установите задержку, чтобы повторить попытку промежуточного программного обеспечения - PullRequest
0 голосов
/ 30 марта 2019

Я использую Scrapy-splash, и у меня проблема с памятью. Я ясно вижу, что память, используемая docker python3, постепенно увеличивается, пока компьютер не зависнет.

Не могу понять, почему он так себя ведет, потому что у меня CONCURRENT_REQUESTS=3, и нет способа, чтобы 3 HTML потребляло 10 ГБ ОЗУ.

Таким образом, существует обходной путь для установки maxrss на некоторое разумное значение. Когда использование ОЗУ имеет это значение, докер перезапускается, поэтому ОЗУ сбрасывается.

Но проблема в том, что пока docker не работает, scrapy продолжает отправлять запросы, так что есть пара urls, которые не были очищены. Промежуточное ПО Retry пытается повторить эти запросы прямо сейчас, а затем сдаться.

[scrapy.downloadermiddlewares.retry] DEBUG: Retrying <GET https://www.ex.com/eiB3t/ via http://127.0.0.1:8050/execute> (failed 2 times): [<twisted.python.failure.Failure twisted.internet.error.ConnectionDone: Connection was closed cleanly.>]
2019-03-30 14:28:33 [scrapy.downloadermiddlewares.retry] DEBUG: Gave up retrying <GET https://www.ex.com/eiB3t/

Итак, у меня два вопроса

  1. Знаете ли вы лучшее решение?
  2. Если нет, как я могу установить запрос Scrapy на retry через некоторое время (скажем, в минуту, чтобы docker успел перезапуститься)?

1 Ответ

0 голосов
/ 31 марта 2019
  1. Более сложным решением может быть настройка кластера Kubernetes, в котором запущено несколько реплик. Таким образом, вы избежите сбоя в работе всего одного контейнера, что повлияет на вашу работу по очистке.

  2. Я не думаю, что легко настроить время ожидания только для повторных попыток. Вы можете поиграть с DOWNLOAD_DELAY (но это повлияет на задержку между всеми запросами) или установить для RETRY_TIMES более высокое значение, чем значение по умолчанию, равное 2.

...