经常写爬虫的大佬们是如何不让程序中断的?

2017-01-30 18:47:04 +08:00
 hard2reg
如题,爬虫运行的时候难免会遇到各种意外,很有可能导致整个程序都终止。。。。

各位大佬一般是怎么解决的?
5285 次点击
所在节点    Python
18 条回复
h3ikichi
2017-01-30 18:55:22 +08:00
Try..Except...
zqhong
2017-01-30 18:57:13 +08:00
Supervisor
bombless
2017-01-30 19:01:50 +08:00
还是对库的行为不熟悉吧 233
直接 panic 的库当然就不要用了,除非做的是随时崩溃随时恢复
bazingaterry
2017-01-30 19:02:06 +08:00
catch 。

查一下文档这个函数会抛什么异常,都接住就好……
popbones
2017-01-30 19:15:39 +08:00
try:
except:
pass
gamexg
2017-01-30 19:24:29 +08:00
python ?
每个任务最外侧接住所有异常并打印日志。
sheep3
2017-01-30 19:27:34 +08:00
难道不是 try catch 么,然后最好通知和记录,这个点爬不下去了继续爬别的点,如果出现大量错误做更高级别的通知,比如 server 酱啊,或者发个邮件啊,就这样。
sheep3
2017-01-30 19:27:45 +08:00
打好 log 就好
wellsc
2017-01-30 19:32:57 +08:00
let it crash
gamexg
2017-01-30 19:34:10 +08:00
另外再补充下非爬虫涉及第三方的复杂任务,直接 multiprocessing.Process 另起一个进程来跑,出故障也只是任务进程出问题,主进程不会出问题,超时之类的情况直接杀子进程的进程树树,方便。
bxb100
2017-01-30 20:32:49 +08:00
@gamexg 老司机😏
Yinz
2017-01-30 20:43:11 +08:00
一般用 queue 做多线程任务队列,然后在 worker 线程上先处理已知可能出现的 exception ,然后再套一个 except Exception 来抓未知的。

最后正常的任务会放到完成 queue 里,跳了未知 exception 的会放到一个 error queue 里,这样你可以人工处理完之后把 error queue 的全都倒回待处理 queue 里。

当然,肯定需要完整的 log 才方便查错了
aabbccli
2017-01-30 23:21:53 +08:00
用 REDIS 做队列,失败的用 TRY EXCEPT 再 PUSH 到未爬队列里
RqPS6rhmP3Nyn3Tm
2017-01-30 23:34:49 +08:00
抛出一个异常,然后记录下来,以后再尝试呗
whwq2012
2017-01-31 09:44:01 +08:00
用 scrapy 啊,而且爬之前要尽量搞清楚哪里会抛异常,并标记 try except 。
lizon
2017-02-01 14:18:34 +08:00
为什么会全部停止?单线程爬取?
开多线程的话,暴力点处理就是在线程最外面 catch 所有异常,记下本次抓取的 url ,重新投递到任务队列。
对获取不成功的 url 进行重试计数,超过重试次数限制的就不再投递到任务队列,记下来,人工处理。
denonw
2017-02-03 14:31:02 +08:00
try catch 啊
whnzy
2017-02-08 23:09:13 +08:00
守护进程

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/337427

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX