我使用for循环来抓取网页。但是,当我抓取一些页面时,我遇到ip请求限制错误。当我每20页抓取一次时,我已经尝试让python睡眠几秒钟,但错误仍然存在。在python睡眠60秒后,我可以再次开始爬行。
问题是每次出现异常时,我都会丢失一页信息。似乎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)
答案 0 :(得分: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)
代码可能会遇到无限循环。根据您的需要,您可以保留您可以进行的试验阈值。保留一个计数器,如果该阈值用尽,则不要将页面附加回堆栈。
答案 1 :(得分: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(只是使用页面)。