【爬蟲】(七)Python資料儲存之MySQL(下)

weixin_33758863發表於2017-06-06

date: 2017-02-28 18:44:10

上一篇關於Python和MySQL的簡單聯調做了學習。
這次主要是將這個過程再優化擴大點。
對教務處需要的資料都進行了處理存進資料庫了。
也是對bug問題的總結。

我的程式設計哲學

其實這裡面一直有一個問題的。
之前是Holi的後臺一直想要我們把資料存成CSV格式的他再讀取存進資料庫。
可是這件事情在Python這邊就可以完成啊。

後面就還是用著這樣的想法去做: 從CSV檔案裡讀取存進MySQL。
最直接的方法應該是:一步到位直接存進MySQL。

但是我還是認為,先把這個功能實現了才是最重要的。
其他的後面可以慢慢改。

這大概也就是Python的程式設計思想,著重於解決問題,而不是拘泥於語言語法。

圖形化MySQL

有同學給我推薦了兩款Navicat和SQLyog。
有另外一個隊友也在用SQLyog,我就選它了。
確實是比命令列好用多了。
也不容易出問題。

在一個資料庫裡建了學生資訊表,成績表,課表,公告通知表,我的訊息表。
剩下的問題就是從CSV檔案裡讀取並存進MySQL。

CSV To MySQL

與上一篇一樣,整體思路是先把爬下來的資料給寫入col列,然後把爬下來的資料依行插入。

writer.writerow(('上課學期','課程編號','課程名稱','課程學分','學位課' ,'成績','獲得學分','備註'))

insert的資料就和在SQLyog建好表匹配。

sql = "insert into `score`(`term`,`course_id`,`name`,`credit`,`degree_course`,`score`,`gain_credit`,`remarks`)values(%s,%s,%s,%s,%s,%s,%s,%s)"

之前存進的CSV檔案有空格的問題也解決了。
有函式strip()、rstrip()、lstrip()可以解決這個問題。

cursor.execute(sql, (
                    e['上課學期'].strip(), e['課程編號'].strip(),e['課程名稱'].strip(), e['課程學分'].strip(), e['學位課'].strip(), e['成績'].strip(),e['獲得學分'].strip(), e['備註'].strip(),))

其實,規則的網頁還是比較好處理的。
而不規則的網頁處理起來還得多想想。tr、td、th、li標籤分配的很奇怪。
比如我的訊息這一頁面是這樣處理的:

    try:
            for row in rows:
                csvRow = []
                for td in row.findAll('td')[1:]:
                    for li in td.findAll('li')[0::2]:
                        csvRow.append(li.get_text().strip().replace(' ', ''))
                    writer.writerow(csvRow)
        finally:
            csvFile.close()

它的網頁原始碼第一個td裡面都是沒用的,到後面的li標籤甚至要取奇數,因為它只有三個,而第二個是空的。
總之,花了點時間完美的存進去了。
也算是體會到正則的強大和我還不會。

最後的幾張表還是很規則的。

學生資訊:

2847713-667512b212519597.jpg

課表:

2847713-eee98e67c7016488.jpg

成績:

2847713-541c70fa5062ab85.jpg

培養計劃:

2847713-74c79d62bb23df8d.jpg

公告通知:

2847713-e016aeaf1d975a6b.jpg

bug總結

KeyError:

這是在把CSV檔案存進MySQL裡出現的錯誤。
研究了好久把col列寫對著啊,字典怎麼會出錯。
事實證明人變懶就會出錯。

模擬登入用的是同一個程式,在同一個程式的基礎上改。
開啟的CSV檔案卻沒有改過來,字典必然不會對。。。低階錯誤。

blank error:

之前的Python前輩們都會把Python縮排當成一個梗來玩。
可是當程式多了起來,這就真的很容易犯錯。

除了這個問題,在for迴圈裡也很容易出錯。
它也沒有明顯的標示,全憑感覺。
就是我覺得它應該是縮排了吧,其實還差好多。
我覺得我需要一把遊標卡尺來解決這個bug.

相關文章