python爬虫程序自动结束-在linux下python爬虫进程发生异常时自动重启直至正常结束的方法...
之前在做爬蟲的時(shí)候遇到一種情況,當(dāng)網(wǎng)絡(luò)情況不太好的時(shí)候,爬蟲爬到的鏈接在urlopen時(shí)會(huì)因?yàn)闊o法正常連接而報(bào)URLError或者timeout的錯(cuò)誤導(dǎo)致陳序報(bào)錯(cuò)而終止;但是這些錯(cuò)誤在重新運(yùn)行陳序后能夠解決,因此為了避免重復(fù)手動(dòng)重啟程序的麻煩,就想寫腳本來自動(dòng)重啟。
思路很簡(jiǎn)單:
1.首先腳本檢測(cè)目標(biāo)程序是否在運(yùn)行。這里我們可以用pidof的返回值來判斷。
2.如果腳本檢測(cè)到程序尚未運(yùn)行或程序運(yùn)行出錯(cuò),重啟程序。這里需要用到linux的$?變量,該變量能返回上一次命令的運(yùn)行狀態(tài)。其中0為運(yùn)行正常,其他均為運(yùn)行報(bào)錯(cuò)。
3.如果程序正常運(yùn)行結(jié)束,終止腳本
例如我們要自動(dòng)運(yùn)行名為web_crawler.py的腳本,那么可以寫如下shell腳本:
#! /bin/bash
pidof web_crawler.py # 檢測(cè)程序是否運(yùn)行
while [ $? -ne 0 ] # 判斷程序上次運(yùn)行是否正常結(jié)束
do
echo "Process exits with errors! Restarting!"
python web_crawler.py #重啟程序
done
echo "Process ends!"
PS1: 這只能處理網(wǎng)絡(luò)狀況不良引起連接出錯(cuò)的情況,通過重新嘗試鏈接能夠解決的。如果是遇到了由于網(wǎng)站被墻導(dǎo)致的鏈接錯(cuò)誤,那么這個(gè)做法就很有問題了,因?yàn)闊o論你重復(fù)幾次都無法打開鏈接。這種情況的解決方式要么是翻墻再運(yùn)行爬蟲,那么就是跳過被墻的鏈接——具體操作可以是用re匹配鏈接排除,也可以是用try在連接超時(shí)執(zhí)行跳出操作。例如:
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:這里我們實(shí)際爬的是stanford cs224d上的鏈接然后下載內(nèi)容,由于有些鏈接(pdf文件或者h(yuǎn)tml網(wǎng)頁)不包含文件后綴,保存的時(shí)候會(huì)比較麻煩。但是如果鏈接是網(wǎng)頁的話那么res.headers.getheader("Content-Type") # urllib2或者rq = requests.get(url);r.headers["content-type"] # requests返回內(nèi)容包含"text/html",利用這一點(diǎn)我們就可以識(shí)別出網(wǎng)頁鏈接進(jìn)行保存。
參考:
總結(jié)
以上是生活随笔為你收集整理的python爬虫程序自动结束-在linux下python爬虫进程发生异常时自动重启直至正常结束的方法...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 死囚被处决前的最后一餐 都要求吃些什么?
- 下一篇: linux arp 文件,LINUX 下