admin管理员组文章数量:1619183
浅谈Python爬虫(四)
英雄联盟是国内乃至全球首屈一指的MOBA游戏,深受广大玩家的喜爱。而他之所以火热的原因,主要是因为其高难度的操作性和竞技性,但是不可否认的是,有部分玩家是因为其震撼恢弘的世界观而入坑(笔者就是)。今天,我们一起看一下英雄背后的故事。
1、定位数据
首先,我们进入到英雄联盟的官网,鼠标移动到游戏资料的位置,然后依次点击联盟宇宙–>英雄,即可进入到这个页面。如图。
随便点击一个英雄的头像,即可进入详细页面。如图。
我们需要的数据有:英雄名字(辛德拉),英雄昵称(暗黑元首), 英雄定位(法师),上线时间和英雄的传记。
我们按下F12进入开发者模式,点击NetWork,按下F5刷新,点击Doc,看有没有我们需要的数据。
检查之后不难发现,Doc中并没有我们需要的数据,所以,我们转战XHR。依次点击每一个数据,发现在第二个名为index.json的里面是我们的数据,查看其URL。
然后换一个人物查看,发现他的URL是这样的。
可以发现,这两个URL只有index字段前面的一个字段不同。其实就是英雄的英文名字。我们现在的任务就是获取到所有英雄的英文名字。我们回到主界面,同样的步骤,发现数据在XHR里面的index.json里面。他的链接如下。
我们可以通过解析这个页面来获取所有英雄的英文名字,然后拼凑成每个英雄详细信息的URL,从而达到我们的目的。
2.代码编写
1、获取到英雄名字并获得所有英雄的URL
我们打开PyCharm,新建一个项目。第一步先导入我们必须的库,由于这次的数据都存在json中,所以不需要lxml库了。
import requests # 解析网页
import pandas as pd # 数据处理
import re # 进行正则操作
首先,我们要获取到所有英雄的名字,把主页的index.json的response的数据复制,然后进入json数据解析网站,把数据粘贴进去,分析需要的数据所在的位置。如图。
不难发现,英雄名字在champions字段的slug字段里面,接下来,我们用代码实现这个逻辑。
代码如下。
首先定义一个获取json数据的方法。
def get_json(url):
headers = {'User=Agent': 'Mozilla/5.0'}
r_j = requests.get(url, headers=headers)
return r_j.json()
然后写一个获取所有英雄链接的方法。
def get_hero_url_list(json):
h_l = []
for i in range(len(json['champions'])):
h_l.append('https://yz.lol.qq/v1/zh_cn/champions/{}/index.json'.
format(json['champions'][i]['slug']))
return h_l
接下来就可以开始测试,我们把主页的URL传进获取json的方法里,看输出结果。
代码如下。
if __name__ == '__main__':
url = 'https://yz.lol.qq/v1/zh_cn/search/index.json'
all_hero_json = get_json(url)
print(all_hero_json)
打印输出,可以发现结果正确。然后开始获取所有英雄的链接。
代码如下。
hero_url_list = get_hero_url_list(all_hero_json)
print(hero_url_list)
打印输出,可以发现结果正确。然后开始最重要的部分,获取英雄信息部分代码的编写。
进入英雄详细页面,查看其json数据,并粘贴到json网站进行分析。如图。
笔者用红色框框圈起来的部分,就是我们需要的数据,接下来,开始写代码。
首先获取到英雄的名字(暗黑元首)。代码如下。
name = json['champion']['name']
然后英雄的别称(辛德拉)。代码如下。
other_name = json['champion']['title']
然后上线时间(2012-09-13)。代码如下。
release_date = json['champion']['release-date']
然后英雄故事。代码如下。
hero_tale = json['champion']['biography']['full']
然后英雄定位,由于英雄定位不止一个,所以我们用 / 连接多个定位。代码如下。
roles = []
for r in range(len(json['champion']['roles'])):
roles.append(json['champion']['roles'][r]['name'])
roles = '/'.join(roles)
我们依次打印输出上面的数据,发现英雄故事里面有无效的字符
和<\/p>,所以我们用正则表达式将其替换。代码如下。
hero_tale = re.sub('<p>|<\\/p>', '', json['champion']['biography']['full'])
然后再打印输出判断,数据正确。
我们把上面的代码定义成一个方法,并返回一个DataFrame类型的数据。代码如下。
def get_hero_info(json):
name = json['champion']['name']
other_name = json['champion']['title']
release_date = json['champion']['release-date']
roles = []
for r in range(len(json['champion']['roles'])):
roles.append(json['champion']['roles'][r]['name'])
roles = '/'.join(roles)
hero_tale = re.sub('<p>|<\\/p>', '', json['champion']['biography']['full'])
data = pd.DataFrame({'name': name,
'other_name': other_name,
'release_date': release_date,
'roles': roles,
'hero_tale': hero_tale}, index=[0])
return data
接下来,我们测试一遍,上面的方法能否正确的给我们返回英雄信息。代码如下。
if __name__ == '__main__':
url = 'https://yz.lol.qq/v1/zh_cn/search/index.json'
all_hero_json = get_json(url)
hero_url_list = get_hero_url_list(all_hero_json)
data = get_hero_info(hero_url_list[0])
打印输出,发现数据正确。然后开始批量获取。这里笔者采取数据存储的方法是先定义一个空的DataFrame数据,然后每获取一个英雄的数据就附加进去,最后存储。方法不唯一,各位有好的方法的话可以不用这个。代码如下。
if __name__ == '__main__':
url = 'https://yz.lol.qq/v1/zh_cn/search/index.json'
all_hero_json = get_json(url)
hero_url_list = get_hero_url_list(all_hero_json)
data = get_hero_info(hero_url_list[0])
data = pd.DataFrame(columns=['name', 'other_name', 'release_date', 'roles', 'hero_tale'])
for i in range(len(hero_url_list)):
hero_json = get_json(hero_url_list[i])
hero_data = get_hero_info(hero_json)
data = pd.concat([data, hero_data])
最后存储到本地。代码如下。
data.to_json('F://SpiderData//LOL.json', orient='records', force_ascii=False)
我们去本地打开数据文件,可以发现数据正确。
完整的代码如下。
import requests
import pandas as pd
import re
def get_json(url):
headers = {'User=Agent': 'Mozilla/5.0'}
r_j = requests.get(url, headers=headers)
return r_j.json()
def get_hero_url_list(json):
h_l = []
for i in range(len(json['champions'])):
h_l.append('https://yz.lol.qq/v1/zh_cn/champions/{}/index.json'.
format(json['champions'][i]['slug']))
return h_l
def get_hero_info(json):
name = json['champion']['name']
other_name = json['champion']['title']
release_date = json['champion']['release-date']
roles = []
for r in range(len(json['champion']['roles'])):
roles.append(json['champion']['roles'][r]['name'])
roles = '/'.join(roles)
hero_tale = re.sub('<p>|<\\/p>', '', json['champion']['biography']['full'])
data = pd.DataFrame({'name': name,
'other_name': other_name,
'release_date': release_date,
'roles': roles,
'hero_tale': hero_tale}, index=[0])
return data
if __name__ == '__main__':
url = 'https://yz.lol.qq/v1/zh_cn/search/index.json'
all_hero_json = get_json(url)
hero_url_list = get_hero_url_list(all_hero_json)
data = get_hero_info(hero_url_list[0])
data = pd.DataFrame(columns=['name', 'other_name', 'release_date', 'roles', 'hero_tale'])
for i in range(len(hero_url_list)):
hero_json = get_json(hero_url_list[i])
hero_data = get_hero_info(hero_json)
data = pd.concat([data, hero_data])
data.to_json('F://SpiderData//LOL.json', orient='records', force_ascii=False)
3、至此,英雄联盟的数据就抓取过来了,有兴趣的小伙伴可以阅读一下英雄的背景故事,发现都很有趣。各位对代码有不同的意见或者建议的话,欢迎在文章下面留言评论或者私信我。谢谢各位的观看。
版权声明:本文标题:浅谈Python爬虫(四)【英雄联盟人物背景故事爬取】 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/xitong/1728792879a1173885.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论