20182109 實驗四《Python程序設計》實驗報告


20182109 2019-2020-2 《Python程序設計》實驗四報告

課程:《Python程序設計》
班級: 1821
姓名: 盧鍾添
學號:20182109
實驗教師:王志強
實驗日期:2020年5月26日
必修/選修: 公選課

1. 實驗內容

  • Python綜合應用:爬蟲、數據處理、可視化、機器學習、神經網絡、游戲、網絡安全等。

2. 實驗過程及結果

最后一次的綜合性實踐,我選擇將requests庫,正則表達式,列表的應用,pyecharts庫等結合在一起,實現一個可以從購物網站上爬取商品價格並比價的小程序。

1. 挑選購物網站

眾所周知,各大網站都有針對爬蟲的反爬蟲協議,可以通過在網址后加上robots.txt來查看該網站是否是反爬蟲的。下圖顯示了iTunes官網的反爬蟲協議。

通過查看,我們可以發現,其實各大購物網站上均有諸如此類的反爬蟲協議,但是這並不代表着我們不能編寫爬蟲去爬取網站上商品的信息。事實上,這一類協議是在警告我們,請不要無止境的訪問該網址,對服務器造成不必要的麻煩,但如果我們是以一個正常人的頻率去訪問的話,那完全是允許的。
縱觀各大購物網站之后,我選擇淘寶作為爬取的對象。因為通過查看網頁源碼,我發現,淘寶中商品的名稱和價格排列較為整齊,故更容易用正則表達式提取出來。至於如何提取,我會在報告的后文中具體分析。

2. 分析淘寶的商品搜索頁網址

從下圖可以看到,淘寶的商品搜索頁網址構成接近於https://s.taobao.com/search?q= + 我們要搜索的商品名

為了使該爬蟲更人性化,可以從用戶輸入處得到要搜索的商品名,並通過字符串鏈接的功能得到url。

3. 獲得淘寶商品搜索頁面的html

若某網站沒有反爬蟲協議,那么在已知url的情況下,我們可以通過requests庫自帶的get()函數很輕松地得到html文本。但是淘寶網是帶有反爬蟲協議的網站,所以我們需要在get()函數中添加一個headers變量,這樣,淘寶網會將我們的爬蟲認作是一個正常訪問網頁的人類,便可正確的將商品信息展示給該爬蟲。

headers變量的獲取

以Edge為例,我們用其打開一個網頁,在鍵盤上按下F12后,選擇“網絡”選項。再刷新該頁面,便可以在“請求標頭”下得到headers。復制后將其賦值給代碼中的一個字符串,作為get()函數的第二個參數,這樣就能成功得到html文本文件,用於下面的爬取頁面。

4.爬取頁面

這一部分是整個代碼的核心,即要將商品的名稱和價格爬取出來。如圖,在淘寶搜索頁單擊右鍵->查看網頁源代碼,可以查看我們得到的html文本,

在進入網頁源代碼頁后,為了查看html文本是如何描述商品名稱和價格,我們可以復制商品頁上第一件商品的名稱,並將其作為關鍵字在源代碼頁搜索。可以發現商品的名稱是存放在raw_title變量中,而價格是存放在view_price變量中。如此一分析,有利於我們編寫正則表達式對商品名稱和價格進行提取。

利用正則表達式,我們可以寫出如下的語句,得到plt和tlt這兩個存放所有商品價格和名稱的列表

plt = re.findall(r'\"view_price\"\:\"[\d\.]*\"', html)
tlt = re.findall(r'\"raw_title\"\:\".*?\"', html)

接着進入一個循環,通過split分割函數,把同一商品的名稱和價格分離出來,將其組合成一個列表的形式,存入代表爬取結果的大列表中。循環的次數代表最后顯示的商品數量,可由用戶決定。

5. 顯示商品清單

先通過正則表達式tplt = "{:4}\t{:8}\t{:16}"來建立一個特定的輸出格式,以確保商品清單在輸出時不會參差不齊。
接着便可按照上述格式,遍歷爬取得到的大列表來輸出商品序號、商品價格、商品名稱。

6. 輸出可視化圖表

為實現本程序比價的功能,我還添加了輸出可視化圖表這一功能。在主函數完成顯示輸出商品清單后,顯示提示信息“是否需要生成可視化圖表”。當用戶輸入yes后,可在D盤根目錄下生成一份可視化圖表,打開后顯示的是各商品以價格為數據的柱狀圖,更有利於用戶直觀的進行比價。
同爬取頁面這一部分類似,也是從html文本文件中通過正則表達式提取得到商品的名稱和價格信息,再將其添加進相應的列表中。只不過,由於可視化圖表的大小限制,某一橫坐標的信息在過長時會影響其他橫坐標的顯示,所以在將商品名稱添加進列表時可以將其統一為某一長度。
通過從pyecharts中導入Bar庫,調用其中的函數,即可生成一份可視化圖表,其中部分函數的用法如下。

bar = Bar()  # 生成一個柱狀圖
bar.add_xaxis(tlist)  # 橫坐標上的每一個點是tlist中的數據,注意tlist應為列表
bar.add_yaxis(goods, plist)  # 橫坐標上每一個點的y值是plist里對應位置的數據,注意plist也應為列表,goods代表該數據的圖例名稱
bar.render("D:\***.html")  # 在D盤根目錄下生成可視化圖表文件

7.碼雲鏈接

https://gitee.com/python_programming/Python_2020_lzt/blob/master/compare_price.py

8. 運行結果

下面是在程序中顯示的爬取到的商品列表

下面這張柱狀圖可以方便用戶進行比價

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

  • 問題1:無法調用pyecharts庫中的函數來形成可視化圖表
  • 問題1解決方案:查詢發現自己先前使用的時老版本的pyecharts函數,通過查閱pyecharts作者的網站並理解新版本的函數方法后便可成功創建可視化圖表了。
  • 問題2:使用requests庫時,無法從購物網站上爬取到信息。
  • 問題2解決方案:請教老師之后得知,現在的購物網站大多有反爬蟲協議,所以應該在調用requests函數時加上headers,以標明這是以個人身份訪問該網站的。
  • 問題3:可視化圖表里的商品名稱顯示不完全
  • 問題3解決方案:限定加入商品名稱列表的數據長度,即可適當優化顯示問題

4. 課程感想與體會

總結一下這學期學到的知識,包括但不限於流程控制語句,Python獨有的序列這種變量,字符串與正則表達式,面向對象語言所特有的類和對象,對文件的操作,Socket套接字編程,爬蟲。站在自己的角度,這一學期的學習,讓我對Python這一門語言從有興趣到感興趣。當然我也知道,自己所掌握的些許知識點只能算是皮毛,互聯網時代已然來臨,更多的要靠我們自己去探索,去發現。就像Python這一門語言一樣,身為新時代的人類,要學着適應新環境、新變化,要在奔涌的洪流中進化自己,要試着在某個領域中獨當一面。
從每節課后拖着不完成任務,到課后搶着完成作業,王老師的教學方式起到很大的督促作用。所以說,在課堂上,學生學到的不僅僅是那呆板的教科書式的知識,還有老師教導我們對待事情的態度。不單單局限於課堂上,等我們踏上社會,走入工作崗位時也是一樣,有工作時就應當准時,細心,認真地完成。因為,沒有誰會喜歡那個拖拖拉拉,吊兒郎當的人。
猶記得第一節課時,王老師讓我們寫下對這學期Python課的展望,我言之鑿鑿,情之篤定地寫下了“雖然這學期課挺多的,但還是希望能抽出時間來學習Python”。時間如白馬過隙,轉眼間,伴隨我大半學期的Python課程也迎來了最后一次實驗。回首這一學期的學習,雖然仍有松懈、迷茫的時候,每次在聽到王老師志氣滿滿地給我們授課時,我總能燃起最初的那一份熱情。所以,我也希望今后自己失去動力時,都要想起大二下在家上網課期間的那份堅持。

5. 意見和建議

疫情期間,網課成了學生黨們熱議的話題。在我看來,與線下課程不同的是,網絡課讓我們體會到其實網絡上也有豐富、優質的資源。在課下,學生完全可以提前預習下一節課甚至下多節課的知識點,而老師在課上充當的可以只是一名答疑者,即學生有不懂的問題,再去請教老師。綜上所述,我非常幸運,體驗到了王老師在這學期課程上所做出的創新,也很驚喜的發現,在這樣的新模式下,我能夠培養自己的能力,從而學到更多的知識。最后,提一點小小的建議,希望老師在每節課后拋出的加分小彩蛋能再多延長些時間,因為有時會碰到其他課程作業的ddl,我沒法按時“體驗”這些有趣的小彩蛋,就很可惜QAQ。

參考資料

  • 《python編程 從入門到實踐》


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM