【问题标题】:Crawl again from the exceptional page using Python使用 Python 从异常页面再次爬取
【发布时间】:2012-05-27 06:47:57
【问题描述】:

我使用 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)

【问题讨论】:

  • 那么你的问题是什么?您的代码似乎可以工作(或者至少方向正确)。
  • 感谢您的提醒。问题是每次出现异常时,我都会丢失一页信息。似乎python使用try-except方法跳过了异常页面。我想知道最好的方法是从遇到异常的页面重新开始爬网。我的问题是如何从异常页面重新开始抓取。
  • 你不应该把 try 和 except 放在 for 对象循环中吗?
  • object.__getattribute__("id") 是一种很奇怪的写法object.id
  • @Junuxx:我想我已经按照你说的做了。但是,会有一些异常的页面,我想再次抓取它们,而不是尝试一次就让它们走。

标签: python for-loop try-catch except


【解决方案1】:

使用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(只使用 page)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-17
      • 1970-01-01
      • 2023-03-05
      相关资源
      最近更新 更多