数据藏在json文件中,如何爬取---以王者荣耀官网为例
此前写了一个爬虫基础案例---爬取王者荣耀英雄与技能介绍
python爬虫------王者荣耀英雄及技能爬取并保存信息到excelhttps://blog.csdn.net/knighthood2001/article/details/119514336?spm=1001.2014.3001.5501https://blog.csdn.net/knighthood2001/article/details/119514336?spm=1001.2014.3001.5501眼尖的人能发现,爬到的数据不完全(英雄缺少)。
import requests
import re
import pandas as pdbase_url = 'https://pvp.qq.com/web201605/herolist.shtml'
headers = {'referer': 'https://pvp.qq.com/','user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
response = requests.get(base_url, headers=headers)
response.encoding = 'gbk'
r = response.text
# print(response.text)
# 输出的是网页的全部源代码# 由于英雄的网址为无序,故使用re
wangzhi = re.compile(r'<a href="herodetail/(\d*).shtml" target="_blank"')
hero_xuhao_list = re.findall(wangzhi, r)
# print(hero_xuhao_list)
df = []
# 标题栏
columns = ['英雄', '被动', '技能1', '技能2', '技能3', '技能4']
for id in hero_xuhao_list:detail_url = 'https://pvp.qq.com/web201605/herodetail/{}.shtml'.format(id)# print(detail_url)response1 = requests.get(detail_url, headers=headers)response1.encoding = 'gbk'# print(response1.text) # 获得具体网址的全部源代码names = re.compile('<label>(.*?)</label>')name = names.findall(response1.text)[0]# 没有这个[0],会使得excel中的数据是['云中君'],即中文名外面还有引号和[]skills = re.compile('<p class="skill-desc">(.*?)</p>', re.S)skill = skills.findall(response1.text)# print(skill)beidong = skill[0]# print(beidong)jineng1 = skill[1]jineng2 = skill[2]jineng3 = skill[3]jineng4 = skill[4]b = df.append([name, beidong, jineng1, jineng2, jineng3, jineng4])d = pd.DataFrame(df, columns=columns)# index=False表示输出不显示索引值d.to_excel("王者荣耀英雄与技能.xlsx", index=False)
这是链接里面的源代码,方便阅读。
目录
一、网页源代码和elements的区别
1.例子
2.原因
二、解决方案
1.寻找数据存储文件
2.处理json文件
三、爬取相关数据
四、全部代码展示
五、结果展示
六、总结
一、网页源代码和elements的区别
1.例子
首先打开王者荣耀全部英雄所在的网址
英雄资料列表页-英雄介绍-王者荣耀官方网站-腾讯游戏
右键,可以看到查看网页源代码和检查-审查元素选项。
查看网页源代码(下图为部分截图)
检查---elements
查看网页源代码和检查-审查元素的页面,看着好像相同,但是如果仔细数的话,你会发现查看网页源代码中缺少了云缨-曜的英雄相关信息。
2.原因
查看源代码:别人服务器发送到浏览器的原封不动的代码。
检查-审查元素:看到的就是最终的html代码。即:源代码 + 网页js渲染 。
所以查看网页源代码和检查-审查元素中的内容不一定是一样的。
而用requests模块爬取到的response.text其实是网页源代码中的内容,未被网页js渲染。
所以此前代码是根据网页源代码爬取的,存在数据的缺失。
二、解决方案
1.寻找数据存储文件
我们需要去寻找数据存在于哪个文件中,
经查找,我们发现王者荣耀英雄存储在herolist.json文件中。
2.处理json文件
herolist.json的网址是https://pvp.qq.com/web201605/js/herolist.json
网页中显示的是乱码格式,通过下面代码可以正常显示json中的中文
import requestsurl = 'https://pvp.qq.com/web201605/js/herolist.json'
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
response = requests.get(url, headers=headers)
print(response.text)
herolist = json.loads(response.text)
通过json.loads()将其他类型的对象转为python对象,方便后续的处理。
注意load和loads的区别,loads()操作的是字符串,而load()操作的是文件流。
王者荣耀云缨-王者荣耀官网网站-腾讯游戏
王者荣耀艾琳-王者荣耀官网网站-腾讯游戏
可以发现json文件中的ename的数字就是构成具体英雄网页的数字,因此我们需要ename,
ename = []
for item in herolist:herolist_ename = item["ename"]ename.append(herolist_ename)
这段代码的作用是遍历herolist,将里面ename的值存储到ename列表中。
上面一行是herolist的内容,下面一行是ename列表的内容。
三、爬取相关数据
爬取到ename后,就可以遍历它,构造url进行爬取,爬取的步骤与之前一致。
python爬虫------王者荣耀英雄及技能爬取并保存信息到excel
base_url = "https://pvp.qq.com/web201605/herodetail/{}.shtml"
df = []
# 标题栏
columns = ['英雄', '被动', '技能1', '技能2', '技能3', '技能4']
a = 1
for i in ename:# print(i)true_url = base_url.format(i)r = requests.get(true_url, headers=headers)r.encoding = "gbk"names = re.compile('<label>(.*?)</label>')name = names.findall(r.text)[0]# 用来显示英雄个数print(str(a) + name)a += 1# 没有这个[0],会使得excel中的数据是['云中君'],即中文名外面还有引号和[]skills = re.compile('<p class="skill-desc">(.*?)</p>', re.S)skill = skills.findall(r.text)# 数据清洗beid = skill[0]beidong = beid.replace("被动:", "")jineng1 = skill[1]jineng2 = skill[2]jineng3 = skill[3]jineng4 = skill[4]b = df.append([name, beidong, jineng1, jineng2, jineng3, jineng4])d = pd.DataFrame(df, columns=columns)# index=False表示输出不显示索引值d.to_excel("王者荣耀英雄与技能.xlsx", index=False)
由于大部分英雄的被动文本中存在被动:,,而小部分没有这些内容,所以需要 beidong = beid.replace("被动:", "")这段代码进行数据整理。
四、全部代码展示
import requests
import json
import re
import pandas as pd
url = 'https://pvp.qq.com/web201605/js/herolist.json'
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
response = requests.get(url, headers=headers)
# print(response.text)
herolist = json.loads(response.text)
# print(herolist)
ename = []
for item in herolist:herolist_ename = item["ename"]ename.append(herolist_ename)
# print(ename)base_url = "https://pvp.qq.com/web201605/herodetail/{}.shtml"
df = []
# 标题栏
columns = ['英雄', '被动', '技能1', '技能2', '技能3', '技能4']
a = 1
for i in ename:# print(i)true_url = base_url.format(i)r = requests.get(true_url, headers=headers)r.encoding = "gbk"names = re.compile('<label>(.*?)</label>')name = names.findall(r.text)[0]# 用来显示英雄个数print(str(a) + name)a += 1# 没有这个[0],会使得excel中的数据是['云中君'],即中文名外面还有引号和[]skills = re.compile('<p class="skill-desc">(.*?)</p>', re.S)skill = skills.findall(r.text)# 数据清洗beid = skill[0]beidong = beid.replace("被动:", "")jineng1 = skill[1]jineng2 = skill[2]jineng3 = skill[3]jineng4 = skill[4]b = df.append([name, beidong, jineng1, jineng2, jineng3, jineng4])d = pd.DataFrame(df, columns=columns)# index=False表示输出不显示索引值d.to_excel("王者荣耀英雄与技能.xlsx", index=False)
五、结果展示
六、总结
对于数据藏在json文件中时,首先要找到相应的文件。接下来进行解析等一系列操作。
我试过lxml和bs4解析,结果发现步骤非常繁琐,lxml解析出来经常为[]。
因此还是老老实实用re吧
经过爬取我才发现王者荣耀有106个英雄,平时上号时我都不在意这些
数据藏在json文件中,如何爬取---以王者荣耀官网为例相关推荐
- python爬取饿了么评论_爬取饿了么官网数据 scrapy
展开全部 Scrapy框架的初步运用 上午刚配置好scrapy框架,32313133353236313431303231363533e58685e5aeb931333363393734下午我就迫不及待 ...
- Node 插件 爬取王者荣耀官网英雄信息,并生成数据库
文章结构 打开官网看接口地址 打开官网 游戏资料里的英雄资料,并打开后台 接下来是英雄技能 技能结构路径方便抓取 jQ的获取元素这里不细说 重头戏 抓包到到数据库 全部代码 看数据库 总结 打开官网看 ...
- Python如何爬取《王者荣耀盒子》APP
Python如何爬取<王者荣耀盒子>APP 1.安装fiddler 百度网盘下载链接:https://pan.baidu.com/s/1EjGfVrYpAaweitUxv7DS8w 提取码 ...
- python爬虫爬取王者荣耀官网全部英雄头像(源码分享)
这篇文章为源码分享,爬虫的分析过程请阅读文章 <用python爬取王者荣耀官网的英雄皮肤海报(含源码)> 源码 import requests import json from bs4 i ...
- 简单20行代码爬取王者荣耀官网1080p壁纸
简单20行代码爬取王者荣耀官网1080p壁纸 # -*- coding: utf-8 -*- # @Time : 2020/12/13 18:08 # @Author : ningfangcong i ...
- python爬虫爬取王者荣耀官网全部装备图片(源码分享)
这篇文章为源码分享,爬虫的分析过程请阅读文章 <用python爬取王者荣耀官网的英雄皮肤海报(含源码)> 源码 import requests from bs4 import Beauti ...
- Python爬取网页所需内容+王者荣耀官网
目标: 完成对王者荣耀游戏的所有英雄头像.皮肤等数据的内容爬取及图片下载,所涉及到的模块内容有requests.json.lxml.selenium.os等.王者荣耀英雄官网地址如下:https:// ...
- python爬虫遇到验证码的处理方法(以爬取中国执行信息公开网为例)
朋友们大家好,python爬虫是在学习python时比较容易上手的学习方式,爬虫的思路简要以下几点: 1.获取需要爬取页面的网址,并且对网页内容进行分析.(主要就源代码讨论,如果我们需要的内容没有在源 ...
- 文件的基本操作--利用爬取的王者荣耀李信台词进行练习
文章目录 文件的基本操作 文件打开和关闭 文件打开模式 读取/写入文件 StringIO和BytesIO 内存假文件 上下文管理 os模块 os模块 的目录及文件操作 os.path模块 小练习-爬取 ...
最新文章
- java1到100的数组_用java定义一个数组,长度为3: 1)循环输入数组元素值(元素值在1到100之间)...
- java中的多线程有什么意义_Java多线程与并发面试题(小结)
- Java数组与容器类分析资料--数组、List和Set、Map-asp.net关注
- weblogic集群部署与负载均衡_集群,负载均衡,分布式的讲解和多台服务器代码同步...
- python2打印字符串_Python 3基础教程2-打印语句和字符串
- 将 DataDirect ODBC 驱动程序与 Python 和 pyodbc 一起使用
- 中国互联网公司大盘点
- android模拟器安装教程视频教程,安卓模拟器安装教程 安卓模拟器怎么安装
- WPS文字表格自动填充序号
- 关于WPF你应该知道的2000件事
- 样本切分器—利用python按比例均匀切分样本
- word中那些奇怪的数学符号字体是怎么打出来的
- 区块链开发中使用的最流行的编程语言
- mongoTemplate结合Criteria实现分页、模糊、二级嵌套和时间范围查询等
- 苹果申请新专利,iPhone或取消刘海设计
- 我们为什么需要仿真服务机器人?
- iPhone 14 Pro/Max出大问题:从旧款机型传输数据后卡死黑屏无法开机!
- 蚁群算法Ant Colony Optimization-ACO
- P3084 [USACO13OPEN]照片Photo
- VisualSVN server 备份恢复