Разделы · Код и программные интерфейсы
Ниже кусок кода и описание того, что получается.
По порядку.
Результаты пишу пачками по тысяче строк. Питон, асинхронный сбор, одновременно держу около двухсот задач.
Правильно ли я вообще ставлю вопрос?
Сколько потоков стоит на прогоне?
Сколько адресов и какой темп при этом стоит?
Так делать можно, но есть путь короче.
Тестируйте сборщик на сохранённых страницах. Гонять живую площадку ради отладки расточительно.
Пусть висит, такие вопросы всплывают постоянно.
Смотрите разброс подсетей.
Замечание по существу, иначе расчёт поедет.
Состояние прогона храните построчно. Один кусок в конце вас не спасёт. Тогда обрыв на девяностом проценте не стоит вам всего прогона.
Проверку ответа делайте до разбора: пустое или короткое лучше отбросить сразу.
На другой машине воспроизводится?
Одно уточнение, иначе расчёт уедет.
Число одновременных задач подбирайте замером. На глаз тут промахиваются всегда. Обычно кривая выходит на полку, и дальше растёт только число отказов.
async with aiohttp.ClientSession() as s:
for i in range(3):
try:
r = await s.get(url, proxy=adres, timeout=30)
break
except Exception:
await asyncio.sleep(2 ** i)У нас это вылезло на проекте с большим каталогом.
Повторы делайте с растущей паузой: первая через две секунды, вторая через четыре, третья через восемь. Три попытки достаточно, дальше проблема не в связи.
Забрал себе в заметки.
До этого работало? Что менялось перед тем, как сломалось?
Не совсем так, и разница тут существенная.
Состояние прогона храните построчно. Один кусок в конце вас не спасёт. Тогда обрыв на девяностом проценте не стоит вам всего прогона.
async with aiohttp.ClientSession() as s:
for i in range(3):
try:
r = await s.get(url, proxy=adres, timeout=30)
break
except Exception:
await asyncio.sleep(2 ** i)Поправлю цифру, остальное верно.
Cookie при массовом сборе лучше сбрасывать. Накопленное состояние делает поведение непредсказуемым.
Считайте статистику прямо во время прогона. Узнать о провале в конце восьмичасового прогона обидно.
async with aiohttp.ClientSession() as s:
for i in range(3):
try:
r = await s.get(url, proxy=adres, timeout=30)
break
except Exception:
await asyncio.sleep(2 ** i)Похоже на правду, у меня цифры близкие.
Ошибки разделяйте по типам. Отказ по сети и отказ площадки требуют разного поведения.
Набор новых участников сейчас приостановлен. Читать форум можно без учётной записи, все темы открыты.
Когда набор откроют, объявление появится в разделе с короткими вопросами.
Форма работает в браузере и никуда ничего не отправляет.