2015-01-17 4 views
1

Решил обосноваться в 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 (что, скажем, там), и мы будем убивать страницы обработки, прежде чем мы получим всю информацию. Надеемся помочь сообществу в любом направлении.

ответ

0

Вы можете использовать глобальное событие, которое устанавливается на 404 и остановить итерации, когда событие is_set

from gevent.event import Event 
evt = Event() 


def parsing_method(): 
    eventlets = [] 
    for i in range(1,10): 
     gevent.sleep(0) 
     if evt.is_set(): break 
     eventlets.append(gevent.spawn(fn)) 
     #perform as usual 

    gevent.join_all(*eventlets) 

Но вы уверены, что вы не можете знать, подсчитать количество?

+0

, но в этом случае запросы в сеть будут выполняться синхронно и использовать gevent нет смысла? мы не можем знать количество требуемых запросов. – dadiwidono

+0

Зачем им перевозить синхронно? Вы создаете флажки событий в «выполнить как обычную часть». Вы можете сохранить их в списке и присоединиться к ним после выхода из цикла. –

+0

это должно замедлить работу программы? Я переписываю функцию обработчика следующим образом: http://pastebin.com/ryQ5zr9C и запускать его следующим образом: http://pastebin.com/fwm2tWva – dadiwidono

 Смежные вопросы

  • Нет связанных вопросов^_^