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

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

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

    558 引用 • 677 回帖
  • LPL
    1 引用
  • 2019
    60 引用 • 464 回帖

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • C++

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

    108 引用 • 153 回帖
  • 互联网

    互联网(Internet),又称网际网络,或音译因特网、英特网。互联网始于 1969 年美国的阿帕网,是网络与网络之间所串连成的庞大网络,这些网络以一组通用的协议相连,形成逻辑上的单一巨大国际网络。

    98 引用 • 367 回帖
  • Hibernate

    Hibernate 是一个开放源代码的对象关系映射框架,它对 JDBC 进行了非常轻量级的对象封装,使得 Java 程序员可以随心所欲的使用对象编程思维来操纵数据库。

    39 引用 • 103 回帖 • 733 关注
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3205 引用 • 8217 回帖
  • Bootstrap

    Bootstrap 是 Twitter 推出的一个用于前端开发的开源工具包。它由 Twitter 的设计师 Mark Otto 和 Jacob Thornton 合作开发,是一个 CSS / HTML 框架。

    18 引用 • 33 回帖 • 642 关注
  • Latke

    Latke 是一款以 JSON 为主的 Java Web 框架。

    71 引用 • 535 回帖 • 840 关注
  • 爬虫

    网络爬虫(Spider、Crawler),是一种按照一定的规则,自动地抓取万维网信息的程序。

    106 引用 • 275 回帖 • 2 关注
  • React

    React 是 Facebook 开源的一个用于构建 UI 的 JavaScript 库。

    192 引用 • 291 回帖 • 359 关注
  • Quicker

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

    39 引用 • 167 回帖 • 1 关注
  • SpaceVim

    SpaceVim 是一个社区驱动的模块化 vim/neovim 配置集合,以模块的方式组织管理插件以
    及相关配置,为不同的语言开发量身定制了相关的开发模块,该模块提供代码自动补全,
    语法检查、格式化、调试、REPL 等特性。用户仅需载入相关语言的模块即可得到一个开箱
    即用的 Vim-IDE。

    3 引用 • 31 回帖 • 116 关注
  • Anytype
    3 引用 • 31 回帖 • 49 关注
  • TextBundle

    TextBundle 文件格式旨在应用程序之间交换 Markdown 或 Fountain 之类的纯文本文件时,提供更无缝的用户体验。

    1 引用 • 2 回帖 • 88 关注
  • golang

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

    500 引用 • 1396 回帖 • 253 关注
  • Telegram

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

    5 引用 • 35 回帖
  • 又拍云

    又拍云是国内领先的 CDN 服务提供商,国家工信部认证通过的“可信云”,乌云众测平台认证的“安全云”,为移动时代的创业者提供新一代的 CDN 加速服务。

    20 引用 • 37 回帖 • 564 关注
  • 招聘

    哪里都缺人,哪里都不缺人。

    188 引用 • 1057 回帖 • 1 关注
  • 宕机

    宕机,多指一些网站、游戏、网络应用等服务器一种区别于正常运行的状态,也叫“Down 机”、“当机”或“死机”。宕机状态不仅仅是指服务器“挂掉了”、“死机了”状态,也包括服务器假死、停用、关闭等一些原因而导致出现的不能够正常运行的状态。

    13 引用 • 82 回帖 • 80 关注
  • Scala

    Scala 是一门多范式的编程语言,集成面向对象编程和函数式编程的各种特性。

    13 引用 • 11 回帖 • 164 关注
  • 锤子科技

    锤子科技(Smartisan)成立于 2012 年 5 月,是一家制造移动互联网终端设备的公司,公司的使命是用完美主义的工匠精神,打造用户体验一流的数码消费类产品(智能手机为主),改善人们的生活质量。

    4 引用 • 31 回帖 • 2 关注
  • 设计模式

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

    201 引用 • 120 回帖
  • Docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的操作系统上。容器完全使用沙箱机制,几乎没有性能开销,可以很容易地在机器和数据中心中运行。

    498 引用 • 934 回帖
  • SOHO

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

    7 引用 • 55 回帖 • 4 关注
  • Hadoop

    Hadoop 是由 Apache 基金会所开发的一个分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。

    93 引用 • 122 回帖 • 630 关注
  • Dubbo

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

    60 引用 • 82 回帖 • 623 关注
  • 程序员

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

    594 引用 • 3541 回帖
  • Vditor

    Vditor 是一款浏览器端的 Markdown 编辑器,支持所见即所得、即时渲染(类似 Typora)和分屏预览模式。它使用 TypeScript 实现,支持原生 JavaScript、Vue、React 和 Angular。

    382 引用 • 1880 回帖 • 1 关注
  • Follow
    4 引用 • 12 回帖 • 13 关注