王者荣耀五周年,带你入门Python爬虫基础操作!
1.概述
《王者荣耀》上线至今5个年头了,作为这些年国内最热门的手游(没有之一),除了带来游戏娱乐之外,我们在这五周年之际,试着从他们的官网找点乐趣,学习一下Python爬虫的一些简单基础操作。
本篇将主要介绍简单的Python爬虫,包括网页分析、数据请求、数据解析和数据保存,适用于基本不带反爬的一些网站,旨在进行学习交流,请勿用作任何商业非法用途。
网页分析其实就是打开你需要请求数据的网页,然后F12看下这个网页源数据长啥样(如果你会web知识会更好处理,不过我没系统学过,操作多了就熟悉一点);
数据请求我们用人见人爱的requests库,关于该库的更详细用法大家可以去查询该链接了解(https://requests.readthedocs.io/zh_CN/latest/);
数据解析一般视请求的数据格式而定,如果请求的数据是html格式,我将介绍bs4和xpath两种方式进行解析,若请求的数据是json格式,我将介绍json和eval两种方式进行解析;
数据保存这里分为两种情况,如果是图片类会用到open和write函数方法,若是文本类的我会用到pandas的to_excel保存为表单格式。
2.网页分析
我们在概述说提到请求的数据会有html格式或者json格式,两种情况下其实对应的真实请求地址是有差异的,怎么判断呢,作为初学者我的个人经验就是去试试,本章节两种尝试方案都会介绍,大家在实操中视情况而选吧!
2.1.html页面源数据
以下面这张英雄列表页面为例,按住“F12”,然后点一下开发者模式中左上角的那个有鼠标箭头的图标,再在左侧选取你需要的数据区域,在开发者模式区域就会出现这个数据区域的数据信息,比如这里的“详情页地址”、“头像图片地址”和“名称”,我们需要的也算这些信息,所以可以直接请求该链接即可。
2.2.json源数据
对于局内道具列表数据,我们发现上述方案无法获取,那么这种情况下我们可以选择开发者模式中的Network——>XHR,然后刷新页面,在name里找啊找,一般就能到了某个数据是我们需要的。
点Preview发现里面正是我们需要的源数据,然后在Headers里可以找到请求到该源数据的真实链接地址,这里数据请求方式为get,我们下一节会介绍。
3.数据请求
我们提到这里用 requests 库进行数据请求,requests 有两种比较常用的请求方式:post和get。刚好这里我们用的到就是get一种即可,另外请求的时候可带很多参数,比如请求头、cookie等等,具体大家查概述中链接文档了解吧。
简单的例子:
import requests #英雄列表页地址 url = 'https://pvp.qq.com/web201605/herolist.shtml' resp = requests.get(url) #设置解码方式(由于请求的数据中文乱码,这里进行解码) resp.encoding=resp.apparent_encoding 123456
import requests #局内道具详情页地址 url = 'https://pvp.qq.com/web201605/js/item.json' resp = requests.get(url) #设置解码方式(由于请求的数据中文乱码,这里进行解码) resp.encoding=resp.apparent_encoding 123456
4.数据解析
对于不同的源数据解析方式不同,html数据解析这里介绍两种比较常用的入门级方式bs4和xpath,对于json数据其实相对来说更好处理,这里介绍两种简单的方式利用json和eval。
4.1.html数据解析
4.1.1.bs4
Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库,它能够通过你喜欢的转换器实现惯用的文档导航、查找、修改文档的方式。
更多操作详情大家可以去看(https://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/)~
看html数据结构,我们可以找到想要的数据在ul节点,满足class="herolist clearfix"下的全部li节点中。对于bs4来说,可以用find_all方法去定位。(更多解释见代码注释哦)
# bs4 解析 from bs4 import BeautifulSoup # 先将请求到的数据转化为BeautifulSoup对象 soup = BeautifulSoup(resp.text,'html.parser') # 定位全部的满足 class = "herolist clearfix",由于class是关键字所以这里用class_ # 返回结果只有1个的列表,因此取索引0 ul = soup.find_all('ul', class_="herolist clearfix")[0] # 定位 ul 下面全部的 li,li中藏着我们需要的数据信息 lis = ul.find_all('li') # 创建一个空表用于存储数据 herolists = [] # 遍历全部的li for li in lis:# 创建空字典,用于存储 英雄列表信息herolist = {}# get_text() 获取节点下面的文案部分herolist['英雄名称'] = li.get_text()# get() 获取 具体值,英雄详情页地址在 li节点的子节点a下面herolist['英雄详情页'] = li.find('a').get('href')herolist['英雄头像'] = li.find('a').find('img').get('src')herolists.append(herolist) 123456789101112131415161718192021
4.1.2.xpath
XPath 是一门在 XML 文档中查找信息的语言,可用来在 XML 文档中对元素和属性进行遍历。更多语法操作可以查看(https://www.w3school.com.cn/xpath/xpath_syntax.asp
)。
由于本质过程上和bs4差不多,只是语法函数操作不太同,这里不做详细介绍,直接看代码了解下先。
# xpath 解析 from lxml import etreehtml = etree.HTML(resp.text) html_ul = html.xpath('//ul[@class="herolist clearfix"]')[0] html_lis = html_ul.xpath('./li') herolists = []for html_li in html_lis:herolist = {}herolist['英雄名称'] = html_li.xpath('./a/text()')[0]herolist['英雄详情页'] = html_li.xpath('./a/@href')[0]herolist['英雄头像'] = html_li.xpath('./a/img/@src')[0]herolists.append(herolist) 1234567891011121314
4.2.json数据解析
在请求的数据是json格式时,直接查看数据类型发现是str,如下:
我们可采用json.loads()和eval方法将其转化为列表的形式,该列表和上面html数据解析后的结果格式一样。
import jsonjs = resp.text # json.loads() 处理 li = json.loads(js) # 直接 eval() 处理 lis = eval(js) 1234567
5.数据保存
对于图片类数据,请求图片数据然后写入本地保存;对于文本数据表单,转化为dataframe类型存为excel文件(需要用到pandas库)。
5.1.存储图片类数据
我们在英雄列表中有英雄头像数据,这里演示将英雄头像数据存入本地。
# 遍历数据解析中 英雄列表 for li in herolists:# 获取英雄头像网页地址# 如'//game.gtimg.cn/images/yxzj/img201606/heroimg/506/506.jpg'head_url = li['英雄头像']# 组合 https:url = f'https:{head_url}'# 获取该英雄名称,用于赋值给图片文件名称head_name = li['英雄名称']# 请求图片数据head_data = requests.get(url)# 设置存储图片的全路径head_path = f'D:\python\爬虫\王者荣耀\{head_name}.png'# 打开空文件写入图片数据open(head_path, 'wb').write(head_data.content) 123456789101112131415
5.2.文本数据表单存储
import pandas as pd # 列表转化为dataframe类型 df = pd.DataFrame(li) 123
# 由于数据中存在一些网页符号,作为 菜鸟的我只会用replace简单替换 df['des1'] = df['des1'].str.replace('<br>',',').str.replace('<p>','').str.replace('</p>','') df['des2'] = df['des2'].str.replace('<br>',',').str.replace('<p>','').str.replace('</p>','') # 存为表格,页签取名为“装备数据信息list” df.to_excel(r'D:\python\爬虫\王者荣耀\道具表单数据.xlsx',index=False,sheet_name='装备数据信息list') 12345
6.你也来玩一玩
标题中我们提到王者荣耀五周年,有102个英雄和326个皮肤。其实,在英雄列表中我们抓取的html数据中只有93个,如何获取全部的呢?大家可以参考json数据请求的方式去找一找,如何根据相关数据的特点(比如英雄头像地址里变动的其实是 英雄的id,英雄详情页也是)。
大家可以看看新英雄和新皮肤,如何爬取相关数据试试。
https://pvp.qq.com/coming/v2/
6.1.英雄新皮肤数
上线五年,一共93个英雄新出过皮肤,其中貂蝉、花木兰和孙悟空新增皮肤最多,高达5个!!
在93个英雄中,大部分只新增过1个皮肤~
6.2.新增皮肤上线时间
从上线月份来看,1月是英雄上线高峰,这个和1月大部分为春节月有关,毕竟这款产品春节也是最赚钱的。
从上线年份来看,2015年其实10月底产品才上线,所以整体新增皮肤不多,16及17年游戏高速增长期吧,团队产能并没有明显提高?所以在18年之后,团队大了,新增皮肤蹭的飞涨!
6.3.王者英雄产能
2015年10月28日王者首发时,有33个英雄,大家熟悉的亚瑟、项羽、安琪拉等都是第一批。截止到现在,5年时间内新增英雄69个。
从上线月份来看,2、8、11和1月份是新英雄出的最多的,为啥啊?
从上线年份来看,2015年上线2个月内上线7个新英雄,很快,毕竟存了很多量嘛。随后可以看到2016年新英雄产出是高峰,随后逐年降低的趋势,为啥?毕竟英雄设计是非常非常费脑袋的啊!!
7.其他
就酱吧,希望大家通过这个王者荣耀五周年可以学习一点Python爬虫的基础知识,然后去爬取一些简单的数据玩玩,学习学习~
完整代码获取点这里!
王者荣耀五周年,带你入门Python爬虫基础操作!相关推荐
- 王者荣耀五周年,带你入门Python爬虫基础操作(102个英雄+326款皮肤)
简单的目录 1.概述 2.网页分析 2.1.html页面源数据 2.2.json源数据 3.数据请求 4.数据解析 4.1.html数据解析 4.1.1.bs4 4.1.2.xpath 4.2.jso ...
- 王者荣耀五周年,爬取102个英雄+326款皮肤,分析上线时间
本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理 以下文章来源于可以叫我才哥 ,作者可以叫我才哥 1.概述 <王者荣耀> ...
- 用几个最简单的例子带你入门 Python 爬虫
作者 | ZackSock 来源 | 新建文件夹X(ID:ZackSock) 头图 | CSDN下载自视觉中国 前言 爬虫一直是Python的一大应用场景,差不多每门语言都可以写爬虫,但是程序员们却独 ...
- 图解爬虫,用几个最简单的例子带你入门Python爬虫
一.前言 爬虫一直是Python的一大应用场景,差不多每门语言都可以写爬虫,但是程序员们却独爱Python.之所以偏爱Python就是因为她简洁的语法,我们使用Python可以很简单的写出一个爬虫程序 ...
- 带你入门Python爬虫
点击关注我哦 一篇文章带你了解Python爬虫 数据科学只有通过数据才能实现,而在现实世界中,数据通常不会有现成的.csv文件等你使用.你必须去自己寻找.这就是为什么爬虫对数据科学非常重要的原因. 但 ...
- rog live service是什么_王者荣耀五周年好礼送不停,玩游戏还能白嫖ROG游戏手机3?...
随着近日<王者荣耀>"同聚营地 筑梦王者"五周年活动的正式开启,相信不少玩家会有这样的感受,不知不觉王者荣耀已经走过了五个年头.虽然面世已有五载,但玩家对于这款MOBA ...
- 手把手带你入门Python爬虫(五、CSDN论坛之模型设计)
CSDN论坛之模型设计 一.CSDN论坛分析 二.模型设计与数据表设计 一.CSDN论坛分析 论坛主题列表页: 详情页: 博主个人详情页: 我们根据以上页面分析我们需要抓取的数据,然后设计模型. 二. ...
- 手把手带你入门Python爬虫(二、爬虫预备知识)
爬虫预备知识 一.计算机网络协议基础 二.Html.Css.Javascript Ajax 异步加载 GET请求 与 POST请求 3种content-type 三.爬虫基本方法 1. 采集方案分类 ...
- 手把手带你入门Python爬虫(一、工欲善其事必先利其器)
工欲善其事必先利其器 一.下载Python 二.下载安装PyCharm 三.Mysql & Navcat 四.虚拟环境的安装和配置 1. 为什么需要安装虚拟环境? 2. 使用`pip`安装`v ...
最新文章
- java property异常_Java常见的异常和解决的办法
- chromiumwebbrowser 使用_CefSharp ChromiumWebBrowser初始化完成后加载网址
- 破解制造业困局:从实际案例看制造业如何缩短订单交付周期?
- 图解HTTP学习记录(六)
- NPAPI和PPAPI开发
- git 相同commit_Git 合并多次 commit 、 删除某次 commit
- java中的IO操作之File类
- 个人成长中,关于规划设计的思考
- java怎样控制迭代周期_如何在Java中迭代日期范围?
- 跨服务器查询信息的sql
- 用SqlConnectionStringBuilder修改连接超时时间
- java js 打开摄像头_js调用网络摄像头
- brew的安装以及使用
- CAD 卸载工具,完美彻底卸载清除干净cad各种残留注册表和文件
- 启动计算机需要配置,Win10 office2007每次启动都要配置的解决方案
- 黑盒测试和白盒测试的区别
- 为什么红黑树查询快_面试被问“红黑树”,我一脸懵逼…
- 现在国内程序员的工资是什么行情?
- 什么时候线程会进入Waitting状态?
- Flutter系列之Navigator组件使用
热门文章
- 工业视觉 工业相机50问
- 屏幕显示密度dpi_像素密度( DPI )常用于屏幕显示的描述,意思是每英寸像素点的数量。_学小易找答案...
- IEEE 802简介 802.11 802.15
- 用 Python 写一个电脑监控程序
- K8S认证工程师(CKA)考试必过指南
- 纯HTML+CSS实战之制作相框效果
- 超简单的数码相框制作
- 苹果电脑双系统怎么切换 苹果电脑双系统的切换方法
- 数据库中视图和基本表的区别
- 吸顶灯怎么固定天花板_吸顶灯安装方法