iT邦幫忙

0

python抓網頁data,及做圖表之十六:連線的異常,URLError

  • 分享至 

  • xImage
  •  

只有退潮時,你才知道誰在裸泳。
投資的密訣的是:別人「恐懼」時「貪婪」,別人「貪婪」時「恐懼」。
股神的經典句子

連線的異常,URLError: <urlopen error [Errno 111] Connection refused>
是深夜(淩晨)很多人不睡覺在抓資料,還是一直抓太多年,觀測站的web server會故意斷線。
這應該是離峰時間,何必設限呢?真相沒人知道,但程式要寫防呆。

想從78年抓到100年,

for k in range(78,101):
    url = 'http://mops.twse.com.tw/mops/web/ajax_t51sb02?'\
            'encodeURIComponent=1&step=1&firstin=1&off=1&TYPEK=sii&year='+str(k)
    response = urllib.request.urlopen(url)

...........................................
 c.execute('INSERT INTO fny VALUES (?,?,? ,?,?,?,?,?, ?,?,?,?,?, ?,?,?,?,?, ?,?,?,?,? )', stk)
    
conn.commit()

每抓一年,秀那年,
78
79
80
81
82,
然後**,URLError: <urlopen error [Errno 111] Connection refused>**
那,那…,到底commit了沒有,希望它沒commit。
結果…

for row in  c.execute('select yr,cpyname,r12,r13 from fny where between 78 and 82   '): #and r12>=20 and r13>=25 yr =83
    print(row)

output:
(78.0, '新纖', 4.22, 4.04)
(78.0, '利華羊毛', 1.17, 0.92)
(78.0, '福懋興業', 15.47, 21.52)
(78.0, '大宇紡織', 5.54, 8.85)
(78.0, '年興紡織', 9.78, 26.22)
(78.0, '宏益', 5.65, 7.72)
(78.0, '國化', 9.17, 10.12)
(78.0, '和桐化學', 12.74, 23.09)
(78.0, '中鴻', 22.9, 59.1)
(78.0, '華通', 14.86, 20.58)
(78.0, '國揚實業', 12.09, 6.7)
(78.0, '龍邦國際', 4.04, 27.51)
(79.0, '台泥', 13.08, 17.53)
(79.0, '亞泥', 12.13, 15.2) 

題外話,78年,只有12家上市公司。

commit了,所以ERROR,導致中斷,沒進回圈,但筆者的commit是寫在迴圈外,所以還是commit了。

老師上課有教,要防exception, error, 都沒有聽。
剛好過一半,才發生,上回做批次沒error中斷。

該怎麼寫呢??

對urlopen error, 還是任何error都要rollback呢?

題外話:筆者隨後又測了range(83,101):
想看看這個異常是否能重覆產生,結果沒發生了,
果然是不可預期的異常,想要它定時產生,還不容易。

試著加上 try ... except,在異常發生後,還原(rollback)

for k in range(83,101):
    url = 'http://mops.twse.com.tw/mops/web/ajax_t51sb02?'\
        'encodeURIComponent=1&step=1&firstin=1&off=1&TYPEK=sii&year='+str(k)
     try:
        
        response = urllib.request.urlopen(url)
 
..................................................
    except URLError:
        conn.rollback()
        break #sys.exit("異常發生了")
        
conn.commit()

這段是參照http://docs.python.org/3/tutorial/errors.html官網的文件寫的。如果不是URL連線異常的error怎麼辦呢?
官網有寫到

except:
    print("非預期的錯誤Unexpected error:", sys.exc_info()[0])
    raise

讀寫檔案,也有常見的IOError: [Errno 2] No such file or directory: '/home/timloo/stock/month/2013_3149.csv'
筆者之前遇過,當除錯的訊息用(沒有補捉來做處理)

好久沒畫圖了!


圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言