20193131 2019-2020-2 《Python程式設計》實驗四 報告
#201931312019-2020-2 《Python程式設計》實驗三報告
課程:《Python程式設計》
班級:1931
姓名:崔克政
學號:20193131
實驗教師:王志強
實驗日期:2021年6月18日
必修/選修: 公選課
## 1.實驗內容
Python綜合應用:爬蟲、資料處理、視覺化、機器學習、神經網路、遊戲、網路安全等
## 2. 實驗過程及結果
一、小說爬蟲下載
涉及到的庫及對應的作用:
- requests:用於獲取get請求
- Beautiful Soup4:用於網頁解析
- re:正則表示式
- os:系統相關操作
- time:獲取的時間
這次我爬取的是新筆趣閣裡面的小說,我們先進入小說網 ,對網站的網址和結構進行分析。
對網站結構進行分析,按F12檢查網頁原始碼,我們僅需要的是Request Headers的內容,把裡面的內容取出來放到字典中,其中關鍵的只有"User-Agent"
可以很清楚的看到,網頁非常具有規律性,同一小說不同章節僅僅是最後一段數字在遞增,可以通過正則表示式進行迴圈爬取,這次以5章為例
其中很簡單的就找到了文字部分所在的連線位置,並且相當有規律,編寫程式碼
title_re = re.compile(r'<h1>(.*?)</h1>') text_re = re.compile(r' ([\s\S]*?)')
這兩部分即為小說章節標題與正文部分的爬取。
程式碼如下
import requests import threading from bs4 import BeautifulSoup import re import os.path import time for i in range(6795760,6795765): header = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36'} req = requests.get('https://www.xbiquge.la/15/15003/%d.html' % i, headers=header) result = req.content result = result.decode('gbk','ignore') title_re = re.compile(r'<h1>(.*?)</h1>') text_re = re.compile(r' ([\s\S]*?) ') title = re.findall(title_re,result) text = re.findall(text_re,result) count = i - 6795759 file = open("C:\\Users\\86152\\Desktop\\小說\\第%d章.txt" % count,'a') for sentence in text: sentence = sentence.replace('<br', '') file.write(sentence) file.write('\n') path = os.walk("C:\\Users\\86152\\Desktop\\小說\\第%d章.txt" % count) file.close() file = file = open("C:\\Users\\86152\\Desktop\\小說\\第%d章.txt" % count,'r') print("第%d章下載完畢" % count)
試執行
果然出錯了哈哈哈,仔細檢視是庫檔案安裝錯了位置,重新安裝後可以成功執行
成功爬下了小說,但出現了亂碼,經查詢發現是編碼問題,
參考了
https://www.cnblogs.com/yanduanduan/p/7250518.html
與
https://blog.csdn.net/zangbianer/article/details/84526011
後發現這個小說網站使用的是UTF-8進行編碼,而我使用的是gbk寫入.txt,所以是亂碼
更正程式碼
result = result.decode('utf8','ignore')
成功解決
二、貪吃蛇小遊戲
早就聽聞在強大庫檔案支援下,Python編寫遊戲相較C有巨大優勢,這次我也進行了嘗試
首先呢,需要有貪吃蛇、有食物;需要能控制貪吃蛇來上下移動獲取食物;貪吃蛇在吃取食物後,自身長度增加,同時食物消失並隨機生成新的食物;如果貪吃蛇觸碰到四周牆壁或是觸碰到自己身體時,則遊戲結束。
那麼就先來設定食物和背景的顏色
# 目標方塊顏色 redColor = pygame.Color(255, 0, 0) # 背景顏色 blackColor = pygame.Color(0, 0, 0) # 蛇顏色 whiteColor = pygame.Color(255, 255, 255)
然後是蛇的長度、初始位置、蛇的初始位置
# 初始化目標方塊的位置 targetPosition = [500, 100] # 目標方塊標記 判斷貪吃蛇是否吃掉目標方塊 1為沒吃掉 0為吃掉 targetFlag = 1 # 初始化貪吃蛇的位置 # 初始化貪吃蛇長度 snake_head = [400, 100] snake_body = [[80, 100], [60, 100]]
按鍵輸入
elif event.type == KEYDOWN: if event.key == K_RIGHT: changedirection = 'right' if event.key == K_LEFT: changedirection = 'left' if event.key == K_UP: changedirection = 'up' if event.key == K_DOWN: changedirection = 'down' if event.key == K_ESCAPE: pygame.event.post(pygame.event.Event(QUIT))
吃下食物
# 增加蛇的長度 snake_body.insert(0, list(snake_head)) # 如果貪吃蛇位置和目標方塊位置重合 if snake_head[0] == targetPosition[0] and snake_head[1] == targetPosition[1]: targetFlag = 0
加入變速模組,隨著吃下的方塊越多,蛇的爬行速度也會增加
# 如果貪吃蛇位置和目標方塊位置重合 if snake_head[0] == targetPosition[0] and snake_head[1] == targetPosition[1]: targetFlag = 0 global speed speed=speed+1
一開始僅僅使用了局部變數來進行,一直在報錯,經查證後發現全域性變數需要global xxx的形式進行定義,並且在第一次使用時還需要再次進行global xxx的宣告,表示確實在使用全域性變數。
實際效果
程式碼連結:https://gitee.com/mybysq121/python2021/commit/06fc80ba92f7176a518659def446578e7fef9abe
##參考
全域性變數:http://www.360doc.com/content/19/0306/08/58190678_819538495.shtml
小說爬蟲下載:https://blog.csdn.net/weixin_43126271/article/details/84984767?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-3.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-3.control
## 實驗過程中遇到的問題和解決過程
- 問題1:執行時涉及到很多環境,總是會出現缺少安裝的現象,運用pip安裝發現失敗
- 問題1解決方案:參考資料,將pip加入了系統的環境變數,最終使pip install能夠順利執行
- 問題2:對正則表示式的具體內容不清楚
- 問題2解決方案:翻閱了課程的相關資料
##其他(感悟、思考等)
Python 作為一個近年備受好評的語言,它的一些優點讓人無法忽視。Python 是一個高層次的結合瞭解釋性、編譯性、互動性和麵向物件的指令碼語言。它的設計具有很強的可讀性,相比其他語言經常使用英文關鍵字,其他語言的一些標點符號,它具有比其他語言更有特色語法結構。Python 是一種解釋型語言: 這意味著開發過程中沒有了編譯這個環節。類似於PHP和Perl語言。Python 還是互動式語言: 這意味著,可以在一個Python提示符,直接互動執行寫程式。
這次是python的最後一次實驗,也是給我帶來極大震撼的實驗,從一開始對爬蟲的一竅不通到經過了不斷學習之後,能自己敲出爬蟲程式碼,找到headers,獲取小說內容的時候,我感到了一種極大的成就感,也讓我看到了自己爬蟲技術提高的可能性。平時通過觀看雲班課中的視訊自學和觀摩老師進行實操,我可以此每次順利完成作業,並且學到了非常多的知識,不斷認識到Python的強大之處。回顧整學期,迴圈、列表、類、元組、函式等等我都熟悉了知識點,而且每次作業雖然會遇到困難,但是通過自己查資料解決也使我有了自主學習的能力和解決問題的能力。通過課程的學習,我學習到了python如何使用,python語言的發展歷史。學習到了流程控制語句:if-elif-else語句(elif else 可選)、for/while迴圈。學習到了序列如何應用、字串與正則表示式如何實際去應用以及相關之間的關係;學習到了函式如何編寫;學習了面向物件程式設計,萬物皆為物件;學習了異常處理,是為了防止錯誤中斷程式使程式更加的健壯;學習了資料庫,python如何操作資料庫,還學習到了一些簡單的控制資料庫語句;最後學習了爬蟲。
我還是很喜歡老師這樣的教學方式的,因為我現在越來越體會到自學的重要性,老師不是一直存在的,通過自己的資源和能力獲取知識才是最可靠的。我沒有更多的建議可以告訴老師,希望老師可以繼續這樣教學下去,通過獨特的教學方式也讓之後報這門選修的同學們領悟到自學的重要。
總的來說,這次實驗,這門課程,收穫頗豐。人生苦短,我用python。