之前在做爬虫的时候遇到一种情况,当网络情况不太好的时候,爬虫爬到的链接在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

最新文章

  1. EF – 3.EF数据查询基础(下)数据关联
  2. 同步推是如何给未越狱的IOS设备安装任意IPA的?
  3. RS-232-C串口通讯协议解析(硬件接口协议)
  4. Apache htaccess 重写假设文件存在!
  5. SilkTest高级进阶系列8 – 放下榔头,立地成佛
  6. myeclipse 那个版本号好用?
  7. python 中调用shell命令
  8. MFC使用SQLite 学习系列 一: SQLITE_MISUSE错误
  9. Maven入门2-pom.xml文件与settings.xml文件
  10. js_6_dom选择
  11. 开发部署项目时出现:java.lang.OutOfMemoryError: PermGen space
  12. 腾讯云 网站开启HTTPS
  13. d3.select(this)不能用箭头函数
  14. "软件"和"软件工程"一词最早被谁提出?
  15. oj2894(贝尔曼福特模板)
  16. AndroidStudio更改包名
  17. 【Android】3.9 覆盖物功能
  18. Markdown分级语法手册
  19. iOS 计算某个月的天数 计算某天的星期
  20. PLSQL Developer备份恢复oracle数据

热门文章

  1. php常用加密算法
  2. [强连通分量] POJ 1236 Network of Schools
  3. Rhel6-cacti+nagios+ganglia(apache)配置文档
  4. [vijos P1180] 选课
  5. 用qpython3写一个最简单的发送短信的程序
  6. <input type="file">中怎设置那个按钮的样式
  7. disconnected no supported authentication methods available(server sent: publickey,keyboard interae)
  8. javaEE(web)SEO优化 Yahoo军规
  9. OD调试篇11
  10. Android快捷便利但不常被使用的原生工具类