|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 gopythoner 于 2017-3-26 18:40 编辑
各位玩英雄联盟的鱼油,有没有想过爬LOL国服排行榜趴下来分析一下?
楼主就趴下来了...
本着没代码说个鸡毛掸子的精神,分享一下整个爬取的过程吧
第一步:打开多玩英雄联盟盒子网页版
(PS:说道盒子楼主表示还有点小感伤啊,当初盒子是多么牛逼的存在啊,免费的皮肤使用,想用啥就用啥,后来被官方封杀了,可惜啊)
盒子主页英雄排名榜
第二步:使用抓包工具,最简单的就是浏览器自带的F12了,找到数据文件的api
没错,这个过程凭经验就能找到准确的API了,是个JS文件加载的(一般这种实时数据都是JS加载的,这个不用怀疑)
数据是JSON格式的,这种数据最好解析了,如图所示:
左边就是相关JS文件,右边是文件内容,正好是需要的玩家数据,而且数据比实际显示的还多,把这些数据拿下里就什么都有了
第三步:实现翻页和分大区翻页
众所周知,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的代码如下:
- # -*- coding: utf-8 -*-
- # Define here the models for your scraped items
- #
- # See documentation in:
- # http://doc.scrapy.org/en/latest/topics/items.html
- import scrapy
- class LolboxItem(scrapy.Item):
- # define the fields for your item here like:
- # name = scrapy.Field()
- # 排名
- rank = scrapy.Field()
- # ID
- user_id = scrapy.Field()
- # 昵称
- name = scrapy.Field()
- # 服务器1
- zone1 = scrapy.Field()
- # 服务器2
- zone2 = scrapy.Field()
- # 段位
- game_name = scrapy.Field()
- # 胜点
- game_points = scrapy.Field()
- # 战斗力
- box_score = scrapy.Field()
复制代码
spiders.py的代码如下:
- from LOLbox.items import LolboxItem
- import scrapy
- import json
- class LOLBOX(scrapy.Spider):
- name = "lolbox"
- start_urls = ["http://lolbox.duowan.com/staticPub/v3.1/rankScoreRank.html"]
- def parse(self, response):
- # 获取所有大区的代码,因为教育网的信息不存在,因此去掉教育网
- zones = response.xpath("//ul[@id='serverFilterUl']/li")[:-1]
- # print(zones)
- for i in zones:
- zone_id = i.xpath("@data-zone").extract_first().strip()
- # print(zone_id)
- for page in range(1,101):
- info_url = "http://api.lolbox.duowan.com/api/v2/rank/ranked/{}/?page_num={}&page_items=10".format(zone_id,page)
- yield scrapy.Request(info_url,callback=self.parse_page)
- def parse_page(self, response):
- infos = json.loads(response.text)['results']
- for info in infos:
- item = LolboxItem()
- item['rank'] = info['idx']
- item['user_id'] = info['player']['user_id']
- item['name'] = info['player']['pn']
- item['zone1'] = info['player']['game_zone']['server_name']
- item['zone2'] = info['player']['game_zone']['alias']
- item['game_name'] = info['player']['tier_rank']['tier']['full_name_cn']
- item['game_points'] = info['player']['tier_rank']['league_points']
- item['box_score'] = info['player']['box_score']
- # print(item)
- print(item['zone1']+item['zone2'],item['game_name']+str(item['game_points']))
- the_list = [str(item['rank']),str(item['user_id']),str(item['name']),str(item['box_score']),item['game_name'],
- str(item['game_points']),item['zone1'],item['zone2']]
- the_str = ",".join(the_list)+"\n"
- try:
- with open("lol.csv","a") as f:
- f.write(the_str)
- # 解决'gbk' codec can't encode character '\u3164' in position 0: illegal multibyte sequence这种编码异常
- # 大部分可以用"utf-8"编解码成功,但是极少数需要用"gbk"
- except UnicodeEncodeError:
- with open("lol.csv","a") as f:
- f.write(the_str.encode("gbk","ignore").decode("gbk"))
- except Exception as e:
- print(e)
复制代码
其中需要在配置文件中把USER-AGENT开启,不然爬虫会很慢,这个是头大家应该知道吧
后记:
我爬了每个区100页数据,也就是每个区前1000的玩家,总计26个区,26000条数据一个不差
爬虫很快就爬完了,大概用时不到一分钟吧
数据表格如下,分析的表格的数据看个人需要,我就不作展示了
|
评分
-
查看全部评分
|