Решил обосноваться в gevent при написании парсера, и все в порядке с ним, за исключением одной проблемы: согласно документу нам нужно заранее знать, сколько страниц мы будем анализироватьGevent. Разбор количества страниц, которые заранее неизвестны
for i in range(1, 15):
handlers_group.add(gevent.spawn(handler, i))
handlers_group.join()
в этом случае обработчик выглядит следующим образом:
def handler(page_num):
r = requests.get('sait.com?page={}'.format(page_num))
if r.text != 'page not found':
# data processing
Что делать, когда количество выгружаемых для разбора не известно заранее? Следует останавливаться только тогда, когда ответ «страница не найдена». Мы знаем только, что количество страниц обычно составляет от 15 до 50, а в редких случаях более ста (крайний предел, который не знает, может встречаться и миллион, но обрабатывать более двух-трехсот не имеет никакого смысла).
Самая банальная вещь, которая приходит на ум - для создания запросов на 300 страниц:
for i in range(1, 300):
handlers_group.add(gevent.spawn(handler, i))
handlers_group.join()
и убить группу handlers_group из обработчика функции, когда ответ от сервера будет установлен на «странице не найденный'. Но в этом случае из-за асинхронного ответа со страницы №300 (который не принимает) может наступить быстрее, чем от №250 (что, скажем, там), и мы будем убивать страницы обработки, прежде чем мы получим всю информацию. Надеемся помочь сообществу в любом направлении.
, но в этом случае запросы в сеть будут выполняться синхронно и использовать gevent нет смысла? мы не можем знать количество требуемых запросов. – dadiwidono
Зачем им перевозить синхронно? Вы создаете флажки событий в «выполнить как обычную часть». Вы можете сохранить их в списке и присоединиться к ним после выхода из цикла. –
это должно замедлить работу программы? Я переписываю функцию обработчика следующим образом: http://pastebin.com/ryQ5zr9C и запускать его следующим образом: http://pastebin.com/fwm2tWva – dadiwidono