2012-05-20 3 views
0

Я использую цикл for для сканирования веб-страниц. Тем не менее, я сталкиваюсь с ошибкой ограничения ip-запроса, когда я просматриваю некоторые страницы. Я попытался сделать python сон несколько секунд, когда я просканировал каждые 20 страниц, однако ошибка сохраняется. Я могу начать сканирование снова после того, как питон будет спать 60 секунд.Сканирование снова с исключительной страницы с помощью Python

Проблема заключается в каждом случае, когда есть исключение, я потеряю страницу информации. Кажется, что python перескакивает через исключительную страницу, используя метод try-except.

Мне интересно, как лучше всего перезапустить сканирование с страницы, которая столкнулась с исключением.

Мой вопрос - как перезапустить сканирование с исключительной страницы.

pageNum = 0 

for page in range(1, 200): 
    pageNum += 1 
    if(pageNum % 20 ==0): # every 20 pages sleep 180 secs 
     print 'sleeep 180 secs' 
     time.sleep(180) # to oppress the ip request limit 
    try: 
     for object in api.repost_timeline(id=id, count=200, page=page): 
      mid = object.__getattribute__("id") 
      # my code here to store data 
    except: 
     print "Ip request limit", page 
     sleep.time(60) 
+1

Итак, в чем ваш вопрос? Ваш код, похоже, работает (или, по крайней мере, находится в правильном направлении). – betabandido

+0

Благодарим вас за внимание. Проблема каждый раз, когда есть исключение, я потеряю страницу информации. Кажется, что python перескакивает через исключительную страницу, используя метод try-except. Мне интересно, как лучше всего перезапустить сканирование с страницы, которая столкнулась с исключением. Мой вопрос - как перезапустить сканирование с исключительной страницы. –

+0

Разве вы не должны просто поставить try и исключить внутри цикла объекта? – Junuxx

ответ

4

Используйте stack страниц. pop Страница, если она терпит неудачу, добавьте еще раз.

from collections import deque 

page_stack = deque() 
for page in range(199, 0, -1): 
    page_stack.append(page) 

while len(page_stack): 
    page = page_stack.pop() 

    try: 
     ## Do something 
    except IPLimitException, e: 
     page_stack.append(page) 

Код может работать в бесконечном цикле. Основываясь на вашей потребности, вы можете сохранить порог испытаний, которые вы можете сделать. Держите счетчик и не добавляйте страницу обратно в стек, если этот порог исчерпан.

2

Чтобы сохранить код, как ближе, насколько это возможно вашему, вы могли бы просто сделать что-то вроде:

pageNum = 0 

for page in range(1, 200): 
    pageNum += 1 
    if(pageNum % 20 ==0): # every 20 pages sleep 180 secs 
     print 'sleeep 180 secs' 
     time.sleep(180) # to oppress the ip request limit 
    succeeded = False 
    while not succeeded: 
     try: 
      for object in api.repost_timeline(id=id, count=200, page=page): 
       mid = object.__getattribute__("id") 
       # my code here to store data 
      succeeded = True 
     except: 
      print "Ip request limit", page 
      sleep.time(60) 

Конечно вы можете захотеть включить какой-то предел, а не рисковать, чтобы войти в бесконечный цикл. Кстати, вы также можете избавиться от pageNum (просто используйте страницу).

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