之前在做爬虫的时候遇到一种情况,当网络情况不太好的时候,爬虫爬到的链接在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",利用这一点我们就可以识别出网页链接进行保存。

参考:

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

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

    在linux下python爬虫进程发生异常时自动重启直至正常结束的方法 参考文章: (1)在linux下python爬虫进程发生异常时自动重启直至正常结束的方法 (2)https://www.cnbl ...

  2. linux 父子进程结束,Linux下让父进程结束后,子进程自动结束

    在多进程编程的时候,经常会遇到这样的情况.父进程创建了一堆子进程,当遇到错误或者操作失误的时候把父进程关闭了,但是子进程还在跑,不得不一个一个地杀死子进程,或者使用ps,grep,awk,kill来配 ...

  3. Linux下Python脚本自启动与定时任务详解

    这篇文章主要给大家介绍了关于Linux下Python脚本自启动与定时任务的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用python具有一定的参考学习价值. 前言 最近同事问了一个关于P ...

  4. python脚本自动运行失败_Linux下Python脚本自启动和定时启动的详细步骤

    一.Python开机自动运行 假如Python自启动脚本为 auto.py .那么用root权限编辑以下文件: sudo vim /etc/rc.local 如果没有 rc.local 请看 这篇文章 ...

  5. Linux下python安装升级详细步骤 | Python2 升级 Python3

    Linux下python升级步骤  Python2 ->Python3 多数情况下,系统自动的Python版本是2.x 或者yum直接安装的也是2.x 但是,现在多数情况下建议使用3.x 那么如 ...

  6. libmysqld_dev linux,Linux下python玩转MySQLdb

    (0)目录 Linux下python玩转MySQLdb 一:起因 (1)Linux下安装python的第三方模块 ---- MySQLdb,自己走了很多弯路,在此做一下总结,希望对于像我一样的初学者有 ...

  7. Linux下python的命令,linux下python相关命令

    若本机已安装python2,尽量不要动现有的python2,额外安装python3即可. 1.安装python3.6(centos下安装python3自带pip和setuptools) # 安装依赖环 ...

  8. linux下python退出命令_Linux 下 Python按任意键退出方法

    某天在群内有同学问到,在python下我用input或者raw_input都得输入完后回车才能获取到输入的值,那如何实现任意键退出暂停等功能呢,我当时也没有多想,因为接触python时间也不算长,主要 ...

  9. linux下载哪个python版本-修改linux下python的默认版本

    linux下python版本默认为python2.7,下面将通过操作在linux系统下修改python的默认版本. 本文linux系统使用的是ubuntu19. 操作: 1.在shell下输入pyth ...

最新文章

  1. 紧急更新下降难度,《王者荣耀》绝悟 AI 难倒一片玩家
  2. s7edge出现android停止,三星S7 Edge升级安卓7.0出现了这个问题!
  3. Json模块dumps、loads、dump、load函数介绍
  4. 区块链基础设施纵览:基本框架原则——揭示存储、计算和通信元素
  5. 做领导应该注意的几个问题
  6. Spring 5 新特性:函数式Web框架
  7. HDU - 4292 Food(最大流+思维建边)
  8. UWP x:bind
  9. KDD走进阿里 数百专家聚集探讨产学研一体化
  10. java console输出_将java console的输出写入文件
  11. layui table数据修改的回显
  12. 安装centos后 启动mysqld显示mysqld: 未被识别的服务 解决方法
  13. 美国专家声讨物联网安全 面对攻击如纸糊
  14. 一分钟搞懂 分布式与集群
  15. 如何给REED3阅读器都opml文件
  16. 国内外sns源码搜集
  17. 华为P30 HL2ELLEM VER.A手机图纸
  18. DelayQueue
  19. 第11章 枚举与泛型
  20. 问题解决:nvcc fatal : Unsupported gpu architecture ‘compute_75‘

热门文章

  1. 1065. 单身狗(25)
  2. 七夕秀恩爱新姿势!这波操作我给十分!
  3. java 构造器(constructor)
  4. 潭州课堂25班:Ph201805201 爬虫基础 第九课 图像处理- PIL (课堂笔记)
  5. UVA 1645 - Count(简单DP)
  6. Codeforces Good Bye 2015 A. New Year and Days 水题
  7. 随机交换检验数据挖掘结果-assessing data mining result via swap randomization
  8. 《C#本质论》读书笔记(十二)构造器 @ Lennon
  9. [剑指offer][JAVA]面试题第[05]题[替换空格][StringBuilder/Buffer]
  10. POJ-3624 Charm Bracelet dp