在《用Python模拟2018世界杯夺冠之路》一文中,我选择从公开的足球网站用爬虫抓取数据,从而建模并模拟比赛,但是略过了爬虫的实施细节。虽然爬虫并不难做,但希望可以让更多感兴趣的朋友自己动手抓数据下来玩,提供便利,今天就把我抓取球探网的方法和Python源码拿出来分享给大家,不超过100行代码。希望球友们能快速get爬虫的技能。

#-*- coding: utf-8 -*-

from __future__ import print_function, division

from selenium import webdriver

import pandas as pd

class Spider(object):

def __init__(self):

## setup

#self.base_url = base_url

self.driver = webdriver.Chrome()

self.driver.implicitly_wait(30)

self.verificationErrors = []

self.accept_next_alert = True

def get_all_team_data(self):

# 先通过世界杯主页获取所有32只队的ID(构成球队URL)

self.get_team_ids()

# 循环爬取每一支队的比赛数据

data = []

for i, [team_id, team_name] in enumerate(self.team_list):

#if i == 1:

# break

print(i, team_id, team_name)

df = self.get_team_data(team_id, team_name)

data.append(df)

output = pd.concat(data)

output.reset_index(drop=True, inplace=True)

#print(output)

output.to_csv('data_2018WorldCup.csv', index=False, encoding='utf-8')

self.driver.close()

def get_team_ids(self):

main_url = 'http://zq.win007.com/cn/CupMatch/75.html'

self.driver.get(main_url)

teams = self.driver.find_elements_by_xpath("//td[@style='background-color:#fff;text-align:left;']")

data = []

for team in teams:

team_id = int(team.find_element_by_xpath(".//a").get_attribute('href').split('/')[-1].split('.')[0])

team_name = team.find_element_by_xpath(".//a").text

print(team_id, team_name)

data.append([team_id, team_name])

self.team_list = data

#self.team_list = pd.DataFrame(data, columns=['team_name', 'team_id'])

#self.team_list.to_excel('国家队ID.xlsx', index=False)

def get_team_data(self, team_id, team_name):

"""获取一个国家队的比赛数据。TODO:没有实现翻页"""

url = 'http://zq.win007.com/cn/team/CTeamSche/%d.html'%team_id

self.driver.get(url)

table = self.driver.find_element_by_xpath("//div[@id='Tech_schedule' and @class='data']")

matches = table.find_elements_by_xpath(".//tr")

print(len(matches))

# 抓取比赛数据,并保存成DataFrame

data = []

for i, match in enumerate(matches):

if i == 0:

headers = match.find_elements_by_xpath(".//th")

h1, h2, h3, h4, h5 = headers[0].text, headers[1].text, headers[2].text, headers[3].text, headers[4].text

print(h1, h2, h3, h4, h5)

continue

try:

info = match.find_elements_by_xpath(".//td")

cup = str(info[0].text.encode('utf-8'))

match_time = str(info[1].text.encode('utf-8'))

home_team = str(info[2].text.encode('utf-8'))

fts = info[3].text

#print('-', cup, '-')

fs_A, fs_B = int(fts.split('-')[0]), int(fts.split('-')[1])

away_team = str(info[4].text.encode('utf-8'))

print(cup, match_time, home_team, away_team, fs_A, fs_B)

data.append([cup, match_time, home_team, away_team, fs_A, fs_B, team_name])

except:

break

df = pd.DataFrame(data, columns=['赛事', '时间', '主队', '客队', '主队进球', '客队进球', '国家队名'])

return df

if __name__ == "__main__":

spider = Spider()

# 第一步:抓2018世界杯球队的ID。第二部:循环抓取每一支队的比赛数据。

spider.get_all_team_data()

是的,上面就是全部的代码,不到100行。首先,打开球探网2018世界杯球队页面,32个国家队名都列在这个页面里,每个国家点进去都是一页比赛列表数据,我们要爬取的就是这32个页面。那么我们必须分两部分完成:

第一步,找到32个国家队各自的网页链接;

第二步,分别进入32个链接,爬取各自的比赛记录数据。

主程序定义了一个Spider类,你可以理解它就是负责完成爬虫这件事的责任人。在它下面定义了一个方法叫get_team_ids,来完成第一步,它读取这个主页面地址main_url = 'zq.win007.com/cn/CupMatch…',通过xpath的方式先找到所有32个国家队名赋给teams变量,再进一步分解出各自的team_id和team_name,注意,球探网每一个球队的url都由一个team_id构造成,换句话说只要知道team_id便可找到确切的球队链接,这也是网站方便管理那么多链接的一个办法。(比如

巴西队的id是778,注意链接zq.win007.com/cn/team/CTe…)

随后,Spider类下还定义了一个get_team_data方法,它需要传入两个参数team_id和team_name,就是球队链接和球队名。由它来负责进入一个给定的国家队页面,抓取这个队所有历史比赛数据。比如巴西队,可以看到比赛数据是一条一条列出来,内容是很整齐的,包括赛事名称、比赛时间、主队、客队、比分、还有一切让球、大小球盘口数据等。就像一个excel表格的网页版,实际上,我们真的可以把每一条数据整整齐齐地爬下来,存进一个excel格式里。而且这种整齐的html表单数据很容易爬取,因为格式是固定的。只要从html源码中找到每一个数字对应的源码就可以通过爬虫语言定位到数据。

最后,为了方便,Spider类下的方法get_all_team_data只是把上面两步整合在一起,完成整个数据抓取过程。在最后调用这个爬虫程序时,先初始化爬虫spider = Spider(),然后调用spider.get_all_team_data()即可开始自动爬取32个国家队的历史比赛数据咯。

由于采用了selenium的webdriver接口,它会让python自动模拟人的行为去打开你的浏览器,所以程序一旦运行你会看到你电脑的浏览器将自动打开、自动地跳转链接,跳转32个国家队的页面。最终,它将爬取下来的比赛数据保存进一张csv存到你电脑本地。

此外,这个爬虫程序稍作修改,可以爬取联赛的数据,比如英超2017-2018赛季,所有的比赛记录同样可以抓下来。更牛逼的地方是我发现它其实有 100多个国家,3-10个级别联赛,近10年的比赛记录,粗略一算也有小10万场比赛。全部抓下来,比分、赛事、让球等等都有,应该还是挺有趣的。

python大赛对名_用100行Python爬虫代码抓取公开的足球数据玩(一)相关推荐

  1. python画图代码100行_用100行Python代码告诉你国庆那些景点爆满!

    阅读本文大约需要 7 分钟 本文转载自zone7 概述 前言 思考 统计结果 爬虫技术分析 爬虫代码实现 爬虫分析实现 后记 前言 举国欢庆的国庆节马上就要到来了,你想好去哪里看人山人海了吗?还是窝在 ...

  2. python免费ocr软件_Textshot:100行Python代码实现一款高精度免费OCR工具

    近期Github开源了一款基于Python开发,名为Textshot的截图工具,刚开源不不久已经800+Star. 相对于大多数OCR工具复杂工程.差强人意的效果,Textshot具有明显的优势:项目 ...

  3. python手机软件-Python爬虫:抓取手机APP的数据

    分享一篇文章,原文来自:j_hao104的个人页面. 摘要 大多数APP里面返回的是json格式数据,或者一堆加密过的数据 .这里以超级课程表APP为例,抓取超级课程表里用户发的话题. 1.抓取APP ...

  4. Python爬虫:抓取手机APP的数据

    点击上方"程序员大咖",选择"置顶公众号" 关键时刻,第一时间送达! 抓取APP数据包 得到超级课程表登录的地址:http://120.55.151.61/V2 ...

  5. python大赛对名_团队作业1——团队展示选题

    团队展示: 1.队名: KKlist 队名含义:因为做的个人计划这个项目其实是关于todolist这个范畴的.项目名称要简洁并能表达出实际含义.List就是我们项目的核心-一个待办事项提醒的功能实现. ...

  6. python 车牌识别简单_简单30行Python代码让你玩转YOLO目标识别检测!

    YOLO是一种实时目标检测算法,与faster R-CNN不同的是,YOLO不是过多的注重物体定位的精度,而是着重于速度和物体种类的识别.在实际应用中,实时性是目标检测中非常重要的,例如对于一辆自动驾 ...

  7. python写计算机模拟器_用 150 行 Python 代码写的量子计算模拟器

    这是个 GItHub 项目,可以简单了解一下. qusim.py 是一个多量子位的量子计算机模拟器(玩具?),用 150 行的 python 所编写. 这段代码可以让你轻松了解量子计算机如何遵循线性代 ...

  8. java爬虫 京东_教您使用java爬虫gecco抓取JD全部商品信息(一)

    #教您使用java爬虫gecco抓取JD全部商品信息(一) ##gecco爬虫 如果对gecco还没有了解可以参看一下gecco的github首页.gecco爬虫十分的简单易用,JD全部商品信息的抓取 ...

  9. scrapy 搜索关键字_详解如何用爬虫批量抓取百度搜索多个关键字数据

    本文介绍如何使用软件的流程图模式,免费采集百度搜索多个关键字的信息数据. 软件下载网址:www.houyicaiji.com 采集结果预览: 下面我们来详细介绍一下如何使用流程图模式,采集在百度输入多 ...

最新文章

  1. nginx获取函数执行调用关系
  2. 设置Linux下Mysql表名不区分大小写
  3. 组合的输出pascal程序
  4. mysql fabric安装使用测试
  5. BZOJ 1798: [Ahoi2009]Seq 维护序列seq
  6. Windows 7 文件夹共享
  7. dynamo方程怎么写_【简明自控】为什么特征方程如此重要
  8. MySQL实现分页查询
  9. 小米、360之后,货拉拉被曝已启动造车项目!官方回应
  10. JavaScript 败北,TypeScript 大势所趋?
  11. mysql用一个表更新另一个表的方法
  12. VS+Qt报错无法解析的外部符号
  13. 从零搭建 ES 搜索服务(五)搜索结果高亮
  14. 拒做背锅侠!如何利用网站性能优化驱动产品体验提升?
  15. Python基础(九)——print函数详解,配合参数示例详解
  16. 《REWORK》读记
  17. UConn DataMining Math5671 课程小记(2)
  18. 建筑行业必看,一招学会工地管理诀窍
  19. Android动态listview,Android列表组件ListView使用详解之动态加载或修改列表数据
  20. pcb二次钻孔_pcb钻孔的注意事项

热门文章

  1. 【BLE】角色区分(master/slave, service/client)
  2. 什么是自然语言处理,自然语言处理目前的应用有哪些?
  3. excel 置信区间 计算_如何用excel计算 95%的置信区间
  4. 加餐0 | 前后端快速入门学习路线
  5. 移动端手机软键盘遮挡输入框问题
  6. OPENCV2.4.9配置
  7. 怎么释放C盘空间?清理C盘空间的4大方法分享!
  8. Java语言异常处理的出口_Java语言中,下列哪一个子句是异常处理的出口?
  9. 商业智能BI与业务结构分析
  10. 【Rust 日报】2022-10-16 全栈同构Web框架leptos