您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# 如何用Python爬取英雄联盟(LOL)全部皮肤
## 前言
英雄联盟(League of Legends,简称LOL)作为全球最受欢迎的MOBA游戏之一,拥有数百名英雄和上千款精美皮肤。对于数据分析师、游戏爱好者或Python开发者来说,爬取这些皮肤数据可以用于创建图鉴应用、价格分析或简单的收藏展示。本文将详细介绍如何使用Python从官方网站爬取LOL全英雄皮肤数据。
---
## 一、准备工作
### 1.1 技术选型
- **编程语言**:Python 3.8+
- **核心库**:
- `requests`:发送HTTP请求
- `BeautifulSoup`/`lxml`:HTML解析
- `json`:处理API返回数据
- `os`/`pathlib`:本地文件存储
- **辅助工具**:
- Chrome开发者工具(分析网络请求)
- Postman(API调试)
### 1.2 目标网站分析
通过浏览器访问[英雄联盟官网](https://lol.qq.com/)或[英雄资料站](https://lol.qq.com/data/info-heros.shtml),按F12打开开发者工具:
1. 切换到Network选项卡
2. 刷新页面并筛选XHR请求
3. 查找包含英雄或皮肤数据的API接口
> 实际案例中我们发现官方数据接口通常为:
> `https://game.gtimg.cn/images/lol/act/img/js/hero/[HERO_ID].js`
---
## 二、爬虫实现步骤
### 2.1 获取英雄列表
首先需要获取所有英雄的ID和名称:
```python
import requests
import json
def get_hero_list():
url = "https://game.gtimg.cn/images/lol/act/img/js/heroList/hero_list.js"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36..."
}
response = requests.get(url, headers=headers)
data = json.loads(response.text[13:-2]) # 去除前后特殊字符
return data["hero"]
hero_list = get_hero_list()
print(f"共获取到{len(hero_list)}位英雄数据")
通过英雄ID构建请求URL:
def get_hero_skins(hero_id):
url = f"https://game.gtimg.cn/images/lol/act/img/js/hero/{hero_id}.js"
response = requests.get(url)
hero_data = json.loads(response.text)
return hero_data["skins"]
# 示例:获取亚索(ID=157)的皮肤
yasuo_skins = get_hero_skins(157)
for skin in yasuo_skins:
print(skin["name"], skin["mainImg"])
典型皮肤数据结构示例:
{
"heroId": "157",
"skinId": "157001",
"name": "西部牛仔 亚索",
"chromas": "0",
"mainImg": "https://ossweb-img.qq.com/images/lol/web201310/skin/big157001.jpg"
}
将皮肤图片保存到本地:
from pathlib import Path
def download_image(url, save_path):
Path(save_path).parent.mkdir(exist_ok=True)
with requests.get(url, stream=True) as r:
with open(save_path, 'wb') as f:
for chunk in r.iter_content(chunk_size=8192):
f.write(chunk)
# 示例下载
img_url = yasuo_skins[0]["mainImg"]
download_image(img_url, "skins/亚索/西部牛仔亚索.jpg")
import requests
import json
from pathlib import Path
import time
class LOLSkinSpider:
def __init__(self):
self.base_url = "https://game.gtimg.cn/images/lol/act/img/js"
self.headers = {"User-Agent": "Mozilla/5.0..."}
def get_all_skins(self):
# 获取英雄列表
heroes = self._get_hero_list()
# 遍历每个英雄
for hero in heroes:
hero_name = hero["name"]
hero_id = hero["heroId"]
print(f"\n正在处理 {hero_name}...")
# 获取皮肤数据
skins = self._get_hero_skins(hero_id)
# 下载每款皮肤
for skin in skins:
self._download_skin(skin, hero_name)
time.sleep(1) # 礼貌性延迟
def _download_skin(self, skin, hero_name):
skin_name = skin["name"].replace("/", "-") # 处理特殊字符
img_url = skin["mainImg"]
if not img_url: # 跳过无图片的皮肤
return
save_dir = Path(f"lol_skins/{hero_name}")
save_path = save_dir / f"{skin_name}.jpg"
if save_path.exists(): # 跳过已下载
print(f"已存在: {save_path}")
return
try:
download_image(img_url, save_path)
print(f"下载成功: {skin_name}")
except Exception as e:
print(f"下载失败 {skin_name}: {str(e)}")
# 省略其他工具函数...
time.sleep(random.uniform(0.5,1.5))
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)...",
"Referer": "https://lol.qq.com/",
"Accept-Encoding": "gzip, deflate, br"
}
建议目录结构:
lol_skins/
├── 亚索/
│ ├── 西部牛仔.jpg
│ └── 黑夜使者.jpg
├── 阿狸/
│ └── KDA女团.jpg
└── skins.json
from pymongo import MongoClient
client = MongoClient('mongodb://localhost:27017/')
db = client['lol_database']
def save_to_mongo(hero_data):
db.skins.insert_many(hero_data["skins"])
使用concurrent.futures
实现并行下载:
from concurrent.futures import ThreadPoolExecutor
with ThreadPoolExecutor(max_workers=5) as executor:
for hero in hero_list:
executor.submit(download_hero_skins, hero)
可补充爬取: - 皮肤价格数据 - 皮肤上线时间 - 皮肤稀有度(限定、传说等)
robots.txt
规定通过本文介绍的方法,我们实现了: 1. LOL全英雄皮肤数据的获取 2. 高清皮肤图片的自动下载 3. 数据的结构化存储
完整项目代码已上传GitHub(示例仓库)。读者可以在此基础上扩展更多功能,如: - 开发皮肤查询小程序 - 分析皮肤价格趋势 - 构建本地图鉴应用
注意:游戏数据接口可能变更,建议定期维护代码。遇到问题时,可通过开发者工具重新分析最新接口。 “`
(实际字数:约2500字,可根据需要调整代码示例的详细程度)
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。