博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
在linux下python爬虫进程发生异常时自动重启直至正常结束的方法
阅读量:6196 次
发布时间:2019-06-21

本文共 1208 字,大约阅读时间需要 4 分钟。

之前在做爬虫的时候遇到一种情况,当网络情况不太好的时候,爬虫爬到的链接在urlopen时会因为无法正常连接而报URLError或者timeout的错误导致陈序报错而终止;但是这些错误在重新运行陈序后能够解决,因此为了避免重复手动重启程序的麻烦,就想写脚本来自动重启。

思路很简单:

1.首先脚本检测目标程序是否在运行。这里我们可以用pidof的返回值来判断。
2.如果脚本检测到程序尚未运行或程序运行出错,重启程序。这里需要用到linux的变量,该变量能返回上一次命令的运行状态。其中0为运行正常,其他均为运行报错。
3.如果程序正常运行结束,终止脚本

例如我们要自动运行名为web_crawler.py的脚本,那么可以写如下shell脚本:

#! /bin/bashpidof web_crawler.py # 检测程序是否运行while [ $? -ne 0 ]    # 判断程序上次运行是否正常结束do    echo "Process exits with errors! Restarting!"    python web_crawler.py    #重启程序doneecho "Process ends!"

PS1: 这只能处理网络状况不良引起连接出错的情况,通过重新尝试链接能够解决的。如果是遇到了由于网站被墙导致的链接错误,那么这个做法就很有问题了,因为无论你重复几次都无法打开链接。这种情况的解决方式要么是FQ再运行爬虫,那么就是跳过被墙的链接——具体操作可以是用re匹配链接排除,也可以是用try在连接超时执行跳出操作。例如:

try:    res = urllib2.urlopen(rq, timeout=10) # use urllib2 packageexcept urllib2.URLError, e:    print "Timed out to connect to this URL"    return Noneexcept socket.timeout: # use socket package    print "Time out!"    return None

PS2:这里我们实际爬的是stanford cs224d上的链接然后下载内容,由于有些链接(pdf文件或者html网页)不包含文件后缀,保存的时候会比较麻烦。但是如果链接是网页的话那么res.headers.getheader('Content-Type') # urllib2或者rq = requests.get(url);r.headers['content-type'] # requests返回内容包含'text/html',利用这一点我们就可以识别出网页链接进行保存。

参考:

转载于:https://www.cnblogs.com/arkenstone/p/5984989.html

你可能感兴趣的文章
如何在 Kubernetes 中对无状态应用进行分批发布
查看>>
Java程序员:不要因未知而让云成本大涨
查看>>
Git漏洞导致攻击者可在用户电脑上运行任意代码
查看>>
F# 2017回顾
查看>>
业务中台探索和实践:软件的根本问题
查看>>
云平台宕机引发的系列思考,企业如何自救?
查看>>
LFE将Lisp编程带到Erlang虚拟机上
查看>>
QCon北京2015:移动开发最佳实践专题前瞻
查看>>
Trello中的Scrum
查看>>
Thanos如何让Prometheus更易用?
查看>>
Kubernetes上的十大应用程序
查看>>
Gartner有关Java EE正在消亡的报告是否太言过其实了?
查看>>
使用Mono将C#编译运行至WebAssembly平台
查看>>
一文带你快速读懂.NET CLI
查看>>
统一建模语言创建者Grady Booch谈AI的未来
查看>>
TensorFlow学习笔记(3):逻辑回归
查看>>
Mozilla开源了VR框架A-Frame
查看>>
ChakraCore现在可以在Linux和Mac OS上运行了
查看>>
30万奖金!还带你奔赴加拿大相约KDD!?阿里聚安全算法挑战赛带你飞起!
查看>>
InfoQ宣布成立CNUT容器技术俱乐部 欲连接中国容器社区
查看>>