IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> 使用selenium爬取球探网比赛数据 -> 正文阅读

[Python知识库]使用selenium爬取球探网比赛数据

作者:recommend-item-box type_blog clearfix

这篇文章是在研究生期间的一个小Demo,当时是利用机器学习的一些算法来预测赔率,在这个过程中由于需要数据,所以爬虫就用来爬取球探网的数据。下面就是一小部分代码,展示爬取其中一部分数据的样例。

目标网站

这里以爬取球探网上关于2018年俄罗斯世界杯32支参赛国家队的以往6年的比赛数据为例。

  • http://zq.win007.com/cn/CupMatch/648.html

网站分析

一、根据网页内容构建爬取思路

首先在球探网世界杯主题页列出了入围分组赛的32支国家队分组和积分情况
![在这里插入图片描述](https://img-blog.csdnimg.cn/065b81d8637343
点击任意参赛国家队(比如埃及)的名称,可以链接到该国家队专题页,其中包含了此队从2011年至今所有的比赛成绩和相关数据,也就是我们要爬取的内容。
在这里插入图片描述
所以整个爬取思路拟定为:从2018赛季世界杯(世界杯),赛程积分–球探网抓取参赛国家队名称及其对应的国家队数据统计链接,并以这些链接作为二级网址,抓取对应国家队近年来的比赛数据统计信息。最后将爬取下来的信息存入到一个csv文件中。

二、网页html分析

首先在开发者工具中找到我们要在一级网址上抓取的信息位置。我们要爬取的就是位于

中第三个标签里的a标签内容及href属性。
在这里插入图片描述
但是在页面点击右键查看源代码时,源代码中并没有上述部分的代码。说明这部分table标签里的内容是通过ajax动态加载的,不是写在源代码里。开发者工具也显示网页使用了jquery框架编写javascript脚本。(国家队比赛数据统计所在表格也是ajax动态加载的,这里我就不重复分析了。)

在看看请求网页时服务器返回的文件,其中Bomhelper.js中写有如下信息:
在这里插入图片描述

三、配置selenium和chrome

既然确定了使用selenium库+chrome浏览器的方法,那么我们首先要安装selenium库和相应的浏览器驱动(chromedriver.exe)

selenium库安装

这个很简单,和常用的python包安装一样,可以使用:

pip install selenium
下载和安装chromedriver

打开https://sites.google.com/a/chromium.org/chromedriver/downloads,下载与浏览器版本相匹配的chromedriver.exe。例如:我的浏览器是 Chrome/93.0.4577.15。所以就选用这个版本的。
在这里插入图片描述
下载的是一个zip文件,解压后,里面有一个chromedriver.exe文件,将该文件移动到电脑chrome浏览器的安装目录下,我的是:C:\Program Files、(x86)\Google\Chrome\Application,并把该路径添加到环境变量的path中。

验证chromedriver是否可用

打开python,输入一下内容:

from selenium import webdriver
driver = webdriver.Chrome()

点击运行后,此时如果一个chrome浏览器窗口被成功打开,并且程序没有报错,则说明配置成功了。

爬虫代码

#导入需要的包
from selenium import webdriver
import time
import traceback

#发送url请求
def getDriver(url):
    try:
        # 注意chromedriver的版本
        driver = webdriver.Chrome()
        driver.get(url)
        time.sleep(1)
        return driver
    except:
        return ''

#获取子链接列表
def getURLlist(url, teamURLlist):
    driver = getDriver(url)
    try:
        #找到包含子链接的所有a标签
        a_list = driver.find_elements_by_xpath('//table[@id="ScoreGroupTab"]/tbody/tr/td[2]/a')
        if a_list:
            for i in a_list:
                #teamURLlist用于存放子链接
                teamURLlist.append(i.get_attribute('href'))
            driver.close()
            return teamURLlist
        else:
            return []
    except:
        traceback.print_exc()
        return []

#获取比赛数据
def getMatchInfo(teamURLlist, fpath):
    with open (fpath, 'w') as f:
        #注意逗号后面不要有空格
        f.write('比赛,时间,主队,比分,客队,犯规,黄牌,红牌,控球率,射门(射正),传球(成功),传球成功率,过人次数,评分\n')
        if teamURLlist:
            for url in teamURLlist:
                driver = getDriver(url)
                # 表格中数据数据分了好多页,虽然所有数据在driver.page_source中都可见。
                # 但是,除第一页以外,其他的数据style属性都是“display:none",selenium对这些元素是无法直接操作的。
                # 我们需要通过JavaScipt 修改display的值

                # 编写一段javascript代码,让浏览器执行。从而把html中的所有tr标签的style属性都设为display='block'
                js = 'document.querySelectorAll("tr").forEach(function(tr){tr.style.display="block";})'
                driver.execute_script(js)

                #接下来,就可以把所有的比赛成绩数据都爬下来
                infolist = driver.find_elements_by_xpath('//div[@id="Tech_schedule"]/table/tbody/tr')

                # 第一个tr中包含的是表格的title信息,剔除
                for tr in infolist[1:]:
                    td_list = tr.find_elements_by_tag_name('td')
                    matchinfo = []
                    for td in td_list:
                        # 部分td的style属性也为“display:none",info 则对应为‘’,
                        # 这些td对应的是角球,越位,头球,救球,铲球等信息,不是很重要,就不爬取了。
                        info = td.text
                        if info:  # 去除空字符
                            matchinfo.append(td.text)
                            matchinfo.append(',')    #添加逗号作为分隔符
                    matchinfo.append('\n')  #在列表最后加上换行符

                    #将一条比赛信息写入到文件中
                    f.writelines(matchinfo)

                #每个网页爬完后,就把打开的浏览器关掉,要不最后会开着好多浏览器窗口。
                driver.close()


def main():
    #一级网址:32强分组信息
    start_url = 'http://zq.win007.com/cn/CupMatch/75.html'
    #保存文件及路径
    output = r'D:/03-CS/web scraping cases/qiutan/worldcup2018.csv'
    startlist = []
    resultlist = getURLlist(start_url, startlist)
    getMatchInfo(resultlist, output)
    print('\nfinished\n')

main()

小结

这个过程主要用到如下知识点:

使用selenium+chrome的组合来模拟chome浏览器发送请求,处理ajax异步加载数据以及服务器对发送请求浏览器的限制。
解决了如何爬取属性为display: none的标签内容:编写一段修改属性的javascript代码交个webdriver去执行。

还有一点就是这个网站估计被爬的次数特别多,应该做了防爬取的措施,网页加载很慢,这个有待优化。

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-07-30 22:42:56  更:2021-07-30 22:42:58 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/4 0:33:35-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码