让python在每20页爬网一次后休眠60秒

让python在每20页爬网一次后休眠60秒,python,time,ip,sleep,Python,Time,Ip,Sleep,我正在尝试从中国微博新浪微博收集转发数据,你可以看到以下代码。然而,我正遭受着IP请求超出限制的问题 为了解决这个问题,我必须为代码设置time.sleep。您可以看到,我试图在代码中添加一行“time.sleep10以操作ip请求限制”。因此,python将在抓取一个转发页面后休眠10秒,一个页面包含200个转发 然而,这仍然不足以解决知识产权问题 因此,我计划在python每20页爬网一次后,更系统地让它休眠60秒。您的想法将受到赞赏。 ids=[3388154704688495、33881

我正在尝试从中国微博新浪微博收集转发数据,你可以看到以下代码。然而,我正遭受着IP请求超出限制的问题

为了解决这个问题,我必须为代码设置time.sleep。您可以看到,我试图在代码中添加一行“time.sleep10以操作ip请求限制”。因此,python将在抓取一个转发页面后休眠10秒,一个页面包含200个转发

然而,这仍然不足以解决知识产权问题

因此,我计划在python每20页爬网一次后,更系统地让它休眠60秒。您的想法将受到赞赏。 ids=[3388154704688495、3388154704688494、3388154704688492]

        addressForSavingData= "C:/Python27/weibo/Weibo_repost/repostOwsSave1.csv"    
        file = open(addressForSavingData,'wb') # save to csv file 

        for id in ids:
            if api.rate_limit_status().remaining_hits >= 205:  
                for object in api.counts(ids=id):
                    repost_count=object.__getattribute__('rt')
                    print id, repost_count
                    pages= repost_count/200 +2  # why should it be 2? cuz python starts from 0  
                    for page in range(1, pages):
                        time.sleep(10)  # to opress the ip request limit
                        for object in api.repost_timeline(id=id, count=200, page=page):  # get the repost_timeline of a weibo
                            """1.1 reposts"""
                            mid = object.__getattribute__("id")
                            text = object.__getattribute__("text").encode('gb18030')     # add encode here
                            """1.2 reposts.user"""
                            user = object.__getattribute__("user") # for object in user
                            user_id = user.id                                   
                            """2.1 retweeted_status"""
                            rts = object.__getattribute__("retweeted_status")
                            rts_mid = rts.id  # the id of weibo     
                            """2.2 retweeted_status.user"""
                            rtsuser_id = rts.user[u'id']                                                        
                            try:
                                w = csv.writer(file,delimiter=',',quotechar='|', quoting=csv.QUOTE_MINIMAL)
                                w.writerow(( mid,
                                            user_id, rts_mid,
                                            rtsuser_id, text)) # write it out   
                            except:  # Exception of UnicodeEncodeError
                                pass
            elif api.rate_limit_status().remaining_hits < 205:  
                sleep_time=api.rate_limit_status().reset_time_in_seconds # time.time()
                print sleep_time, api.rate_limit_status().reset_time
                time.sleep(sleep_time+2)
        file.close()
        pass

你能不能不只是调整剧本的节奏

我建议让脚本在每个请求之间休眠,而不是同时发出一个请求。然后说一分钟后。。这样,您也将避免任何洪水禁令,这被认为是良好的行为

如果服务器没有让您因发送太多请求而超时,调整请求的速度也可以让您更快地完成任务

如果对IP有限制,有时他们的解决方案并不简单。例如,如果您运行apache限制带宽和连接,特别是它限制

并发请求的最大数目 带宽限制,例如每秒对URL的最大允许请求数或每秒下载的最大/最小KB。 限制每秒的请求事件数 用于拒绝未经授权操作的通用请求行和标头筛选器。 请求正文数据限制和筛选 单个IP源地址或动态保持活动控件允许的最大连接数。 你可以从这些开始。您可以将推荐人URL与您的请求一起发送,并且只进行单个连接,而不是多个连接


您也可以参考此

我找到了解决方案:

首先,给出一个整数,例如0 其次,在for页面循环中,添加以下代码
我已经尝试让python在一个请求爬网一个页面后休眠10秒和15秒,但是,它仍然会遇到问题,如果我让它休眠太多秒,它将没有效率。对于范围为1300的页面,i=3:i+=1如果i%25==0:print i,则找到可以被25整除的i
i = 0
for page in range(1, 300):
    i += 1
    if (i % 25 ==0):
        print i, "find i which could be exactly divided by 25"