浅谈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 redef 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_ldef 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 dataif __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、至此,英雄联盟的数据就抓取过来了,有兴趣的小伙伴可以阅读一下英雄的背景故事,发现都很有趣。各位对代码有不同的意见或者建议的话,欢迎在文章下面留言评论或者私信我。谢谢各位的观看。

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

  1. python 模拟浏览器selenium_浅谈python爬虫使用Selenium模拟浏览器行为

    前几天有位微信读者问我一个爬虫的问题,就是在爬去百度贴吧首页的热门动态下面的图片的时候,爬取的图片总是爬取不完整,比首页看到的少.原因他也大概分析了下,就是后面的图片是动态加载的.他的问题就是这部分动 ...

  2. 如何用python抓取文献_浅谈Python爬虫技术的网页数据抓取与分析

    浅谈 Python 爬虫技术的网页数据抓取与分析 吴永聪 [期刊名称] <计算机时代> [年 ( 卷 ), 期] 2019(000)008 [摘要] 近年来 , 随着互联网的发展 , 如何 ...

  3. 浅谈Python爬虫(五)【网易云热评爬取实例】

    浅谈Python爬虫(五) 目的:爬取网易云歌单所有歌曲的信息及热评 Python环境:3.7 编译器:PyCharm2019.1.3专业版 存储格式:JSON 1.分析网页 进入网易云音乐首页,点击 ...

  4. Python爬虫实例 wallhaven网站高清壁纸爬取。

    文章目录 Python爬虫实例 wallhaven网站高清壁纸爬取 一.数据请求 1.分析网页源码 2.全网页获取 二.数据处理 1.提取原图所在网页链接 2.获取高清图片地址及title 三.下载图 ...

  5. Python爬虫:最牛逼的 selenium爬取方式!

    Python爬虫:最牛逼的 selenium爬取方式! 作为一个男人 在最高光的时刻 这是小编准备的python爬虫学习资料,加群:700341555即可免费获取! Python爬虫:最牛逼的 sel ...

  6. Python爬虫:运用多线程、IP代理模块爬取百度图片上小姐姐的图片

    Python爬虫:运用多线程.IP代理模块爬取百度图片上小姐姐的图片 1.爬取输入类型的图片数量(用于给用户提示) 使用过百度图片的读者会发现,在搜索栏上输入关键词之后,会显示出搜索的结果,小编想大多 ...

  7. python爬虫--Scrapy框架--Scrapy+selenium实现动态爬取

    python爬虫–Scrapy框架–Scrapy+selenium实现动态爬取 前言 本文基于数据分析竞赛爬虫阶段,对使用scrapy + selenium进行政策文本爬虫进行记录.用于个人爬虫学习记 ...

  8. Python爬虫之scrapy框架360全网图片爬取

    Python爬虫之scrapy框架360全网图片爬取 在这里先祝贺大家程序员节快乐,在此我也有一个好消息送给大家,本人已开通了微信公众号,我会把资源放在公众号上,还请大家小手动一动,关注过微信公众号, ...

  9. Python爬虫系列之抖音热门视频爬取

    Python爬虫系列之抖音热门视频爬取 主要使用requests库以及手机抓包工具去分析接口 该demo仅供参考,已经失效,需要抖音2019年5月最新所有接口请点击这里获取 抖音资源获取接口文档请点击 ...

  10. python中内置的四种数值类型为_浅谈python语言四种数值类型

    Python语言支持四种不同的数值类型,包括int(整数)long(长整数)float(浮点实际值)complex (复数),本文章向码农介绍python 四种数值类型,需要的朋友可以参考一下.希望对 ...

最新文章

  1. 可删除任意位置数据的堆
  2. NeHe OpenGL教程 第十课:3D世界
  3. update se_Java SE 7 Update 25 –发行说明进行了解释。
  4. 织梦 php 传值,php获取post参数的几种方式
  5. Java笔记-Spring Boot中Spring WS WS-Addressing中@Action实例
  6. 怎样给oracle表设置序列,Oracle的sequence序列在hibernate中的配置方法
  7. C/C++线程与多线程工作笔记0006---VC++中_T()的作用
  8. python增删改查mysql_Python操作MySQL(增删改查)
  9. 阿里云高级技术专家王晨:云原生数据库PolarDB技术解密
  10. zabbix监控nginx的状态
  11. matlab能替代几何画板吗,比几何画板更强大的工具软件GeoGebra,数学老师值得拥有...
  12. 计算机常出现的问题及解决办法,电脑发生故障的常见现象和解决方法
  13. 计算机病毒互助百科,病毒百科——计算机病毒分类
  14. web网站加速之CDN技术原理
  15. 韩博士一键重装win8系统的图文步骤
  16. 减肥--应该是种轻松愉快的经历
  17. 企业级大数据平台智能运维好帮手——星环科技多模数据平台监控软件Aquila Insight
  18. 论文不记之《StyleNet: Generating Attractive Visual Captions with Styles》
  19. 使用ssr退出后,电脑能连上无线网,但是不能上网的解决方法
  20. 关于手机号码有效的验证

热门文章

  1. 一元四次方程c语言程序编写,一元高次方程数值解法C程序实现探讨..doc
  2. LAYA_展示富文本
  3. Spoon Kettle 输入之 excel 输入详解(Microsoft Excel input)
  4. 如何使用kettle将EXCEL导入数据库
  5. petalinux 设备树驱动GPIOLED
  6. 【计算机基础】五笔字根分解图
  7. HTML渐变背景不重复,在身体上设置的CSS3渐变背景不会拉伸,而是重复?
  8. 张亮:十万级并发任务调度框架 ElasticJob 的定位与设计理念
  9. matlab 窄带通,MATLAB 窄带随机过程
  10. unity帧动画事件多次播放