python爬虫程序自动结束-在linux下python爬虫进程发生异常时自动重启直至正常结束的方法...

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

思路很简单:

1.首先脚本检测目标程序是否在运行。这里我们可以用pidof的返回值来判断。

2.如果脚本检测到程序尚未运行或程序运行出错,重启程序。这里需要用到linux的$?变量,该变量能返回上一次命令的运行状态。其中0为运行正常,其他均为运行报错。

3.如果程序正常运行结束,终止脚本

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

#! /bin/bash

pidof web_crawler.py # 检测程序是否运行

while [ $? -ne 0 ] # 判断程序上次运行是否正常结束

do

echo "Process exits with errors! Restarting!"

python web_crawler.py #重启程序

done

echo "Process ends!"

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

try:

res = urllib2.urlopen(rq, timeout=10) # use urllib2 package

except urllib2.URLError, e:

print "Timed out to connect to this URL"

return None

except 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",利用这一点我们就可以识别出网页链接进行保存。

参考:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值