2017-02-20 20 views
1

У меня есть код соскабливания в цикле for, но это займет несколько часов, и программа остановится, когда мое интернет-соединение сломается. То, что мне (думаю, мне) нужно, является условием в начале скребка, который говорит Python продолжать попытки в этом пункте. Я пытался использовать ответ от here:Как заставить сценарий ждать в течение итерации до тех пор, пока соединение Интернета не будет восстановлено?

for w in wordlist: 

#some text processing, works fine, returns 'textresult' 

    if textresult == '___': #if there's nothing in the offline resources 
     bufferlist = list() 
     str1=str() 
     mlist=list() # I use these in scraping 

     br = mechanize.Browser() 

     tried=0 
     while True: 
      try: 
       br.open("http://the_site_to_scrape/") 

       # scraping, with several ifs. Each 'for w' iteration results with scrape_result string. 


      except (mechanize.HTTPError, mechanize.URLError) as e: 
       tried += 1 
       if isinstance(e,mechanize.HTTPError): 
        print e.code 
       else: 
        print e.reason.args 
      if tried > 4: 
        exit() 
        time.sleep(120) 
        continue 
      break 

Работы в то время как я в сети. Когда соединение ломается, Python записывает код 403 и пропускает это слово с wordlist, переходит к следующему и делает то же самое. Как я могу сказать Python ждать соединения в рамках итерации?

EDIT: Я был бы признателен, если бы вы могли написать хотя бы некоторые из необходимых команд и сообщить мне, где их следует поместить в мой код, потому что я никогда не сталкивался с циклами исключения.

EDIT - SOLUTION Я применил модифицированное решение Abhishek Jebaraj. Я просто добавил очень простую команду обработки исключений:

except: 
    print "connection interrupted" 
    time.sleep(30) 

Кроме того, команда Получить код Jebaraj будет поднимать ошибку. Перед r.getcode, я использовал это:

import urllib 

r = urllib.urlopen("http: the site ") 

Верхний ответ this question помог мне, как хорошо.

+1

Проверьте 'статуса/10! = 20', и держать повтор цикл. Просто поместите все в цикл for в цикл while (retry) и измените значение повтора на «False» для статуса 2xx – ishaan

ответ

0

Напишите еще один цикл, внутри которого будет продолжаться попытка подключения к Интернету.

Он разбивается только тогда, когда он получает код состояния 200, а затем вы можете продолжить свою программу.

Вид как

retry = True 
while retry: 
    try: 
     r = br.open(//your site) 
     if r.getcode()/10==20: 
      retry = False 
    except: 
      // code to handle any exception 

// rest of your code 
+0

Это находится внутри 'while True:' Я написал в моем вопросе? И // код для обработки любого исключения может быть таким же, как в моем вопросе? – Tag

+0

Да, он входит в цикл while в вашем вопросе, а // код для обработки - это то, что вы хотите. Возможно, вы захотите его сломать во время последовательных ошибок соединения. Или вы можете просто передать его вам. –

+0

Та же логика в моем последнем редактировании, просто сделал его немного короче .. на основе ishaans ответ в комментариях. –