本帖最后由 814212053 于 2022-7-1 23:10 编辑
独学而无友,则孤陋而寡闻
互相学习才是进步的阶梯!
爬虫 之噜阿噜皮肤图片抓取
## 文中部分关键字被替换了,请参照下图修改!
## 文中部分关键字被替换了,请参照下图修改!
## 原创作品,转载请注明出处,欢迎各路朋友前来交流!
## 本脚本只用作学习交流,请勿给对方站点造成流量压力!
1.用到的模块
1.requests #网络请求模块
2.re #正则模块
3.json
2.难点说明
1.皮肤图片不是直接显示在页面中,通过js获取然后渲染出来的。
2.分析js代码,找到关键url
3.完整代码
import requests
import re
import json
class 噜阿噜HeroSkin:
def __init__(self):
# 通过抓包和js分析,得到下边两个url
# 第一个是所有英雄的json列表
# 第二个是分析js得出的皮肤文件url
self.hero_index_url = 'https://game.gtimg.cn/images/噜阿噜/act/img/js/heroList/hero_list.js'
self.skinBaseUrl = 'https://ossweb-img.qq.com/images/噜阿噜/web201310/skin/big'
@staticmethod
def get_hero_data_url(e_name, c_name):
"""
根据英雄昵称,获取指定js
"""
return f'https://噜阿噜.qq.com/biz/hero/{e_name}.js', c_name
def get_hero_list(self):
"""
获取所有英雄的json内容
"""
res = requests.get(url=self.hero_index_url)
res.encoding = 'gb2312'
hero_list = res.json().get('hero')
print('共', len(hero_list), '个英雄!')
for name in hero_list:
yield name.get('alias'), name.get('name')
def get_hero_skin_id(self, e_name, c_name):
"""
获取皮肤对应的id,通过正则匹配出来
"""
url, c_name = self.get_hero_data_url(e_name, c_name)
res = requests.get(url=url)
if res.status_code == 200:
try:
hero = json.loads(re.search('(.*?=){2}({.*})', res.text).group(2))
return hero.get('data').get('skins')
except Exception as e:
print(e)
print(res.text)
else:
print('404--')
return None
def get_hero_skin_urls(self):
num = 0
for e_name, c_name in self.get_hero_list():
num += 1
skin_list = r.get_hero_skin_id(e_name, c_name)
if skin_list:
print('正在抓取第', num, f'位英雄【{c_name}】的皮肤 ,', '共:', len(skin_list), '个!')
for i in skin_list:
yield self.skinBaseUrl + i.get('id') + '.jpg', c_name + i.get('id')
else:
print('404异常!!')
@staticmethod
def save_img(url, name):
res = requests.get(url=url)
# 这里如果是特殊皮肤,页面上是加载不出来的,返回404,不是脚本的原因,是他的网页本来就不能查看!
if res.status_code == 200:
with open('噜阿噜_img/' + name + '.jpg', 'wb') as f:
f.write(res.content)
else:
pass
def run(self):
for url, name in r.get_hero_skin_urls():
self.save_img(url, name)
if __name__ == '__main__':
r = 噜阿噜HeroSkin()
r.run()
|