1. 程式人生 > 其它 >20203114 實驗四《Python程式設計》實驗報告

20203114 實驗四《Python程式設計》實驗報告

學號 20203114 《Python程式設計》實驗四報告

課程:《Python程式設計》
班級: 2031
姓名: 張晨曦
學號:20203114
實驗教師:王志強
實驗日期:2020年5月19日
必修/選修: 公選課

1.實驗內容

(1)Python綜合應用:爬蟲、資料處理、視覺化、機器學習、神經網路、遊戲、網路安全等。
注:在華為ECS伺服器(OpenOuler系統)和物理機(Windows/Linux系統)上使用VIM、PDB、IDLE、Pycharm等工具程式設計實現。
(2)python包含許多方面的知識,功能強大。關於程式語言的基本知識及邏輯思維,在C語言學習、計算機實習的過程中基本熟練。但對於python特有的其他功能,如爬蟲、資料視覺化等,都是初步接觸,所以我希望通過本次實驗,可以對python的獨特功能有進一步瞭解。
本次實驗,我運用爬蟲爬取噹噹網好評圖書榜的圖書資訊,並運用python的matplotlib模組對爬取的資料進行視覺化分析。

2.實驗過程及結果

(1)實驗過程

爬蟲步驟清晰明確,基本包括三個部分,爬取資料、資料清洗分割及資料儲存。資料視覺化我在這裡也將其分為三部分,匯入資料、呼叫相應方法並將資料填入相應引數部位、按需求對圖形其他引數進行設定。
1)對於該實驗,爬蟲部分整體框架:
baseurl = 'http://bang.dangdang.com/books/fivestars/01.00.00.00.00.00-recent30-0-0-1-' #網頁的baseurl
datalists = getData(baseurl)
saveToexcel('dangdangBOOK.xls', datalists)
①我首先明確要爬取的內容為噹噹網圖書好評榜1-10頁的相關圖書資訊;
②其次,登入相應網站,獲取網站url;

③再次,在程式碼中傳送請求,爬取資料;

點選檢視程式碼
url = baseurl + str(pagenum)    #每一頁的url
html = requests.get(url=url)    #請求資料
④然後,使用bs、re模組進行解析、查詢,篩選資料;
點選檢視程式碼
        bs = BeautifulSoup(html.text, 'html.parser')    #解析
        bs = bs.find('ul', class_='bang_list clearfix bang_list_mode')  #查詢

        for item in bs('li'):

            datalist = []
            findlink = re.compile('<div class="name">.*href="(.*?)"')
            findname = re.compile('<div class="name">.*title="(.*?)"')
            link = re.findall(findlink, str(item))[0]
            name = re.findall(findname, str(item))[0]
            datalist.append(link)
            datalist.append(name)

            findstar = re.compile('<div class="biaosheng">.*<span>(.*?)次</span>')
            stars = re.findall(findstar, str(item))[0]
            datalist.append(stars)

            findinfo = re.compile('<div class="publisher_info">.*title="(.*?)">')
            findinfo1 = re.compile('<div class="publisher_info"><span>.*_blank">(.*?)</a></div>')
            info = re.findall(findinfo, str(item))
            if not info:
                info = 'none'
                datalist.append(info)
            else:
                datalist.append(info[0])
            info1 = re.findall(findinfo1, str(item))[0]
            datalist.append(info1)

            findtime = re.compile('_info"><span>(.*?)<')
            time = re.findall(findtime, str(item))[0]
            datalist.append(time)

            findpprice = re.compile('<p><span class="price_n">¥(.*?)</')
            p_price = re.findall(findpprice, str(item))
            datalist.append(p_price[0])

            datalists.append(datalist)
⑤最後,使用xlwt模組將資料存入excel表格中。
點選檢視程式碼
def saveToexcel(savepath, datalists):       #資料儲存,寫入excel表格
    workbook = xlwt.Workbook(encoding="utf-8")  #建立物件
    worksheet = workbook.add_sheet("噹噹網好評書目", cell_overwrite_ok=True)   #對一個sheet表中同一位置多次編輯會覆蓋寫入不會報錯
    name_sheet = ("作品詳情連結", "作品名", "五星評價人數", "出版資訊", "出版社", "出版時間", "實體書價格")
    for i in range(len(name_sheet)):
        worksheet.write(0, i, name_sheet[i])        #向sheet第1行第i列寫入資料作為表頭

    for i in range(len(datalists)):
        item = datalists[i]                     #讀取第i本書的資訊
        print("正在查第%d條內容" % ((i + 1)))
        for j in range(len(item)):
            worksheet.write(i + 1, j, item[j])              #將第i本書中的資訊逐一寫入相應位置

    workbook.save(savepath) #儲存
2)資料視覺化部分:

①首先,將資料從excel表格中匯入程式碼相應列表;

點選檢視程式碼
excel = load_workbook("dangdangBOOK.xlsx")
sheet = excel["噹噹網好評書目"]                #讀取sheet資訊

#好評書目中各出版社有多少本-柱狀圖
chubanshe = [i.value for i in sheet['e'][1:]]       #將出版社資訊存入該列表
點選檢視程式碼
money = [i.value for i in sheet['g'][1:]]   
②在資料中提取X軸資訊及Y軸資訊,將提取的資料作為引數,並呼叫顯示圖形所需方法;
點選檢視程式碼
chubanshe_xdatas = list(set(chubanshe))             #利用set去除重複出版社,再將其轉為列表
for data in chubanshe_xdatas:           #去掉none的出版社
    if not data:
        chubanshe_xdatas.remove(data)
chubanshe_ydatas = []
for chubanshe_xdata in chubanshe_xdatas:
    chubanshe_ydatas.append(chubanshe.count(chubanshe_xdata))           #用count統計相同出版社出現次數並存入列表chubanshe_ydatas
f, ax = mp.subplots()
x = range(len(chubanshe_ydatas))        #X軸資料
xx = [i for i in chubanshe_xdatas]      #出版社名稱
y = [i for i in chubanshe_ydatas]       #好評圖書中各出版社好評圖書數目
mp.bar(x, y)            #柱狀圖,X為橫軸資料,Y為縱軸資料

點選檢視程式碼
float_money = [float(i) for i in money]         #字串轉浮點型
x_money = range(0, 200, 1)                  #X軸資料
mp.scatter(float_money, x_money)            #散點圖
③標題及標籤設定
點選檢視程式碼
ax.set_xticks(x, xx, rotation=-90)      #自定義X軸資料為XX,旋轉90度
mp.title("出版社圖書數目")     #標題
mp.xlabel("出版社")        #x標籤
mp.ylabel("數量")     #y軸標籤
mp.show()
點選檢視程式碼
mp.ylabel('book_label')                 #Y軸標籤
mp.xlabel('price')          #X軸標籤
mp.title("售價分佈散點圖")         #標題
mp.show()
最後將程式在華為ECS伺服器執行。

實驗結果

(1)下載python模組


(2)執行




3.實驗中遇到的問題及解決過程

·問題1:不知道如何爬取多頁資料
·問題1解決方案:通過百度,瞭解到可利用baseurl,結合迴圈實現多頁資料的爬取。
·問題2:資料視覺化時橫軸及縱軸標籤、標題出現亂碼,顯示為方框
·問題2解決方案:通過百度,發現可以通過臨時重寫配置檔案和重寫配置檔案兩種方法解決。最終通過臨時重寫配置檔案解決該問題。
·問題3:資料視覺化時,不知道如何將X軸上的資料換為自定義的文字
·問題3解決方案:通過查閱資料,發現通過set_xticks方法可以實現座標軸自定義,包括替換為其他字元,旋轉字元角度等。
·問題4:繪製散點圖時,發現Y軸資料混亂,未按照大小順序排列
·問題4解決方案:通過與matplotlib教程中正常顯示的散點圖程式對比,發現Y軸引數傳入的為字串,不是數值;通過型別轉換,將字串轉為整型;後系統仍報錯,顯示int型資料無效;通過百度,將其設定為浮點型,問題得到解決。
·問題5:在ECS伺服器執行時,報錯顯示:SyntaxError: Non-ASCII character '\xe8'
·問題5解決方案:通過百度,發現問題為無法解析為中文,在程式碼頭加上# -- coding: utf-8 --後問題得到解決

課程總結

(1)心得體會
這學期的python課程告一段落,時間雖短暫,但在老師充滿趣味性的講解中,從課程概述,基礎語法,流程控制語句中的while、if、for語句,序列中的列表、字典、元組,字串、正則表示式、函式、面向物件的類及其相關操作,檔案操作異常及處理,資料庫,socket,最後到爬蟲,老師將知識儘可能涉及到,學到的知識確是許多。
從第一堂課,老師對於課程的概述,使我對於python有了初步瞭解,但對於爬蟲、web等的認識還不明瞭;同時,老師用簡短程式為我們展示的python世界有趣且生動,極大激發了我的學習興趣,促使著我進一步學習。
在基礎語法及流程控制語句學習過程中,我發現python與C語言部分相似、部分區別,這有助於我們快速吸收理解,但也要注意區分。它們整體的框架是相似的,但具體的使用確是區別的。比如python不需要宣告變數型別,python的if語句要加冒號,通過縮排辨別是否在if語句內,諸如此類等等。因此這個階段我每學習一個知識點都要將python與C進行對比,以免將二者記混或是忘記C的使用方法,但其實在後期運用還是會出現問題,最明顯的便是在C語言中總是將printf輸為print,所以要注意二者區別及練習。
在序列、字串、函式及檔案操作的學習中,結合C語言的知識對其進行理解,可以很快掌握相關知識。在運用中,它們的使用也是及其廣泛的。序列可以用來儲存資料,字串及檔案的相關操作不可或缺,函式的使用可以使程式碼更為清晰明瞭。
在正則表示式的學習中,這可以說是學python以來的第一個較為陌生的知識點,也是一個全新的知識點。它實質上是一種字串匹配的模式,對字串進行操作,譬如查詢,替換等。在此次實驗中,我使用了正則表示式完成所需資訊的查詢工作。
面向物件的類及其相關操作,是python的一大特點,包括封裝、繼承、多型三要素。
檔案操作異常處理中,瞭解瞭如何對程式中的錯誤進行處理,同時老師還介紹了他的獨門絕技,表示很受用。
通過資料庫的學習,對相關模組有了一定了解。
通過socket的學習,瞭解了其工作原理與程式編寫基本方法;同時體驗到了python的互動性;對於後續計算機網路中相關內容的學習也很有幫助。
學習爬蟲,對爬蟲這個詞彙有了具象化了解,瞭解了具體操作步驟及相關模組。它的可操作性強,較為容易上手,爬到資料後令我很有成就感(除了總是擔心爬了不能爬的網站)對python也更加感興趣。
截止到現在,我學習了C語言及python兩種軟體程式語言,初步感覺,程式語言編寫需要極強的思維性與創造性。同時,學習程式設計需要勤加練習,學會和會使用永遠不能等同。對於python,我最苦惱的是各種模組及方法的呼叫,但是對相關模組及方法有了初步瞭解後,再使用百度基本可以解決該問題。現在各種專案都需要python的支援,其應用十分廣泛,由此可見,平時看到的廣告也不是空穴來風。未來,我會繼續學習python,並深入學習python。
(2)意見建議
建議老師基礎語法部分的講解簡略一些,可以分多一點時間給後續資料庫、資料視覺化等部分。基礎語法的部分對於大二大三很好理解,對於大一而言也在C語言課程中同步學習,我個人認為可以簡略一些講,使大家基本瞭解;從而可以讓大家多涉獵一些其他部分的知識。
整體而言,老師的課程質量很高,知識點講解使用文字展示、課程幽默風趣、知識點結合例項講解、知識點講解齊全,同時課後同我們分享各種python知識,為我指明方向。
在此特別感謝一學期以來王老師的指導!

參考資料

[http://c.biancheng.net/matplotlib/9284.html]
[https://blog.csdn.net/Fortware/article/details/51934814?ops_request_misc=&request_id=&biz_id=102&utm_term=python pyplotx軸怎麼設定成文字]
[https://www.bilibili.com/video/BV1jT4y1d7kU?spm_id_from=333.337.search-card.all.click]