前言 嗨嘍~大家好呀,這裡是魔王吶 環境使用: Python 3.8 Pycharm 模塊使用: requests > 數據請求模塊 需要安裝 pip install requests re 正則表達式 內置模塊 不需要安裝 os 文件操作模塊 內置模塊 不需要安裝 --> 自動創建文件夾 把每個英 ...
前言
嗨嘍~大家好呀,這裡是魔王吶
環境使用:
-
Python 3.8
-
Pycharm
模塊使用:
-
requests ---> 數據請求模塊 需要安裝 pip install requests
-
re 正則表達式 內置模塊 不需要安裝
-
os 文件操作模塊 內置模塊 不需要安裝 --> 自動創建文件夾 把每個英雄都自動創建對應文件
基本套路
一. 數據來源分析
-
確定需求, 確定採集目標
-
通過開發者工具抓包分析, 分析我們想要數據內容來自於那個url地址
-
F12 或者 滑鼠右鍵點擊檢查 選擇 network(網路) 刷新網頁
-
去分析圖片url地址是什麼 ---> 選擇 Img 可以查找圖片url地址
505 表示英雄ID
2 皮膚第幾個 ---> 通過皮膚名字對應他的皮膚鏈接
想要獲取 yao 皮膚數據
- 向網址發送請求
- 獲取response響應數據
- 提取皮膚名字
- 構建 皮膚 url地址
- 保存數據
二. 代碼實現步驟
- 發送請求, 模擬瀏覽器對於url地址發送請求
- 獲取數據, 獲取伺服器返迴響應數據
- 解析數據, 提取我們想要內容, 皮膚名字
- 保存數據, 數據保存本地
代碼
# 導入數據請求模塊 ---> 第三方模塊 需要 在cmd裡面進行安裝 pip install requests import requests # 導入正則模塊 ---> 內置模塊 不需要安裝 import re # 導入文件操作模塊 ---> 內置模塊 不需要安裝 import os # 確定網址 link = 'https://pvp.qq.com/web201605/js/herolist.json' # 模擬偽裝瀏覽器 ---> 請求頭 headers = { # user-agent 用戶代理 表示瀏覽器基本身份標識 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.0.0 Safari/537.36' } # 發送請求 json_data = requests.get(url=link, headers=headers).json() # for迴圈遍歷 for index in json_data: # 字典鍵值對取值 根據冒號左邊的內容[鍵],提取冒號右邊的內容[值] hero_id = index['ename'] hero_name = index['cname'] # 設定文件夾路徑 相對路徑 file = f'img\\{hero_name}\\' if not os.path.exists(file): os.makedirs(file) """ 1. 發送請求, 模擬瀏覽器對於url地址發送請求 - headers 字典數據類型, 構建完整鍵值對 - 請求頭參數 可以直接在開發者工具複製粘貼 - 使用什麼請求方法, 根據開發者工具來 """ # 確定請求url地址 url = f'https://pvp.qq.com/web201605/herodetail/{hero_id}.shtml' # 模擬偽裝瀏覽器 ---> 請求頭 headers = { # user-agent 用戶代理 表示瀏覽器基本身份標識 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.0.0 Safari/537.36' } # 發送請求 ---> <Response [200]> 響應對象: <>表示對象 response 響應回覆 200 狀態碼 表示請求成功 response = requests.get(url=url, headers=headers) # 亂碼了 怎麼辦? ---> 你要根據網頁編碼來 response.encoding = 'gbk' # 自動識別編碼 response.encoding = response.apparent_encoding # 獲取數據, 獲取伺服器返迴響應數據 文本數據 print(response.text) """ 解析數據 re正則 會1 不會2 re.findall() 從什麼地方 去找什麼數據 從 response.text 裡面 去找 data-imgname="(.*?)"> 其中 (.*?) 就是我們要的數據 """ title_list = re.findall('data-imgname="(.*?)">', response.text)[0] # 鹿靈守心&0|森&0|遇見神鹿&71|時之祈願&94|時之願境&42 title_list = re.sub('&\d+', '', title_list).split('|') print(title_list) # for迴圈 for num in range(1, 6): len() 統計列表元素個數 for num in range(1, len(title_list) +1): # 列表取值, 根據索引位置,索引位置從0開始計數 img_name = title_list[num-1] # 構建圖片url地址 img_url = f'https://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/{hero_id}/{hero_id}-bigskin-{num}.jpg' print(img_name, img_url) # 保存數據 ---> 發送請求 獲取數據 二進位數據 img_content = requests.get(url=img_url, headers=headers).content with open(file + img_name + '.jpg', mode='wb') as f: f.write(img_content)