浅谈Python爬虫(四)【英雄联盟人物背景故事爬取】

浅谈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.com/v1/zh_cn/champions/{}/index.json'.
                   format(json['champions'][i]['slug']))
    return h_l

接下来就可以开始测试,我们把主页的URL传进获取json的方法里,看输出结果。
代码如下。

if __name__ == '__main__':
    url = 'https://yz.lol.qq.com/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.cn网站进行分析。如图。
在这里插入图片描述
笔者用红色框框圈起来的部分,就是我们需要的数据,接下来,开始写代码。
首先获取到英雄的名字(暗黑元首)。代码如下。

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.com/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.com/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.com/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.com/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、至此,英雄联盟的数据就抓取过来了,有兴趣的小伙伴可以阅读一下英雄的背景故事,发现都很有趣。各位对代码有不同的意见或者建议的话,欢迎在文章下面留言评论或者私信我。谢谢各位的观看。
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值