0

我使用 for 循环来抓取网页。但是,我在抓取某些页面时遇到 ip request limit 错误。当我每 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)
4

2 回答 2

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)

代码可能会陷入无限循环。根据您的需要,您可以保留可以进行的试验的阈值。保留一个计数器,如果该阈值已用尽,则不要将页面附加回堆栈。

于 2012-05-20T13:51:56.250 回答
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 (只使用页面)。

于 2012-05-20T13:56:30.070 回答