马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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条数据一个不差
爬虫很快就爬完了,大概用时不到一分钟吧
数据表格如下,分析的表格的数据看个人需要,我就不作展示了
|