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

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

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

    556 引用 • 675 回帖 • 1 关注
  • LPL
    1 引用
  • 2019
    60 引用 • 464 回帖

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • Kotlin

    Kotlin 是一种在 Java 虚拟机上运行的静态类型编程语言,由 JetBrains 设计开发并开源。Kotlin 可以编译成 Java 字节码,也可以编译成 JavaScript,方便在没有 JVM 的设备上运行。在 Google I/O 2017 中,Google 宣布 Kotlin 成为 Android 官方开发语言。

    19 引用 • 33 回帖 • 80 关注
  • 大疆创新

    深圳市大疆创新科技有限公司(DJI-Innovations,简称 DJI),成立于 2006 年,是全球领先的无人飞行器控制系统及无人机解决方案的研发和生产商,客户遍布全球 100 多个国家。通过持续的创新,大疆致力于为无人机工业、行业用户以及专业航拍应用提供性能最强、体验最佳的革命性智能飞控产品和解决方案。

    2 引用 • 14 回帖
  • Access
    1 引用 • 3 回帖 • 1 关注
  • V2EX

    V2EX 是创意工作者们的社区。这里目前汇聚了超过 400,000 名主要来自互联网行业、游戏行业和媒体行业的创意工作者。V2EX 希望能够成为创意工作者们的生活和事业的一部分。

    16 引用 • 236 回帖 • 268 关注
  • Spark

    Spark 是 UC Berkeley AMP lab 所开源的类 Hadoop MapReduce 的通用并行框架。Spark 拥有 Hadoop MapReduce 所具有的优点;但不同于 MapReduce 的是 Job 中间输出结果可以保存在内存中,从而不再需要读写 HDFS,因此 Spark 能更好地适用于数据挖掘与机器学习等需要迭代的 MapReduce 的算法。

    74 引用 • 46 回帖 • 563 关注
  • Ubuntu

    Ubuntu(友帮拓、优般图、乌班图)是一个以桌面应用为主的 Linux 操作系统,其名称来自非洲南部祖鲁语或豪萨语的“ubuntu”一词,意思是“人性”、“我的存在是因为大家的存在”,是非洲传统的一种价值观,类似华人社会的“仁爱”思想。Ubuntu 的目标在于为一般用户提供一个最新的、同时又相当稳定的主要由自由软件构建而成的操作系统。

    127 引用 • 169 回帖 • 2 关注
  • abitmean

    有点意思就行了

    37 关注
  • IDEA

    IDEA 全称 IntelliJ IDEA,是一款 Java 语言开发的集成环境,在业界被公认为最好的 Java 开发工具之一。IDEA 是 JetBrains 公司的产品,这家公司总部位于捷克共和国的首都布拉格,开发人员以严谨著称的东欧程序员为主。

    181 引用 • 400 回帖 • 1 关注
  • 自由行
    4 关注
  • danl
    165 关注
  • flomo

    flomo 是新一代 「卡片笔记」 ,专注在碎片化时代,促进你的记录,帮你积累更多知识资产。

    6 引用 • 141 回帖
  • Dubbo

    Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,是 [阿里巴巴] SOA 服务化治理方案的核心框架,每天为 2,000+ 个服务提供 3,000,000,000+ 次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点。

    60 引用 • 82 回帖 • 614 关注
  • C++

    C++ 是在 C 语言的基础上开发的一种通用编程语言,应用广泛。C++ 支持多种编程范式,面向对象编程、泛型编程和过程化编程。

    107 引用 • 153 回帖 • 1 关注
  • Telegram

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

    5 引用 • 35 回帖
  • Markdown

    Markdown 是一种轻量级标记语言,用户可使用纯文本编辑器来排版文档,最终通过 Markdown 引擎将文档转换为所需格式(比如 HTML、PDF 等)。

    170 引用 • 1529 回帖
  • 旅游

    希望你我能在旅途中找到人生的下一站。

    95 引用 • 901 回帖
  • 深度学习

    深度学习(Deep Learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。

    54 引用 • 41 回帖
  • iOS

    iOS 是由苹果公司开发的移动操作系统,最早于 2007 年 1 月 9 日的 Macworld 大会上公布这个系统,最初是设计给 iPhone 使用的,后来陆续套用到 iPod touch、iPad 以及 Apple TV 等产品上。iOS 与苹果的 Mac OS X 操作系统一样,属于类 Unix 的商业操作系统。

    89 引用 • 146 回帖
  • Visio
    1 引用 • 2 回帖 • 4 关注
  • Sphinx

    Sphinx 是一个基于 SQL 的全文检索引擎,可以结合 MySQL、PostgreSQL 做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。

    1 引用 • 225 关注
  • Quicker

    Quicker 您的指尖工具箱!操作更少,收获更多!

    37 引用 • 157 回帖 • 2 关注
  • Webswing

    Webswing 是一个能将任何 Swing 应用通过纯 HTML5 运行在浏览器中的 Web 服务器,详细介绍请看 将 Java Swing 应用变成 Web 应用

    1 引用 • 15 回帖 • 642 关注
  • PHP

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

    180 引用 • 408 回帖 • 489 关注
  • SQLServer

    SQL Server 是由 [微软] 开发和推广的关系数据库管理系统(DBMS),它最初是由 微软、Sybase 和 Ashton-Tate 三家公司共同开发的,并于 1988 年推出了第一个 OS/2 版本。

    21 引用 • 31 回帖 • 1 关注
  • Gzip

    gzip (GNU zip)是 GNU 自由软件的文件压缩程序。我们在 Linux 中经常会用到后缀为 .gz 的文件,它们就是 Gzip 格式的。现今已经成为互联网上使用非常普遍的一种数据压缩格式,或者说一种文件格式。

    9 引用 • 12 回帖 • 165 关注
  • JavaScript

    JavaScript 一种动态类型、弱类型、基于原型的直译式脚本语言,内置支持类型。它的解释器被称为 JavaScript 引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在 HTML 网页上使用,用来给 HTML 网页增加动态功能。

    730 引用 • 1280 回帖 • 4 关注
  • SVN

    SVN 是 Subversion 的简称,是一个开放源代码的版本控制系统,相较于 RCS、CVS,它采用了分支管理系统,它的设计目标就是取代 CVS。

    29 引用 • 98 回帖 • 691 关注