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

参考:

  1. http://stackoverflow.com/questions/18883086/check-if-the-page-is-html-page-in-python
  2. http://stackoverflow.com/questions/20162678/linux-script-to-check-if-process-is-running-act-on-the-result
  3. http://stackoverflow.com/questions/90418/exit-shell-script-based-on-process-exit-code
  4. http://stackoverflow.com/questions/16778435/python-check-if-website-exists

在linux下python爬虫进程发生异常时自动重启直至正常结束的方法的更多相关文章

  1. java调用Linux执行Python爬虫,并将数据存储到elasticsearch--(环境脚本搭建)

    java调用Linux执行Python爬虫,并将数据存储到elasticsearch中 一.以下博客代码使用的开发工具及环境如下: 1.idea: 2.jdk:1.8 3.elasticsearch: ...

  2. Linux下查看某个进程打开的文件数-losf工具常用参数介绍

    Linux下查看某个进程打开的文件数-losf工具常用参数介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在linux操作系统中,一切皆文件.通过文件不仅仅可以访问常规数据,还 ...

  3. linux下实现监控进程网络带宽

    嗯,近期都在网易游戏实习,所以貌似有段时间没有上来写点东西了... 来网易游戏实习最基本的目的事实上就是想知道在游戏公司里面工作都是些什么内容,毕竟自己曾经也没有接触过游戏公司.. 还比較的好奇.. ...

  4. Linux下Python 文件内容替换脚本

    Linux下Python 文件替换脚本 import sys,os if len(sys.argv)<=4: old_text,new_text = sys.argv[1],sys.argv[2 ...

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

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

  6. windows和linux下关闭Tomcat进程

    windows和linux下解决Tomcat进程 windows下启动Tomcat报错,8080端口号被占用,报错信息如下 两种解决方法,一种是关闭了这个端口号,另外一种是修改Tomcat下的serv ...

  7. Linux 安装python爬虫框架 scrapy

    Linux 安装python爬虫框架 scrapy http://scrapy.org/ Scrapy是python最好用的一个爬虫框架.要求: python2.7.x. 1. Ubuntu14.04 ...

  8. Linux下分析某个进程CPU占用率高的原因

      Linux下分析某个进程CPU占用率高的原因 通过top命令找出消耗资源高的线程id,利用strace命令查看该线程所有系统调用  1.top 查到占用cpu高的进程pid 2.查看该pid的线程 ...

  9. 解决linux下tomcat停止进程任存在问题

    解决linux下tomcat停止进程任存在问题 在Linux下(之所以强调linux下,是因为在windows下正常),执行tomcat ./shutdown.sh 后,虽然tomcat服务不能正常访 ...

随机推荐

  1. selenium浏览器操作

    在元素定位中xpath使用的还算比较多,介绍一下常见的firfox和chrome浏览器插件安装 一.浏览器定位工具安装 1.firfox firfox比较简单,主要浏览器自带的定位功能也比较强大国内也 ...

  2. .net架构设计读书笔记--第三章 第8节 域模型简介(Introducing Domain Model)

    一.数据--行为转变     很长的时间,典型的分析方法或多或少是以下两种,第一,收集需求并做一些分析,找出有关实体 (例如,客户. 订单. 产品) 和进程来实现. 第二,手持这种理解你尝试推断一个物 ...

  3. Hibernate 、继承关联映射

    一个继承树一张表(subclass) 一个继承树一张表是指将一个类和他下面的所有派生类的所有的属性都放在一张表中,举例有Employee这个实体,在他下面分别派生了两个类skill和sell,通过Hi ...

  4. Java Object 构造方法的执行顺序

    Java Object 构造方法的执行顺序 @author ixenos 为了使用类而做的准备工作包括三个步骤 1)加载:类加载器查找字节码(一般在classpath中找),从字节码创建一个Class ...

  5. delphi下实现控制其它窗体中的控件代码模板(delphi 7安装程序)

    unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...

  6. 深入理解HashMap的扩容机制

    什么时候扩容: 网上总结的会有很多,但大多都总结的不够完整或者不够准确.大多数可能值说了满足我下面条件一的情况. 扩容必须满足两个条件: 1. 存放新值的时候当前已有元素的个数必须大于等于阈值 2. ...

  7. springboot2.0(一):【重磅】Spring Boot 2.0权威发布

    就在昨天Spring Boot2.0.0.RELEASE正式发布,今天早上在发布Spring Boot2.0的时候还出现一个小插曲,将Spring Boot2.0同步到Maven仓库的时候出现了错误, ...

  8. U-Boot Makefile分析(3) rules.mk分析

    浏览各个子Makefile可以发现,他们都会在文件的后面包含rules.mk,这个文件的作用就是更新源文件的依赖,并生成各种.depend文件. _depend: $(obj).depend # Sp ...

  9. 安装snap及snap常安装软件

    文章链接:https://blog.csdn.net/laomd/article/details/80710451 一.snap简介 什么是snap,snap是一种全新的软件包管理方式,它类似一个容器 ...

  10. 小程序要求的 TLS 版本必须大于等于 1.2

    1.打开windows powershell   右击屏幕左下角的开始->所有程序->附件->“Windows PowerShell”.     2.在 PowerShell中运行以 ...