前期接到的奇葩需求,要让爬虫像人一样打卡工作,工作还得有快有慢,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