鱼C论坛

 找回密码
 立即注册
查看: 6377|回复: 14

[原创] 爬虫爬取LOL所有大区的王者数据

[复制链接]
发表于 2017-3-26 18:37:52 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 gopythoner 于 2017-3-26 18:40 编辑

各位玩英雄联盟的鱼油,有没有想过爬LOL国服排行榜趴下来分析一下?
楼主就趴下来了...
本着没代码说个鸡毛掸子的精神,分享一下整个爬取的过程吧

第一步:打开多玩英雄联盟盒子网页版
(PS:说道盒子楼主表示还有点小感伤啊,当初盒子是多么牛逼的存在啊,免费的皮肤使用,想用啥就用啥,后来被官方封杀了,可惜啊)

盒子主页英雄排名榜

盒子主页英雄排名榜


第二步:使用抓包工具,最简单的就是浏览器自带的F12了,找到数据文件的api
没错,这个过程凭经验就能找到准确的API了,是个JS文件加载的(一般这种实时数据都是JS加载的,这个不用怀疑)
数据是JSON格式的,这种数据最好解析了,如图所示:
左边就是相关JS文件,右边是文件内容,正好是需要的玩家数据,而且数据比实际显示的还多,把这些数据拿下里就什么都有了
QQ截图20170326181726.png

第三步:实现翻页和分大区翻页
众所周知,LOL有19个电信区和7个网通区加1个教育网专区
这这个JS地址http://api.lolbox.duowan.com/api/v2/rank/ranked/dx1/?page_num=1&page_items=10中,dx1代表了电信1区,同理改成wt1就是网通1区,page_num=1就不用说了吧,这个是翻页,最多可以翻1000页,也就是每个区10000条数据,可以自己设置循环来。
不过我得到各大区不是用循环的,而是先爬主页,通过主页的大区选择框来提取大区的ID

第四步:提取信息,既然是Json文件,那直接import json就行了,其他的按照字典来提取
具体提取信息看个人需要,看我代码就行

第五步:保存信息,我选择的最简单的CSV表格,也可以用数据库

第六步:数据整理和分析
这一步就是看自己要分析的方向了,比如可以:
1、根据玩家昵称来分析LOL玩家高分段中在各个直播平台的分布占比,条形图展示
2、根据大区的段位来分析每个大区的综合实力差距,条形图展示
3、可以进一步提升爬虫的信息,因为每个玩家都有一个ID,可以通过ID获取玩家最近比赛的赛况
其他可以自己想。。。

代码如下:
(我是用Scrapy爬的,所以只需要展示Items.py  和Spider.py中的文件代码就行,其他的不需要改动)

Items.py的代码如下:
  1. # -*- coding: utf-8 -*-

  2. # Define here the models for your scraped items
  3. #
  4. # See documentation in:
  5. # http://doc.scrapy.org/en/latest/topics/items.html

  6. import scrapy


  7. class LolboxItem(scrapy.Item):
  8.     # define the fields for your item here like:
  9.     # name = scrapy.Field()
  10.     # 排名
  11.     rank = scrapy.Field()
  12.     # ID
  13.     user_id = scrapy.Field()
  14.     # 昵称
  15.     name = scrapy.Field()
  16.     # 服务器1
  17.     zone1 = scrapy.Field()
  18.     # 服务器2
  19.     zone2 = scrapy.Field()
  20.     # 段位
  21.     game_name = scrapy.Field()
  22.     # 胜点
  23.     game_points = scrapy.Field()
  24.     # 战斗力
  25.     box_score = scrapy.Field()
复制代码


spiders.py的代码如下:
  1. from LOLbox.items import LolboxItem
  2. import scrapy
  3. import json

  4. class LOLBOX(scrapy.Spider):
  5.     name = "lolbox"
  6.     start_urls = ["http://lolbox.duowan.com/staticPub/v3.1/rankScoreRank.html"]

  7.     def parse(self, response):
  8.         # 获取所有大区的代码,因为教育网的信息不存在,因此去掉教育网
  9.         zones = response.xpath("//ul[@id='serverFilterUl']/li")[:-1]
  10.         # print(zones)
  11.         for i in zones:
  12.             zone_id = i.xpath("@data-zone").extract_first().strip()
  13.             # print(zone_id)
  14.             for page in range(1,101):
  15.                 info_url = "http://api.lolbox.duowan.com/api/v2/rank/ranked/{}/?page_num={}&page_items=10".format(zone_id,page)
  16.                 yield scrapy.Request(info_url,callback=self.parse_page)

  17.     def parse_page(self, response):
  18.         infos = json.loads(response.text)['results']
  19.         for info in infos:
  20.             item = LolboxItem()
  21.             item['rank'] = info['idx']
  22.             item['user_id'] = info['player']['user_id']
  23.             item['name'] = info['player']['pn']
  24.             item['zone1'] = info['player']['game_zone']['server_name']
  25.             item['zone2'] = info['player']['game_zone']['alias']
  26.             item['game_name'] = info['player']['tier_rank']['tier']['full_name_cn']
  27.             item['game_points'] = info['player']['tier_rank']['league_points']
  28.             item['box_score'] = info['player']['box_score']
  29.             # print(item)
  30.             print(item['zone1']+item['zone2'],item['game_name']+str(item['game_points']))
  31.             the_list = [str(item['rank']),str(item['user_id']),str(item['name']),str(item['box_score']),item['game_name'],
  32.                         str(item['game_points']),item['zone1'],item['zone2']]
  33.             the_str = ",".join(the_list)+"\n"
  34.             try:
  35.                 with open("lol.csv","a") as f:
  36.                     f.write(the_str)
  37.             # 解决'gbk' codec can't encode character '\u3164' in position 0: illegal multibyte sequence这种编码异常
  38.             # 大部分可以用"utf-8"编解码成功,但是极少数需要用"gbk"
  39.             except UnicodeEncodeError:
  40.                 with open("lol.csv","a") as f:
  41.                     f.write(the_str.encode("gbk","ignore").decode("gbk"))
  42.             except Exception as e:
  43.                 print(e)
复制代码


其中需要在配置文件中把USER-AGENT开启,不然爬虫会很慢,这个是头大家应该知道吧

后记:
我爬了每个区100页数据,也就是每个区前1000的玩家,总计26个区,26000条数据一个不差
爬虫很快就爬完了,大概用时不到一分钟吧
数据表格如下,分析的表格的数据看个人需要,我就不作展示了
QQ截图20170326183703.png





评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
新手·ing + 2 + 2 我尽力了,虽然看不懂

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-3-27 22:05:24 | 显示全部楼层
支持
这帖子必须顶起来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-27 22:22:53 | 显示全部楼层
实用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-3-27 22:25:16 | 显示全部楼层
学以致用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-28 17:57:37 | 显示全部楼层

感谢,其实对Scrapy不是很熟,但是用起来确实很爽,速度快的惊人
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2017-3-29 15:54:09 | 显示全部楼层
我刚开始接触python。0基础,要达到你这水平需要多久呢
,每天有效学习3个小时


要是能到写后台的程度,需要多久呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-29 17:27:18 | 显示全部楼层
厉害厉害,我要加油
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-29 17:59:23 | 显示全部楼层
lyzklkl 发表于 2017-3-29 15:54
我刚开始接触python。0基础,要达到你这水平需要多久呢
,每天有效学习3个小时

我的水平很差的
我也只是自学,自己并不是搞程序的,
学这个还是因为有一次让我们公司IT帮忙爬一些数据,他们居然不会弄(因为他们用的PHP,可能不方便吧),我就自学了python,自己弄下来了,后来我们主管还让IT来学习我怎么爬数据,笑死我了
我是去年12月份开始的,买了一本书,看了一点就没看了,因为都是老教程2.7的,不过书留着来查很有用
之前是我主要是上下班的时间用手机看看别人写的文章,然后下班了之后去自己敲代码试试
我只学爬虫,其他没有涉及,暂时感觉大部分网站的信息爬起来还算比较容易吧
网上很多资料可以看的,最推荐的是知乎,博客园
遇到问题,解决问题,再遇到新的问题解决新的问题,大概就是这样吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-29 18:16:56 | 显示全部楼层
gopythoner 发表于 2017-3-29 17:59
我的水平很差的
我也只是自学,自己并不是搞程序的,
学这个还是因为有一次让我们公司IT帮忙 ...

大人威武啊。我是搞UI,我现在想转后台,听说python最简单,就开始学习了,不知道这种生活要维持多久
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-29 20:11:27 | 显示全部楼层
可以了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-19 15:09:12 | 显示全部楼层
本帖最后由 小剑剑 于 2017-4-19 15:11 编辑

py文件上传一下呗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-19 15:13:46 | 显示全部楼层
小剑剑 发表于 2017-4-19 15:09
py文件上传一下呗

我把代码已经分享了啊,文件没必要吧,只要有我分享的代码直接复制就可以用的
不过因为是Scrapy写的,所以,前提是自己要知道怎么用Scrapy爬虫
只要会了,按照我上面的代码修改2个代码文件就可以运行了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-19 21:07:40 | 显示全部楼层
6666
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-4-21 10:10:20 | 显示全部楼层
lyzklkl 发表于 2017-3-29 18:16
大人威武啊。我是搞UI,我现在想转后台,听说python最简单,就开始学习了,不知道这种生活要维持多久

大兄弟  你的头像快闪瞎我将来用来爬软妹子图片的钛合金眼
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-27 14:39:15 | 显示全部楼层
厉害厉害 赞一个  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-26 20:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表