模块包
requests
bs4
urllib
pyecharts
效果图

image.png

image.png

image.png
数据获取
1) 打开王者荣耀官网网站(https://pvp.qq.com/),最顶部-游戏资料-英雄资料。
2) 谷歌浏览器,F12查看页面数据。不难发现,获取英雄列表数据接口。得到的是个json数据格式文件。
图片
3)快速查看json框架接口
可以参考(https://www.jianshu.com/p/219b5755bafc)
图片
如上图所示,很快得到清晰的英雄数据。
4) 英雄皮肤
选择其中一个英雄并点击英雄头像跳转至详情界面,F12查看皮肤数据。以云中君为例。
皮肤个数:
图片
皮肤地址:
图片
代码实现
- 抓取网站英雄数据
def get_hero(self):
request = requests.get(self.hero_url)
hero_list = request.json()
return hero_list
- 解析英雄列表和皮肤数据
def hero_skin(self, hero_list):
num = 0
for hero in hero_list:
num += 1
hero_no = str(hero['ename'])
self.detail_url = hero_no + '.shtml'
hero_name = hero['cname']
self.get_hero_skin(str(num) + hero_name, hero_no)
def get_skin_html(self):
url = parse.urljoin(self.base_url, self.detail_url)
request = requests.get(url)
request.encoding = 'gbk'
html = request.text
soup = BeautifulSoup(html, 'lxml')
skip_list = soup.select('.pic-pf-list3')
return skip_list
def get_hero_skin(self, hero_name, hero_no):
skip_list = self.get_skin_html()
for skin_info in skip_list:
img_names = skin_info.attrs['data-imgname']
name_list = img_names.split('|')
skin_no = 1
for skin_name in name_list:
self.skin_detail_url = '%s/%s-bigskin-%s.jpg' % (hero_no, hero_no, skin_no)
skin_no += 1
img_name = hero_name + '-' + skin_name.split('&')[0] + str(skin_no-1) + '.jpg'
self.download_skin(img_name)
由于篇幅原因,这里只展示部分代码。
皮肤下载,可视化
- 下载
def download_skin(self, img_name):
img_url = parse.urljoin(self.skin_url, self.skin_detail_url)
# 防止http请求太快,导致异常
time.sleep(0.5)
request = requests.get(img_url)
if request.status_code == 200:
print('download-%s' % img_name)
img_path = os.path.join(self.img_folder, img_name)
with open(img_path, 'wb') as img:
img.write(request.content)
else:
print('img error!')
- 可视化
def m_cloud(self):
cloud = (
WordCloud(init_opts=opts.InitOpts(theme='essos'))
.add("英雄皮肤个数", self.json_data)
.set_global_opts(title_opts=opts.TitleOpts(title="英雄皮肤个数分布"))
)
cloud.render("王者荣耀英雄皮肤个数.html")
def m_pie(self):
p = (
Pie(init_opts=opts.InitOpts(theme='essos'))
.add("英雄定位个数", self.json_data)
.set_colors(["blue", "green", "yellow", "red", "pink", "orange", "purple"])
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
.set_global_opts(title_opts=opts.TitleOpts(title="英雄定位个数分布"))
)
p.render("英雄定位个数分布.html")
更多详情,请见原文