99热99这里只有精品6国产,亚洲中文字幕在线天天更新,在线观看亚洲精品国产福利片 ,久久久久综合网

歡迎加入QQ討論群258996829
麥子學(xué)院 頭像
蘋果6袋
6
麥子學(xué)院

Python爬蟲異常和超時問題怎么處理?

發(fā)布時間:2017-02-15 11:56  回復(fù):0  查看:4231   最后回復(fù):2017-02-15 11:56  
python爬蟲 這類型程序典型特征是意外多,無法確保每次請求都是穩(wěn)定的返回統(tǒng)一的結(jié)果,要提高健壯性,能對錯誤數(shù)據(jù)or超時or程序死鎖等都能進行處理,才能確保程序幾個月不停止。本文和大家分享的就是python高度健壯性爬蟲的異常和超時問題相關(guān)內(nèi)容,一起來看看吧。
  一:基礎(chǔ)try&except異常處理
  try&except的語句作用不僅僅是要讓其捕獲異常更重要的是讓其忽略異常,因為爬蟲中的絕大多數(shù)異??赡苤匦抡埱缶筒淮嬖?,因此,發(fā)現(xiàn)異常的時候?qū)⑵淙蝿?wù)隊列進行修復(fù)其實是個最省力的好辦法。
  其次被try包住的語句即使出錯也不會導(dǎo)致整個程序的退出,相信我,你絕對不希望計劃跑一個周末的程序在半夜停止了。
  try:
  pass http://top.jobbole.com/deliver-article/#
  #可能出錯的語句except Exception,e:
  pass
  #保留錯誤的url,留待下次重跑
  print efinally:
  #無論是否處理了異常都繼續(xù)運行
  print time.ctime()
  二:請求函數(shù)的超時處理
  2.1:普通請求:
  2.1.1單請求類型:
  import requests
  requests.get(url,timeout=60)
  2.1.2會話保持類型:
  import requesocks
  session = requesocks.session()
  response = session.get(URL,headers=headers,timeout=10)
  三:selenium+chrome | phantomjs 的超時處理
  2.2.1:selenium+chrome的超時設(shè)置
  官網(wǎng)原文: http://selenium-python.readthedocs.io/waits.html
  顯式等待:、等待某個條件發(fā)生,然后再繼續(xù)進行代碼。
  fromseleniumimportwebdriver
  fromselenium.webdriver.common.byimportBy
  fromselenium.webdriver.support.uiimportWebDriverWait
  fromselenium.webdriver.supportimportexpected_conditionsas EC
  driver = webdriver.Firefox()
  driver.get("http://somedomain/url_that_delays_loading")try:
  element = WebDriverWait(driver, 10).until( #這里修改時間
  EC.presence_of_element_located((By.ID, "myDynamicElement"))
  )finally:
  driver.quit()
  隱式等待:是告訴WebDriver在嘗試查找一個或多個元素(如果它們不是立即可用的)時輪詢DOM一定時間。默認設(shè)置為0,一旦設(shè)置,將為WebDriver對象實例的生命期設(shè)置隱式等待。
  fromseleniumimportwebdriver
  driver = webdriver.Firefox()
  driver.implicitly_wait(10) # seconds
  driver.get("http://somedomain/url_that_delays_loading")
  myDynamicElement = driver.find_element_by_id("myDynamicElement")
  2.2.2:phantomjs的超時設(shè)置
  這里使用不帶selenium的phantomjs,需要使用js。主要設(shè)置語句是
  page.settings.resourceTimeout = 5000; // 等待5秒
  var system = require('system');var args = system.args;var url = args[1];var page = require('webpage').create();
  page.settings.resourceTimeout = 5000; // 等待5秒
  page.onResourceTimeout = function(e) {console.log(e.errorCode); //打印錯誤碼console.log(e.errorString);//打印錯誤語句console.log(e.url); //打印錯誤url
  phantom.exit(1);
  };
  page.open(url, function(status) {if(status==='success'){var html=page.evaluate(function(){
  returndocument.documentElement.outerHTML;
  });console.log(html);
  }
  phantom.exit();
  });//$phantomjs xx.js  http://bbs.pcbaby.com.cn/topic-2149414.html
  四:自定義函數(shù)的死鎖or超時處理
  這個非常重要?。?/span>
  python是順序執(zhí)行的,但是如果下一句話可能導(dǎo)致死鎖(比如一個while(1))那么如何強制讓他超時呢?他本身如果沒有帶有超時設(shè)置的話,就要自己運行信號(import signal)來處理
  #coding:utf-8import timeimport signal
  def test(i):
  time.sleep(0.999)#模擬超時的情況
  print "%d within time"%(i)
  return i
  def fuc_time(time_out):
  # 此為函數(shù)超時控制,替換下面的test函數(shù)為可能出現(xiàn)未知錯誤死鎖的函數(shù)
  def handler(signum, frame):
  raise AssertionError
  try:
  signal.signal(signal.SIGALRM, handler)
  signal.alarm(time_out)#time_out為超時時間
  temp = test(1) #函數(shù)設(shè)置部分,如果未超時則正常返回數(shù)據(jù),
  return temp
  except AssertionError:
  print "%d timeout"%(i)# 超時則報錯
  if __name__ == '__main__':
  for i in range(1,10):
  fuc_time(1)
  五:自定義線程的死鎖or超時處理
  在某個程序中一方面不適合使用selenium+phantomjs的方式(要實現(xiàn)的功能比較難不適合)因為只能用原生的phantomjs,但是這個問題他本身在極端情況下也有可能停止(在超時設(shè)置之前因為某些錯誤)
  那么最佳方案就是用python單獨開一個線程(進程)調(diào)用原生phantomjs,然后對這個線程進程進行超時控制。
  這里用ping這個命令先做測試,
  import subprocessfrom threading import Timerimport time
  kill = lambda process: process.kill()
  cmd = ["ping", "www.google.com"]
  ping = subprocess.Popen(
  cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
  my_timer = Timer(5, kill, [ping])#這里設(shè)定時間,和命令try:
  my_timer.start()#啟用
  stdout, stderr = ping.communicate()#獲得輸出
  #print stderr
  print time.ctime()finally:
  print time.ctime()
  my_timer.cancel()
  六:自重啟的程序設(shè)計
  比如程序在某種情況下報錯多次,,那么滿足條件后,讓其重啟即可解決大多數(shù)問題,當然這只不過是治標不治本而已,如果這個程序重啟沒有大問題(例如讀隊列類型)那么自重啟這是最省力的方式之一。
  import timeimport sysimport osdef restart_program():
  python = sys.executable
  os.execl(python, python, * sys.argv)
  if __name__ == "__main__":
  print 'start...'
  print u"3秒后,程序?qū)⒔Y(jié)束...".encode("utf8")
  time.sleep(3)
  restart_program()

來源:伯樂在線
您還未登錄,請先登錄

熱門帖子

最新帖子

?