1.总目标:爬取 2019 年英雄联盟职业联赛夏季赛常规赛战队每场比赛部分数据
今日目标:爬取每场对局大场的部分比赛数据(再稍微介绍一下这个比赛的模式,每大场比赛为三局两胜)
2.网址:https://www.scoregg.com/schedule
3.打开网址我们关注下面这部分内容:
这里每切换一次可以展示 7 天的比赛数据,类似于分页,然后每页 7 条(也可以理解为每页展示 7 天的数据)数据。
4.图中【查看日历】可以选择想查看的日期,【赛事筛选】选择你要查看的比赛,这里我们选择【2019LPL 夏季赛】
这个夏季赛的比赛日期是从 2019.6.1 开始到 2019.8.18 结束,如果你选择到 6.1 查看,你会发现数据是从 2019.5.27 开始的,当然 5.27 是没有比赛的,5.27-5.31 都没有比赛,返回的数据也是空。
5.说这么多为了什么,主要是我发现通过发送请求获取到的数据并没有单日的,每次都是返回 7 条数据,就是说你请求 2019.5.27 会返回 2019.5.27-2019.6.2 的比赛数据。我把请求的日期做一下分组,每组 7 个,分组后的日期如下:
可能你会问这个日期格式比较奇怪为什么不是 yyyy-MM-dd,这个是因为请求的时候日期参数就是我上图中的这种格式。
6.我们先完成大局的比赛数据爬取,就是大局谁赢了,两个队伍各赢了几局,以及比赛日期等一些数据
数据库表设计,id 不设置自增,爬取到的数据回包含比赛 ID,我们直接使用就好。关于“win_team_id”说明:我们要爬取这个网站关于 LPL 所有队伍的基本信息(这部分不是最重要的,后续我会贴出来代码)
“win_team_id”对应上图中的 team_id
7.下面进入代码部分了,我们使用 Scrapy 框架,主要是刚刚学了这个框架,别的框架(不会 😰 )以后学了再尝试
① 创建项目 scrapy startproject 项目名,项目结构如下:
②"data_handle.py"是我自己创建的主要的爬取逻辑要在这个文件里面完成
③ 关于 data_handle.py 代码:
import scrapy
import bs4
import datetime
import json
from ..items import dataMatchParent
def dateRange(beginDate, endDate):
dates = []
dates_return = []
dt = datetime.datetime.strptime(beginDate, "%Y-%m-%d")
date = beginDate[:]
while date <= endDate:
dates.append(date)
dt = dt + datetime.timedelta(1)
date = dt.strftime("%Y-%m-%d")
# return dates
for i in range(len(dates)):
date_new = dates[i].split("-")
dates_return.append('%d-%d-%d' % (int(date_new[0]), int(date_new[1]), int(date_new[2])))
return dates_return
class dataHandle(scrapy.Spider):
name = 'LPL2019SummerLeague'
allowed_domain = ['www.scoregg.com']
#循环发送请求,按照分页来理解,就是每页7条数据,一共12页,但是这个有空值情况(没有比赛的时候)
def start_requests(self):
all_dates_list=[]
#因为请求的参数最关键的就是日期参数,我们率先处理日期参数
dates_list = dateRange("2019-05-27","2019-08-18")
#将返回的日期参数分组,每组7个
for k in range(0,len(dates_list),7):
seven_dates_list = []
for j in range(k,k+7):
seven_dates_list.append(dates_list[j])
all_dates_list.append(seven_dates_list)
#参数组装,date参数是最关键的,通过循环给date不同的值进行获取数据
params = {
"api_path": "services/match/web_math_list.php",
"gameID": "1",
"date": "",
"tournament_id": "120",
"api_version": "9.9.9",
"platform": "web"
}
for i in range(len(all_dates_list)):
params["date"]=all_dates_list[i][0]
print('---------------')
print(params)
yield scrapy.FormRequest(
url = "https://www.scoregg.com/services/api_url.php",
formdata=params,
callback=self.parse
)
def parse(self,response):
print('--------------------')
data_dic = json.loads(response.text)["data"]["list"]
for key in data_dic:
if data_dic[key]:
info_list=data_dic[key]["info"]["120"]
match_data_list = info_list['list']
for m in range(len(match_data_list)):
win_team_id = ""
match_id = int(match_data_list[m]["match_id"])
team_id_a = match_data_list[m]["teamID_a"]
team_id_b = match_data_list[m]['teamID_b']
team_a_win = match_data_list[m]['team_a_win']
team_b_win = match_data_list[m]["team_b_win"]
if int(team_a_win) > int(team_b_win):
win_team_id = team_id_a
else:
win_team_id = team_id_b
#时间要转换为数据库的datetime格式
start_date_time_str = match_data_list[m]['start_date']+" "+match_data_list[m] ['start_time']
start_date_time_dt = datetime.datetime.strptime(start_date_time_str,'%Y-%m-%d %H:%M')
match_attr_id = match_data_list[m]["tournamentID"]
item_match_p = dataMatchParent()
item_match_p["match_id"] = match_id
item_match_p["team_id_a"] = team_id_a
item_match_p["team_id_b"] = team_id_b
item_match_p["team_a_win"] = team_a_win
item_match_p["team_b_win"] = team_b_win
item_match_p["match_attr_id"] = match_attr_id
item_match_p["start_date_time"] = start_date_time_dt
item_match_p["win_team_id"] = win_team_id
yield item_match_p
④ 爬取结果:
⑤ 在 pipelines.py 中进行数据库操作
⑥ 关于 Scrapy 框架:
Scrapy 框架 的核心是 Scrapy Engine(引擎)负责统一调度框架里面的各个工具,这些工具有:
Scheduler(调度器),负责处理引擎发送过来的 requests 对象即网页请求的相关信息集合,包括 params,data,cookies,request headers…等),会把请求的 url 以有序的方式排列成队,并等待引擎来提取(功能上类似于 gevent 库的 queue 模块);
Downloader(下载器)则是负责处理引擎发送过来的 requests,进行网页爬取,并将返回的 response(爬取到的内容)交给引擎。它对应的是爬虫流程【获取数据】这一步。
Spiders(爬虫)主要任务是创建 requests 对象和接受引擎发送过来的 response(Downloader 爬取到的内容),从中解析并提取出有用的数据。它对应的是爬虫流程【解析数据】和【提取数据】这两步。
Item Pipeline(数据管道)只负责存储和处理 Spiders 提取到的有用数据。这个对应的是爬虫流程【存储数据】这一步。
Downloader Middlewares(下载中间件)的工作相当于下载器的秘书,比如会提前对引擎大 boss 发送的诸多 requests 做出处理。
Spider Middlewares(爬虫中间件)则相当于爬虫的秘书,比如会提前接收并处理 Scrapy Engine 发送来的 response,过滤掉一些重复无用的东西。
到此今日目标就完成了,下一步我们会爬取每一大场里面的小场次比赛数据。敬请期待。。。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于