20214313 實驗四《Python程序設計》報告
20214313 實驗四《Python程序設計》報告
課程:《Python程序設計》
班級: 2143
姓名: 馮珂
學號:20214313
實驗教師:王志強
實驗日期:2022年5月27日
必修/選修: 公選課
一.實驗內容
Python綜合應用:爬蟲、數據處理、可視化、機器學習、神經網絡、游戲、網絡安全等。
我選擇了比較實用的爬蟲。在學習爬蟲之前,只知道這是一個可以快速獲取網站內容的東西,抱著好奇試試的心態我開始嘗試起學習用python編寫爬蟲。到這時才知道這里面也有很多學問和坑,需要一步一個腳印。
網絡爬蟲,是一種按照一定的規則,自動地抓取萬維網信息的程序或者腳本。另外一些不常使用的名字還有螞蟻、自動索引、模擬程序或者蠕蟲。
Python 爬蟲架構主要由五個部分組成,分別是調度器、URL管理器、網頁下載器、網頁解析器、應用程序(爬取的有價值數據)。
二.實驗過程及結果
1.準備庫模塊
主要需要requests和re兩個模塊爬取網頁,json用來字符串格式轉換,os模塊進行文件操作,time模塊查看時間防止重復提取等功能。

2.執行網頁抓取(發起請求,獲取響應內容)
通過基本url(種子)來獲取數據,然后探索由種子url提取數據中的下一個url。重復該過程。

有些網頁有反爬取功能,這里偽造了一個請求頭,假裝正常瀏覽器瀏覽。

根據回應不同也有不同對策。
我選擇的是王者全英雄皮膚的抓取。所以網址也會根據英雄不同而改變。

我提前找到了英雄的id的網址,通過聯系獲得各個英雄的網址來逐個爬取皮膚。


3.存儲爬取的信息
提示你爬取是否成功,并存放到指定位置。

4.計算爬取時間

5.華為云服務器的調試。
更新pip至最新版本

安裝json等庫。

5.上傳華為云ECS服務器(華為云服務器是之前已經買好的)

運行程序


檢測結果

打開一個圖片

源代碼
`
import requests
import re
import json
import os
import time
# 獲取當前時間戳,用于計算爬蟲爬取完畢消耗了多少時間
now = lambda: time.time()
# 請求頭
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36",
"Cookie": "pgv_pvid=120529985; pgv_pvi=8147644416; RK=iSx1Z7fSHW; ptcz=d094d0d03f513f6762a4c18a13ddae168782ec153f43b16b604723b27069d0a7; luin=o0894028891; lskey=000100008bc32936da345e2a5268733bf022b5be1613bd2600c10ad315c7559ff138e170f30e0dcd6a325a38; tvfe_boss_uuid=8f47030b9d8237f7; o_cookie=894028891; LW_sid=s116T01788a5f6T2U8I0j4F1K8; LW_uid=Z1q620M7a8E5G6b2m8p0R4U280; eas_sid=m1j6R057x88566P2Z8k074T2N7; eas_entry=https%3A%2F%2Fcn.bing.com%2F; pgv_si=s8425377792; PTTuserFirstTime=1607817600000; isHostDate=18609; isOsSysDate=18609; PTTosSysFirstTime=1607817600000; isOsDate=18609; PTTosFirstTime=1607817600000; pgv_info=ssid=s5339727114; ts_refer=cn.bing.com/; ts_uid=120529985; weekloop=0-0-0-51; ieg_ingame_userid=Qh3nEjEJwxHvg8utb4rT2AJKkM0fsWng; pvpqqcomrouteLine=index_herolist_herolist_herodetail_herodetail_herodetail_herodetail; ts_last=pvp.qq.com/web201605/herolist.shtml; PTTDate=1607856398243",
"referer": "https://pvp.qq.com/"
}
# 解析函數,返回文本或者二進制或者None
def parse_url(url, get_b=False):
try:
response = requests.get(url, headers=headers)
response.encoding = "gbk"
assert response.status_code == 200
if get_b == True:
return response.content
else:
return response.text
except:
print("status_code != 200(from parse_url)")
return None
# 處理單個英雄
def parse_hero_detail(id, name):
# 保存所有皮膚圖片的本地路徑
path = f"data/{name}"
if not os.path.exists(path):
os.makedirs(path, exist_ok=True)
# 因為不確定每個英雄有多少個皮膚,所以假設單個英雄一共請求10張皮膚,這樣就不會出現皮膚缺少的情況
for num in range(1, 11):
# 單個英雄皮膚圖片的url鏈接
api_url = f"https://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/{id}/{id}-bigskin-{num}.jpg"
# 如果返回None,則說明 狀態碼不是200,即沒有這個請求的皮膚
b_data = parse_url(api_url, get_b=True)
if b_data == None:
print(f"{name} 一共有{num - 1}個皮膚")
print("--------------------------------------------------")
# 沒有新的皮膚了,退出循環
break
img_path = f"{path}/demo{num}.jpg"
if not os.path.exists(img_path):
try:
download_img(img_path, b_data)
except:
return
print(f"{name} 第{num}張皮膚圖片 下載完畢")
# 下載圖片
def download_img(path, b_data):
with open(path, "wb") as f:
f.write(b_data)
def main():
# 含有每個英雄對應的id、英雄名稱的url
api_url = "https://game.gtimg.cn/images/yxzj/web201706/js/heroid.js"
text = parse_url(api_url)
search_result = re.search('var module_exports = ({.*?})', text, re.S)
hero_info_str = search_result.group(1)
hero_info_str = re.sub("'", '"', hero_info_str)
# 包含 所有英雄以及各自對應的id 的字典
hero_info_dict = json.loads(hero_info_str)
for hero in hero_info_dict:
name, id = hero_info_dict[hero], hero
print(name, id)
parse_hero_detail(id, name)
if __name__ == '__main__':
start = now() # 記錄起始時間
main() # 主函數
print(f"耗時: {now() - start}") # 計算爬蟲執行完畢消耗的時間
`
6.實驗問題及解決方法。
問題1:pip指令無法正常起作用。
解決方法:更新pip。
問題2:程序上傳后無法運行。
解決方法:下載相關庫文件以及更新python版本。
三、課程及實驗總結
建議 :
1、老師可以在講課之前,提前發布以下可能講的知識點,不然真的很難跟上的說,雖然靠課后學習也能掌握,但是還是課前好啊。
2、希望老師能保持自己的講課風格,這樣生動的課堂真的很有意思(不說能不能跟上)!
3、老師還是保重身體重要。
總結及感想:
雖然學習python只有幾個月的零碎時間,但是從我開始接觸到這門語言開始,我就知道這是一個簡潔又靈活的語言。
從開始的打出第一個句子hello world,到逐漸了解python的變量類型及使用,字典,集合,元組,列表等的用法,再到自己編寫猜數游戲,寫出自己的第一個socket。
我開始對這門語言有了越來越深的興趣。在這幾個月里,雖然課程不多,但是我學習到的知識,卻感覺非常充實,python有無數的東西可以實現,我幾乎可以用python報體溫,自動回復。
這太酷了不是嗎?對于一個男生來說。

上圖是在練習基礎變量和語法,雖然是基礎,但是真的記住也很困難的,中間好多挫折。


上圖是一個簡單的socket。
后來,老師講到了爬蟲,也是我當時對python最好奇的地方,盡管聽的磕磕絆絆,但是通過不斷練習,測試,自己在b站學習,我終于也可以自己寫一個爬蟲了。
最后一次作業,我也用所學,寫了一個爬取王者皮膚的爬蟲,以此來表示我對python的興趣的開始,始于爬蟲。
希望在接下來的時間里也能繼續對編程語言的興趣,多多學習,碰撞出思維的火花!
浙公網安備 33010602011771號