鱼C论坛

 找回密码
 立即注册
查看: 970|回复: 23

写了一个爬虫我是一步一个坎呀,朋友们帮帮我吧,在这里献上鱼币了

[复制链接]
发表于 2021-6-2 23:07:36 | 显示全部楼层 |阅读模式
20鱼币
写了一个爬虫,想实现如下功能实在是不知道怎么写了

爬取得过程中,假设爬了十几个网址的时候,由于爬取的频繁,网站会把我禁掉(爬的过程中没有时间间隔),但是等个十几二十秒,又可以继续爬了

我想实现的事如果被禁掉后,能够把这段代码再重新执行一遍,还是不行就再执行一遍,就是循环的意思啦

假设执行20次后还是没抓到数据,还是报错,那么我就不抓这个网址了,跳过去,再继续执行下面的代码

应该怎么写呀?

百度查到了用retry函数,但是retry函数一直重复执行我要求的次数后,如果还是报错的话,程序就暂停了,不符合我要求啊

顺带问一下,下面这个代码为什么会报错
  1. from retrying import retry

  2. @retry(ZeroDivisionError, tries=3, delay=2)
  3. def make_trouble():
  4.     print("aaa")
  5.     a = 1 / 0


  6. if __name__ == '__main__':
  7.     make_trouble()
复制代码

  1. Traceback (most recent call last):
  2.   File "D:\pythonProject\tipin\tipin\lianxi1.py", line 10, in <module>
  3.     make_trouble()
  4. TypeError: 'ZeroDivisionError' object is not callable
复制代码


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-6-2 23:22:57 | 显示全部楼层
看起来你需要try except来累计报错。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-6-3 06:35:11 From FishC Mobile | 显示全部楼层
①÷零    你想干嘛
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-6-3 07:42:54 | 显示全部楼层
捕获各种错误 对某些已知的错误忽略(break) 某些未知的难复现的错误不间断的死循环重试 (continue)
重试多次熔断后主动抛出异常  retry只处理熔断器的异常
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-6-3 09:16:43 | 显示全部楼层
  1. while True:
  2.     try:
  3.         res = requests.get(url=url, headers=headers, timeout=30)
  4.         res.raise_for_status()  # 如果状态不是200,即未成功爬取则引发异常
  5.         res.encoding = res.apparent_encoding  
  6.         return res.text
  7.     except:
  8.         count += 1   # 错误计次
  9.         if count <20:
  10.             time.sleep(0.5) # 出错则延迟再重试
  11.             headers = random.choice(user_agents) # 网上找多弄点UA写个列表,出错则换个UA重试
  12.             continue
  13.         else:
  14.             break
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-6-3 11:23:14 | 显示全部楼层
建议你参考scrapy框架的逻辑  构造待爬取队列,用专门的线程来维护这个队列
如果意外中断,程序下次启动会从中断的队列重新开始运行,而不是从头开始运行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-6-3 15:26:38 | 显示全部楼层
混个币
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-6-3 16:26:03 | 显示全部楼层
你就不能爬慢点嘛
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-6-3 18:00:46 | 显示全部楼层
其实我在想,你为什么不用time.sleep(),每次爬取然后推迟几秒再爬,或者使用代理IP,让服务器认为你不是一个人。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-6-3 22:22:23 | 显示全部楼层
使用代理IP,会花些钱,总比被禁用要强。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-6-3 23:32:01 | 显示全部楼层
代理IP吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-6-4 08:56:02 | 显示全部楼层
多差不多
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2021-6-5 17:56:42 | 显示全部楼层
kogawananari 发表于 2021-6-3 07:42
捕获各种错误 对某些已知的错误忽略(break) 某些未知的难复现的错误不间断的死循环重试 (continue)
重 ...

retry能不能多次尝试失败后,抛出异常,然后再继续爬取下一个
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2021-6-5 17:57:59 | 显示全部楼层
adzs552 发表于 2021-6-3 18:00
其实我在想,你为什么不用time.sleep(),每次爬取然后推迟几秒再爬,或者使用代理IP,让服务器认为你不是一 ...

有时候会用time.sleep(),  代理要花钱
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-6-6 11:39:26 | 显示全部楼层
not callable的话说明这个不是一个函数或者方法,不能被调用,如果要抛出异常,可以用raise主动抛出异常,先定义一个包含raise的函数,里面写你想要抛出的异常,再用这个函数名替换你当前的ZeroDivisionError
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-6-6 18:35:30 From FishC Mobile | 显示全部楼层
while True:
    try:
        xxx
        break
    except:
        continue
结构
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-6-8 17:19:44 | 显示全部楼层
这里直接加一个random,随机范围定在 15 到 30 之间,然后 time.sleep(),待时间过了之后就会爬下一条,这样服务器也不会察觉到这是爬虫,不过比较费时间就是的。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-6-14 13:42:07 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-6-16 10:31:35 | 显示全部楼层
用selenium?本来就是用浏览器运行,网页没理由禁
ps:上面代码你用1/0,0不能做除数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-6-16 11:01:16 | 显示全部楼层
水币
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1

GMT+8, 2021-6-24 20:53

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表