R語言混萝,循環(huán):錯誤控制 異常控制

在R中萍恕,循環(huán)如果出錯逸嘀,程序就會被kill掉。對于計算開銷較大的循環(huán)來說雄坪,這樣的錯誤是難以忍受的厘熟。

  • 一種方法是逐步地debug,針對所有的情況都能提供處理方案维哈,但是很費心費力绳姨;
  • 一種方法是使用錯誤 異常控制函數(shù)阔挠,把錯誤跳過 或者說飘庄,提升對錯誤的容忍能力,即容錯性购撼。

針對第二種方法跪削,有try tryCatch等函數(shù)。網(wǎng)上雖然教程較少迂求,但是也能學(xué)個大概碾盐。最不濟,看R 幫助文件也是可以的揩局。本文毫玖,主要是記錄我遇到的問題和解決的方法。

問題背景

使用爬蟲爬取表格。該表格結(jié)構(gòu)簡單付枫,不涉及到動態(tài)網(wǎng)頁相關(guān)知識烹玉。問題就在于內(nèi)容較大,每頁有500行阐滩,有7000+頁二打。

  • 網(wǎng)頁結(jié)構(gòu):靜態(tài)網(wǎng)頁
  • url結(jié)構(gòu):有規(guī)律
  • 網(wǎng)絡(luò)狀態(tài):較差,難以次次連接成功
  • 出現(xiàn)的問題:連接不上(報錯)掂榔,連接超時(不報錯继效,但是爬蟲卡死了)

由于代碼涉及到項目,所以具體細(xì)節(jié)不能公開衅疙。這里只是說明類似的問題和提供解決的思路莲趣。

代碼撰寫

略,下文使用expr1代表出現(xiàn)問題的代碼塊饱溢,其他expr\\d表示用于處理該過程的代碼塊喧伞。

錯誤控制

  • 針對爬蟲連接網(wǎng)頁失敗,報錯并打斷進(jìn)程的問題
  • 使用的R基礎(chǔ)包中的函數(shù) tryCatch
tryCatch(
  expr1, 
  error=function(e){
    expr2
  },finnally = {
    expr3
  }
)
  • tryCatch的思路是
    • run expr1
    • if expr1 is error, doing expr2
    • finnally, weather expr1 error or not, doing expr3
  • 我的代碼與下面類似:
while(i != m+1){
  tryCatch(
     {
        expr1 # expr1是爬取網(wǎng)絡(luò)的代碼塊 绩郎,所以會遇到連接失敗的error
        i = i+1 # 如果expr1有error潘鲫,則該語句不會運行,因而下一次循環(huán)使用的還是本次循環(huán)的i值
      }, error = function(e){
          cat("Sleeping for net connection agian at i = ", i, "\n")
          Sys.sleep(10) # sleep 10s肋杖,而后重復(fù)發(fā)生了錯誤的那個i
      }, finnaly = {
    expr3 #是啥都行溉仑。我用來輸出循環(huán)信息
      }
   )
}

異常控制

  • 針對連接超時状植,導(dǎo)致循環(huán)停滯浊竟,爬蟲卡死的問題
  • 使用R.utils包的withTimeout函數(shù)
  • 我的代碼類似于:
while(i != m+1){
  tryCatch(
    {
      R.utils::withTimeout(
        expr1,
        timeout = 60
      )
       i = i+1
    }, TimeoutException = function(ex){
        message("Times out! Now refresh it") # 輸出提示信息。但是事實上Timeout函數(shù)已經(jīng)終止了expr1津畸,并開始下一次循環(huán)(i值不變)
    }, error = function(e){
        cat("Sleeping for net connection agian at i = ", i, "\n")
        Sys.sleep(10) # sleep 10s振定,而后重復(fù)發(fā)生了錯誤的那個i
    }, finnaly = {
        expr3 #是啥都行。我用來輸出循環(huán)信息
    }
  )
}

感悟

爬取數(shù)據(jù)肉拓,雖然是爬后频,但是卻是比手動復(fù)制粘貼優(yōu)雅一千倍的貴族運動。電腦隨便爬去吧暖途,這邊看會兒生信技能樹卑惜、生信星球的推文或者去峽谷里維護(hù)一下正義,難道不香嗎驻售???

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末露久,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子欺栗,更是在濱河造成了極大的恐慌抱环,老刑警劉巖壳快,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異镇草,居然都是意外死亡,警方通過查閱死者的電腦和手機瘤旨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門梯啤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人存哲,你說我怎么就攤上這事因宇。” “怎么了祟偷?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵察滑,是天一觀的道長。 經(jīng)常有香客問我修肠,道長贺辰,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任嵌施,我火速辦了婚禮饲化,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘吗伤。我一直安慰自己吃靠,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布足淆。 她就那樣靜靜地躺著巢块,像睡著了一般。 火紅的嫁衣襯著肌膚如雪巧号。 梳的紋絲不亂的頭發(fā)上族奢,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天,我揣著相機與錄音裂逐,去河邊找鬼歹鱼。 笑死,一個胖子當(dāng)著我的面吹牛卜高,可吹牛的內(nèi)容都是我干的弥姻。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼掺涛,長吁一口氣:“原來是場噩夢啊……” “哼庭敦!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起薪缆,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤秧廉,失蹤者是張志新(化名)和其女友劉穎伞广,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體疼电,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡嚼锄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了蔽豺。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片区丑。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖修陡,靈堂內(nèi)的尸體忽然破棺而出沧侥,到底是詐尸還是另有隱情,我是刑警寧澤魄鸦,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布宴杀,位于F島的核電站,受9級特大地震影響拾因,放射性物質(zhì)發(fā)生泄漏旺罢。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一盾致、第九天 我趴在偏房一處隱蔽的房頂上張望主经。 院中可真熱鬧,春花似錦庭惜、人聲如沸罩驻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽惠遏。三九已至,卻和暖如春骏啰,著一層夾襖步出監(jiān)牢的瞬間节吮,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工判耕, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留透绩,地道東北人。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓壁熄,卻偏偏與公主長得像帚豪,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子草丧,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,877評論 2 345