11回答

2收藏

让你的爬虫像人一样打卡上下班。。。

信息分享 信息分享 5806 人阅读 | 11 人回复 | 2019-11-26


前期接到的奇葩需求,要让爬虫像人一样打卡工作,工作还得有快有慢,wtf,想了半天,写个装饰器算了,基本能满足需求,大家还有更好的方法吗,求指教。

目标网站需账号访问,账号收费(贵,冷门),访问频繁直接封号。
def jobstatus(func):
    '''
    爬虫的工作状态装饰器
    周一至周五
    09:00-18:00
    小时数是偶数
    每分钟请求30次左右
    小时数是奇数
    每分钟请求10次左右
    其余时间等待
    '''

    @wraps(func)
    def inner(self, response):
        while 1:
            # 开始时间
            time_on = datetime.strptime(str(datetime.now().date()) + '09:00', '%Y-%m-%d%H:%M')
            # 结束时间
            time_off = datetime.strptime(str(datetime.now().date()) + '18:00', '%Y-%m-%d%H:%M')
            # 当前星期
            week_now = datetime.now().weekday()
            # 当前时间
            time_now = datetime.now()
            # 当前小时
            hour_now = datetime.now().hour
            # 判断当前星期是否为工作日
            if week_now in list(range(5)):
                # 判断当前时间是否为工作时间
                if time_on <= time_now <= time_off:
                    if hour_now % 2 == 0
                        time.sleep(random.choice([1, 2]))
                        return func(self, response)
                    else
                        time.sleep(random.choice([3, 4]))
                        return func(self, response)
                else:
                    time.sleep(3600)
            else
                time.sleep(86400)

    return inner


分享到:
回复

使用道具 举报

回答|共 11 个

非牛

发表于 2019-11-26 09:59:11 | 显示全部楼层

请问你们考虑过爬虫的感受吗?还有,应该细化到账号或者进程或者进程吧?比如你起了多个爬虫
回复

使用道具 举报

搬砖的手微微颤抖

发表于 2019-11-26 10:13:30 | 显示全部楼层

1、账号特贵,只有一个
2、用的scrapy,只开一个线程
回复

使用道具 举报

sfhfpc

发表于 2019-11-26 10:55:20 | 显示全部楼层

编一个定时调度平台不香吗?

如果文件数不多,Linux Shell 更适合

文件数多,还要做监控和扩展之类的话,用 Flask 写一个服务,将 Apscheduler 和 Scrapyd 继承到服务中,这样就是一个完整的爬虫项目部署和调度管理平台了。跳槽还加分呢!
回复

使用道具 举报

路过的憨憨

发表于 2019-11-26 11:10:31 | 显示全部楼层

只开一个线程没必要用scrapy啊,这种细化的需求还是自己写个调度系统比较好
回复

使用道具 举报

haoyougen

发表于 2019-11-26 11:30:08 | 显示全部楼层

楼上老哥流弊,能写个教程让我等菜鸟观摩观摩不?
回复

使用道具 举报

路过的憨憨

发表于 2019-11-26 13:47:30 | 显示全部楼层

流弊个锤子,我就是个憨憨,也就说说了,动手动不了,属实菜鸡
回复

使用道具 举报

搬砖的手微微颤抖

发表于 2019-11-26 13:51:18 | 显示全部楼层

感觉有现成的就不想自己写了,太懒了。。。
有没有比自己写调度更简单方便的啊
回复

使用道具 举报

v5yangzai

发表于 2019-11-26 17:52:02 | 显示全部楼层

使用APScheduler可以设置定时任务
回复

使用道具 举报

陈祥安

发表于 2019-11-27 11:04:07 | 显示全部楼层

你直接用linux的定时任务 跑不就完事了
回复

使用道具 举报