写了一个爬虫我是一步一个坎呀,朋友们帮帮我吧,在这里献上鱼币了
写了一个爬虫,想实现如下功能实在是不知道怎么写了爬取得过程中,假设爬了十几个网址的时候,由于爬取的频繁,网站会把我禁掉(爬的过程中没有时间间隔),但是等个十几二十秒,又可以继续爬了
我想实现的事如果被禁掉后,能够把这段代码再重新执行一遍,还是不行就再执行一遍,就是循环的意思啦
假设执行20次后还是没抓到数据,还是报错,那么我就不抓这个网址了,跳过去,再继续执行下面的代码
应该怎么写呀?
百度查到了用retry函数,但是retry函数一直重复执行我要求的次数后,如果还是报错的话,程序就暂停了,不符合我要求啊
顺带问一下,下面这个代码为什么会报错from retrying import retry
@retry(ZeroDivisionError, tries=3, delay=2)
def make_trouble():
print("aaa")
a = 1 / 0
if __name__ == '__main__':
make_trouble()
Traceback (most recent call last):
File "D:\pythonProject\tipin\tipin\lianxi1.py", line 10, in <module>
make_trouble()
TypeError: 'ZeroDivisionError' object is not callable
看起来你需要try except来累计报错。 ①÷零 你想干嘛 捕获各种错误 对某些已知的错误忽略(break) 某些未知的难复现的错误不间断的死循环重试 (continue)
重试多次熔断后主动抛出异常retry只处理熔断器的异常 while True:
try:
res = requests.get(url=url, headers=headers, timeout=30)
res.raise_for_status()# 如果状态不是200,即未成功爬取则引发异常
res.encoding = res.apparent_encoding
return res.text
except:
count += 1 # 错误计次
if count <20:
time.sleep(0.5) # 出错则延迟再重试
headers = random.choice(user_agents) # 网上找多弄点UA写个列表,出错则换个UA重试
continue
else:
break 建议你参考scrapy框架的逻辑构造待爬取队列,用专门的线程来维护这个队列
如果意外中断,程序下次启动会从中断的队列重新开始运行,而不是从头开始运行 混个币
你就不能爬慢点嘛{:10_333:} 其实我在想,你为什么不用time.sleep(),每次爬取然后推迟几秒再爬,或者使用代理IP,让服务器认为你不是一个人。。。。 使用代理IP,会花些钱,总比被禁用要强。 代理IP吧 多差不多 kogawananari 发表于 2021-6-3 07:42
捕获各种错误 对某些已知的错误忽略(break) 某些未知的难复现的错误不间断的死循环重试 (continue)
重 ...
retry能不能多次尝试失败后,抛出异常,然后再继续爬取下一个 adzs552 发表于 2021-6-3 18:00
其实我在想,你为什么不用time.sleep(),每次爬取然后推迟几秒再爬,或者使用代理IP,让服务器认为你不是一 ...
有时候会用time.sleep(),代理要花钱{:5_109:} not callable的话说明这个不是一个函数或者方法,不能被调用,如果要抛出异常,可以用raise主动抛出异常,先定义一个包含raise的函数,里面写你想要抛出的异常,再用这个函数名替换你当前的ZeroDivisionError while True:
try:
xxx
break
except:
continue
结构 这里直接加一个random,随机范围定在 15 到 30 之间,然后 time.sleep(),待时间过了之后就会爬下一条,这样服务器也不会察觉到这是爬虫,不过比较费时间就是的。。 {:5_95:} 用selenium?本来就是用浏览器运行,网页没理由禁
ps:上面代码你用1/0,0不能做除数 水币
页:
[1]
2