Python爬虫,破解ajax动态网页,爬取篮球比赛数据
蚂蚁学Python
共 2932字,需浏览 6分钟
· 2021-12-30
前言
今天遇到了群友的一个需求:
爬取 https://www.sporttery.cn/jc/lqsgkj/ 全年的篮球赛果开奖数据,如下所示
一、网站分析
这个网站的数据不是静态的,是动态加载的(选取相应日期,点击”开始查询“后,数据从服务端加载到浏览器)
看一下网页的低端,发现数据并不是一次性加载的,而是通过分页的形式完成 进一步研究还发现,每个月份的分页数并不是一致的,最多有8页
对日期的输入框进行分析,发现它是可以直接通过键盘输入日期的
二:确定爬取方案
对于这种动态的网页,直接通过request库不太好爬取,而模拟人类操作浏览器的selenium对这种场景具有天然优势,所以我采用后者。对网页元素的定位则使用xpath。再此推荐蚂蚁老师的爬虫课程,简洁清晰,新手入门必备。
大概的思路就是,先构建每月的开始月份、结束月份
date = [("2021-01-01", "2021-01-31"), ("2021-02-01", "2021-02-28"), ("2021-03-01", "2021-03-31"),
("2021-04-01", "2021-04-30"), ("2021-05-01", "2021-05-31"), ("2021-06-01", "2021-06-30"),
("2021-07-01", "2021-07-31"),
("2021-08-01", "2021-08-30"), ("2021-09-01", "2021-09-31"), ("2021-10-01", "2021-10-30"),
("2021-11-01", "2021-11-31"),
("2021-12-01", "2021-12-24")]
再用这些数据分别输入到开始框和结束框内
点击查询
点击分页 特别注意到分页的xpath路径是有规律的,因而我们可以构造xpath路径,方便接下来的爬取
Xpath = [f'//*[@id="matchList"]/div/div/ul/li[{i}]' for i in range(2, 10)]
爬取内容
三:编码实现
from selenium.webdriver import Edge
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
import time
driver = Edge(executable_path="C:/WebDriver/bin/msedgedriver.exe")
date = [("2021-01-01", "2021-01-31"), ("2021-02-01", "2021-02-28"), ("2021-03-01", "2021-03-31"),
("2021-04-01", "2021-04-30"), ("2021-05-01", "2021-05-31"), ("2021-06-01", "2021-06-30"),
("2021-07-01", "2021-07-31"),
("2021-08-01", "2021-08-30"), ("2021-09-01", "2021-09-31"), ("2021-10-01", "2021-10-30"),
("2021-11-01", "2021-11-31"),
("2021-12-01", "2021-12-24")]
Xpath = [f'//*[@id="matchList"]/div/div/ul/li[{i}]' for i in range(2, 10)]
# 判断xpath存不存在的函数
def NodeExists(xpath):
try:
driver.find_element_by_xpath(xpath)
return True
except:
return False
def crawler():
for item in date:
# 打开网页
driver.get("https://www.sporttery.cn/jc/lqsgkj/")
# 等待加载
WebDriverWait(driver, 10).until(lambda d: "篮球赛果开奖" in d.title)
# 等待一秒后 先清空再输入开始日期
time.sleep(1)
driver.find_element(By.XPATH, '//*[@id="start_date"]').clear()
driver.find_element(By.XPATH, '//*[@id="start_date"]').send_keys(item[0])
# 再等一秒 先清空再输入结束日期
time.sleep(1)
driver.find_element(By.XPATH, '//*[@id="end_date"]').clear()
driver.find_element(By.XPATH, '//*[@id="end_date"]').send_keys(item[1])
# 点击查询
driver.find_element(By.XPATH, '//*[@id="headerTr"]/div[1]/div[1]/div/a').click()
print(f"开始爬取{item[0]}")
with open(f"{item[0]}.csv", "w", encoding='ANSI') as fin:
# 点击1-8页内容
page = 1
for this in Xpath:
time.sleep(1)
if NodeExists(this):
driver.find_element(By.XPATH, this).click()
else:
print(f"没有{this}这个xpath")
break
time.sleep(1)
content = driver.find_element(By.XPATH, '//*[@id="matchList"]/table').text
fin.write("\n" + content)
print(f"完成第{page}页的爬取,此时的xpath是:{this}")
page += 1
print(f"结束爬取{item[0]}")
if __name__ == "__main__":
crawler()
最后,推荐蚂蚁老师的《零基础学Python到数据分析实战》包含了爬虫部分:
评论
金融研究 | 使用Python测量关键审计事项的「信息含量」
Tips: 公众号推送后内容只能更改一次,且只能改20字符。如果内容出问题,或者想更新内容, 只能重复推送。为了更好的阅读体验,建议阅读本文博客版, 链接地址https://textdata.cn/blog/2023-01-13-information-content-of-critical-aud
大邓和他的Python
0
金融研究(更新) | 使用Python构建关键审计事项的「信息含量」
Tips: 公众号推送后内容只能更改一次,且只能改20字符。如果内容出问题,或者想更新内容, 只能重复推送。为了更好的阅读体验,建议阅读本文博客版, 链接地址https://textdata.cn/blog/2023-01-13-information-content-of-critical-aud
大邓和他的Python
0
谷歌员工爆料Python基础团队原地解散
机器之心报道编辑:蛋酱什么?谷歌解雇了整个 Python 基础团队?「当与你直接共事的每个人,包括你的主管,都被裁员 —— 哦,是职位被削减,而你被要求安排他们的替代者入职,这些人被告知在不同的国家担任同样的职位,但他们并不为此感到高兴,这是很艰难的一天。」发布这一动态的 Thomas Wouter
机器学习初学者
0
【Python】coverage,一个有趣的 Python 库!
大家好,今天为大家分享一个有趣的 Python 库 - coveragepy。Github地址:https://github.com/nedbat/coveragepy在软件开发中,测试是确保代码质量和稳定性的关键步骤之一。而代码覆盖率则是衡量测试覆盖代码的程度的重要指标之一。Python cove
机器学习初学者
0
【性能监控】如何有效监测网页静态资源大小?
前言作为前端人员肯定经常遇到这样的场景:需求刚上线,产品拿着手机来找你,为什么页面打开这么慢呀,心想自己开发的时候也有注意性能问题呀,不可能会这么夸张。那没办法只能排查下是哪一块影响了页面的整体性能,打开浏览器控制台一看,页面上的这些配图每张都非常大,心想这些配图都这么大,页面怎么快,那么我们有没有
高级前端进阶
0
如何减少网页卡顿
大厂技术 高级前端 Node进阶点击上方 程序员成长指北,关注公众号回复1,加入高级Node交流群前言经常听人说,“不要阻塞主线程”,或者 “减少长耗时 ",该如何做呢?聊网站性能的文章有很多,通常为了提高 js 性能,避不开这两点:不要阻塞主线
程序员成长指北
0
【Python】Python加速运行技巧
Python 是一种脚本语言,相比 C/C++ 这样的编译语言,在效率和性能方面存在一些不足。但是,有很多时候,Python 的效率并没有想象中的那么夸张。本文对一些 Python 代码加速运行的技巧进行整理。 0. 代码优化原则 本文会介绍不少的 Python 代码加速运行的技巧。在深入代码优化细
机器学习初学者
0
21.3K star!推荐一款可视化自动化测试/爬虫/数据采集神器!功能免费且强大!
【温馨提示】由于公众号更改了推送规则,不再按照时间顺序排列,如果不想错过测试开发技术精心准备的的干货文章,请将测试开发技术设为“星标☆”,看完文章在文尾处点亮“在看”!大家好,我是狂师!在大数据时代,信息的获取与分析变得尤为重要。对于开发者、数据分析师乃至非技术人员来说,能够高效地采集网络数据并进行
测试开发技术
4