python 爬取英雄联盟比赛数据(二)-- 数据爬取(一)

本贴最后更新于 1790 天前,其中的信息可能已经水流花落

null

1.总目标:爬取 2019 年英雄联盟职业联赛夏季赛常规赛战队每场比赛部分数据
今日目标:爬取每场对局大场的部分比赛数据(再稍微介绍一下这个比赛的模式,每大场比赛为三局两胜)

2.网址:https://www.scoregg.com/schedule

3.打开网址我们关注下面这部分内容:
null
这里每切换一次可以展示 7 天的比赛数据,类似于分页,然后每页 7 条(也可以理解为每页展示 7 天的数据)数据。
4.图中【查看日历】可以选择想查看的日期,【赛事筛选】选择你要查看的比赛,这里我们选择【2019LPL 夏季赛】
这个夏季赛的比赛日期是从 2019.6.1 开始到 2019.8.18 结束,如果你选择到 6.1 查看,你会发现数据是从 2019.5.27 开始的,当然 5.27 是没有比赛的,5.27-5.31 都没有比赛,返回的数据也是空。
null
5.说这么多为了什么,主要是我发现通过发送请求获取到的数据并没有单日的,每次都是返回 7 条数据,就是说你请求 2019.5.27 会返回 2019.5.27-2019.6.2 的比赛数据。我把请求的日期做一下分组,每组 7 个,分组后的日期如下:
null
可能你会问这个日期格式比较奇怪为什么不是 yyyy-MM-dd,这个是因为请求的时候日期参数就是我上图中的这种格式。
6.我们先完成大局的比赛数据爬取,就是大局谁赢了,两个队伍各赢了几局,以及比赛日期等一些数据
数据库表设计,id 不设置自增,爬取到的数据回包含比赛 ID,我们直接使用就好。关于“win_team_id”说明:我们要爬取这个网站关于 LPL 所有队伍的基本信息(这部分不是最重要的,后续我会贴出来代码)
null
null
“win_team_id”对应上图中的 team_id
7.下面进入代码部分了,我们使用 Scrapy 框架,主要是刚刚学了这个框架,别的框架(不会 😰 )以后学了再尝试
① 创建项目 scrapy startproject 项目名,项目结构如下:
null
②"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



④ 爬取结果:
null
⑤ 在 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,过滤掉一些重复无用的东西。

到此今日目标就完成了,下一步我们会爬取每一大场里面的小场次比赛数据。敬请期待。。。

👍 转载标明出处

  • 英雄联盟
    11 引用 • 56 回帖
  • Python

    Python 是一种面向对象、直译式电脑编程语言,具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用缩进来定义语句块。

    541 引用 • 672 回帖
  • LPL
    1 引用
  • 2019
    60 引用 • 464 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • ReactiveX

    ReactiveX 是一个专注于异步编程与控制可观察数据(或者事件)流的 API。它组合了观察者模式,迭代器模式和函数式编程的优秀思想。

    1 引用 • 2 回帖 • 153 关注
  • WiFiDog

    WiFiDog 是一套开源的无线热点认证管理工具,主要功能包括:位置相关的内容递送;用户认证和授权;集中式网络监控。

    1 引用 • 7 回帖 • 585 关注
  • GitHub

    GitHub 于 2008 年上线,目前,除了 Git 代码仓库托管及基本的 Web 管理界面以外,还提供了订阅、讨论组、文本渲染、在线文件编辑器、协作图谱(报表)、代码片段分享(Gist)等功能。正因为这些功能所提供的便利,又经过长期的积累,GitHub 的用户活跃度很高,在开源世界里享有深远的声望,并形成了社交化编程文化(Social Coding)。

    209 引用 • 2031 回帖
  • V2Ray
    1 引用 • 15 回帖
  • JSON

    JSON (JavaScript Object Notation)是一种轻量级的数据交换格式。易于人类阅读和编写。同时也易于机器解析和生成。

    52 引用 • 190 回帖
  • SOHO

    为成为自由职业者在家办公而努力吧!

    7 引用 • 55 回帖 • 18 关注
  • Log4j

    Log4j 是 Apache 开源的一款使用广泛的 Java 日志组件。

    20 引用 • 18 回帖 • 30 关注
  • Vue.js

    Vue.js(读音 /vju ː/,类似于 view)是一个构建数据驱动的 Web 界面库。Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。

    264 引用 • 665 回帖
  • RYMCU

    RYMCU 致力于打造一个即严谨又活泼、专业又不失有趣,为数百万人服务的开源嵌入式知识学习交流平台。

    4 引用 • 6 回帖 • 52 关注
  • CongSec

    本标签主要用于分享网络空间安全专业的学习笔记

    1 引用 • 1 回帖 • 10 关注
  • HTML

    HTML5 是 HTML 下一个的主要修订版本,现在仍处于发展阶段。广义论及 HTML5 时,实际指的是包括 HTML、CSS 和 JavaScript 在内的一套技术组合。

    107 引用 • 295 回帖 • 2 关注
  • jsoup

    jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出和操作数据。

    6 引用 • 1 回帖 • 482 关注
  • 人工智能

    人工智能(Artificial Intelligence)是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门技术科学。

    132 引用 • 188 回帖
  • Unity

    Unity 是由 Unity Technologies 开发的一个让开发者可以轻松创建诸如 2D、3D 多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

    25 引用 • 7 回帖 • 186 关注
  • 安全

    安全永远都不是一个小问题。

    199 引用 • 816 回帖
  • 程序员

    程序员是从事程序开发、程序维护的专业人员。

    565 引用 • 3532 回帖
  • Postman

    Postman 是一款简单好用的 HTTP API 调试工具。

    4 引用 • 3 回帖 • 2 关注
  • PHP

    PHP(Hypertext Preprocessor)是一种开源脚本语言。语法吸收了 C 语言、 Java 和 Perl 的特点,主要适用于 Web 开发领域,据说是世界上最好的编程语言。

    179 引用 • 407 回帖 • 489 关注
  • Tomcat

    Tomcat 最早是由 Sun Microsystems 开发的一个 Servlet 容器,在 1999 年被捐献给 ASF(Apache Software Foundation),隶属于 Jakarta 项目,现在已经独立为一个顶级项目。Tomcat 主要实现了 JavaEE 中的 Servlet、JSP 规范,同时也提供 HTTP 服务,是市场上非常流行的 Java Web 容器。

    162 引用 • 529 回帖 • 4 关注
  • 微服务

    微服务架构是一种架构模式,它提倡将单一应用划分成一组小的服务。服务之间互相协调,互相配合,为用户提供最终价值。每个服务运行在独立的进程中。服务于服务之间才用轻量级的通信机制互相沟通。每个服务都围绕着具体业务构建,能够被独立的部署。

    96 引用 • 155 回帖
  • frp

    frp 是一个可用于内网穿透的高性能的反向代理应用,支持 TCP、UDP、 HTTP 和 HTTPS 协议。

    20 引用 • 7 回帖 • 2 关注
  • Telegram

    Telegram 是一个非盈利性、基于云端的即时消息服务。它提供了支持各大操作系统平台的开源的客户端,也提供了很多强大的 APIs 给开发者创建自己的客户端和机器人。

    5 引用 • 35 回帖
  • 架构

    我们平时所说的“架构”主要是指软件架构,这是有关软件整体结构与组件的抽象描述,用于指导软件系统各个方面的设计。另外还有“业务架构”、“网络架构”、“硬件架构”等细分领域。

    142 引用 • 442 回帖
  • Typecho

    Typecho 是一款博客程序,它在 GPLv2 许可证下发行,基于 PHP 构建,可以运行在各种平台上,支持多种数据库(MySQL、PostgreSQL、SQLite)。

    12 引用 • 65 回帖 • 453 关注
  • 创造

    你创造的作品可能会帮助到很多人,如果是开源项目的话就更赞了!

    176 引用 • 995 回帖 • 1 关注
  • golang

    Go 语言是 Google 推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发 Go,是因为过去 10 多年间软件开发的难度令人沮丧。Go 是谷歌 2009 发布的第二款编程语言。

    497 引用 • 1387 回帖 • 294 关注
  • 星云链

    星云链是一个开源公链,业内简单的将其称为区块链上的谷歌。其实它不仅仅是区块链搜索引擎,一个公链的所有功能,它基本都有,比如你可以用它来开发部署你的去中心化的 APP,你可以在上面编写智能合约,发送交易等等。3 分钟快速接入星云链 (NAS) 测试网

    3 引用 • 16 回帖 • 2 关注