20211306 實驗四 Python綜合實踐
學號 20211306 《Python程式設計》實驗四報告
課程:《Python程式設計》
班級: 2113
姓名: 丁文博
學號:20211306
實驗教師:王志強
實驗日期:2022年5月29日
必修/選修: 公選課
一、實驗要求
Python綜合應用:爬蟲、資料處理、視覺化、機器學習、神經網路、遊戲、網路安全等。
在華為ECS伺服器(OpenOuler系統)和物理機(Windows/Linux系統)上使用VIM、PDB、IDLE、Pycharm等工具程式設計實現。
二、實驗內容
做了人生中第一個用爬蟲爬取資料的程式,爬取中國福彩網往期(100期)雙色球的中獎號碼、中獎人數、中獎金額及其他相關資訊,並建立csv檔案,將資料儲存到裡面。
首先引入一些模組
引入“request”、“pprint”、“csv”模組,分別用來發送請求、格式化輸出以及儲存資料並建立csv檔案
向網站傳送請求
開啟網頁檢查介面,進入network介面
所需的資料就在Fetch/XHR中
點開preview介面,尋找檢索到所需資料的那條資訊,就是我們要爬取的物件
'Request URL'後就是我們需要的'url'
網站地址中?後的是具體資料,可以刪掉。然後用請求引數接收下來
位置在payload中
接下來是請求頭
接收爬取到的資料
- 到這裡的時候print(response),出現'200'這個狀態碼,代表爬取成功
這裡還有一個防盜鏈,但將防盜鏈遮蔽時成功執行,但將防盜鏈放進去的時候就會失敗(報錯顯示著語法錯誤,標著那個冒號出錯,但是將防盜鏈遮蔽就會消失)
將所需資料儲存到json字典中
這裡前面引入的pprint模組開始使用,並且輸入pprint.pprint(response.json())
就會出現以上這樣的結果,這就是格式化輸出,我們需要把它們變為文字的格式
建立csv檔案並儲存資料
解析資料,提取所需內容,並對字典進行for遍歷
用csv模組,建立'雙色球.csv'檔案,並對其進行讀寫,寫表頭(注意這裡的表頭需要和字典的順序相同,否則會報錯)
列印資料
創建出來的csv檔案就像這樣
三、問題以及解決辦法
問題1:剛開始在寫入表頭時,一直不能建立成功檔案
解決辦法:檢查程式碼,發現fieldnames寫成了filednames,還上網查了許多關於這個報錯的原因,最後發現卻是單詞拼錯了。
問題2:建立csv檔案後,儲存的資料都是亂碼
解決辦法:把解碼方式從'utf-8'改為'gbk'
四、程式碼
點選檢視程式碼
import requests # 資料請求 第三方 pip install requests
import pprint #格式化輸出
import csv #儲存
f = open('雙色球.csv','a+',encoding='gbk',newline='')
csv_writer = csv.DictWriter(f, fieldnames=['期號',
'開獎日期',
'紅球',
'藍球',
'一等獎中獎注數',
'一等獎中獎金額',
'二等獎中獎注數',
'二等獎中獎金額',
'三等獎中獎注數',
'三等獎中獎金額',
'四等獎中獎注數',
'四等獎中獎金額',
'五等獎中獎注數',
'五等獎中獎金額',
'六等獎中獎注數',
'六等獎中獎金額',
'一等獎中獎地區',
'獎池金額'])
csv_writer.writeheader() # 寫入表頭
# 傳送請求的url地址
url = 'http://www.cwl.gov.cn/cwl_admin/front/cwlkj/search/kjxx/findDrawNotice'
# 快速替換 CTRL+r 正則表示式:”(.*?):(.*)“ 替換為 “'$1':'$2',”
params = {
'name': 'ssq',
'issueCount':'',
'issueStart':'',
'issueEnd':'',
'dayStart': '2021-05-20',
'dayEnd': '2022-05-20',
}
headers = {
# 'Referer': 'http://www.cwl.gov.cn/ygkj/wqkjgg/ssq/'
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.64 Safari/537.36 Edg/101.0.1210.53'
}
response = requests.get(url=url, params=params, headers=headers)
# <> 物件 200 請求成功 狀態碼
result = response.json()['result']
# 解析資料 鍵值對取值 根據冒號左邊的內容 提取冒號右邊的內容
# for 遍歷
for index in result:
dit={
'期號':index['code'],
'開獎日期': index['date'],
'紅球': index['red'],
'藍球': index['blue'],
'一等獎中獎注數': index['prizegrades'][0]['typenum'],
'一等獎中獎金額': index['prizegrades'][0]['typemoney'],
'二等獎中獎注數': index['prizegrades'][1]['typenum'],
'二等獎中獎金額': index['prizegrades'][1]['typemoney'],
'三等獎中獎注數': index['prizegrades'][2]['typenum'],
'三等獎中獎金額': index['prizegrades'][2]['typemoney'],
'四等獎中獎注數': index['prizegrades'][3]['typenum'],
'四等獎中獎金額': index['prizegrades'][3]['typemoney'],
'五等獎中獎注數': index['prizegrades'][4]['typenum'],
'五等獎中獎金額': index['prizegrades'][4]['typemoney'],
'六等獎中獎注數': index['prizegrades'][5]['typenum'],
'六等獎中獎金額': index['prizegrades'][5]['typemoney'],
'一等獎中獎地區': index['content'],
'獎池金額': index['poolmoney']
}
csv_writer.writerow(dit)
print(dit)
五、雲上執行
六、實驗體會
在這學期跟隨王志強老師學習python的過程中,感受到了python作為一門程式語言獨特的魅力,相比於其他程式語言,python更簡便快捷,同時操作方面也更加簡單,也有更多開源的庫和模組可以使用。同時跟王志強老師也學習到了很多知識,像學長學姐說的一樣,王老師講的這門課果然是十分硬核、真正能夠學到東西的一門課,在課堂上需要一直認真聽老師講解,不然就會跟不上老師的進度,但王老師是一位十分負責任的老師,如果出現了問題,他會隨時解答,也會幫忙除錯程式碼,雖然一邊批評說你不會單步除錯,但是也會一直幫助你直到程式碼成功執行下來。這學期我學到了關於python的很多東西,檔案操作、資料庫、爬蟲、函式、面對物件的程式設計等,老師也將這些學習資料上傳到了雲班課上供我們學習。感謝老師的傾情付出,也感謝老師給我們對python細緻又幽默的講解,希望以後還能跟王老師學習到更多的東西!