使用Python爬虫抓取官方单曲排行榜网站倒计时数据失败如何解决
问题原因
- 代码缩进错误:
if meme == "3":下方的函数定义、调用逻辑缩进不符合Python语法规则,若输入值不为3,调用cd()会直接抛出函数未定义错误 find_all参数使用错误:- 标签名参数错误传入了
"div#",正确的标签名应为div,#是CSS选择器语法,不适用于find_all的第一个标签参数 - 同时传入
id="countdown"和class_="days"存在逻辑错误,id为countdown的是倒计时外层容器,类为days的是容器下单独存放天数的子元素,二者是父子节点关系,不存在于同一个标签上 - 额外传入的
text="count"参数无意义,目标节点不存在值为count的文本内容
- 标签名参数错误传入了
- 若修复上述参数后仍返回空结果,说明该倒计时数据是前端JavaScript动态渲染的,
requests只能拉取静态HTML源码,无法获取JS执行后生成的动态内容
修复后的静态爬取代码(仅针对静态渲染场景)
import requests from bs4 import BeautifulSoup meme = input("Number: ") def cd(): url = 'https://www.officialcharts.com/charts/singles-chart/' req = requests.get(url) soup = BeautifulSoup(req.content, 'html.parser') # 先匹配外层倒计时容器,再查找内部的天数节点 countdown_container = soup.find(id="countdown") if countdown_container: days = [i.text.strip() for i in countdown_container.find_all(class_="days")] print(days) else: print("未找到倒计时容器,内容为动态渲染,请改用selenium等动态爬取工具") if meme == "3": cd()
动态内容解决方案
如果确认内容是JS动态渲染的,改用selenium模拟浏览器加载页面后再提取内容,核心流程如下:
- 安装selenium和对应版本的浏览器驱动
- 用selenium打开目标页面,等待倒计时节点加载完成
- 提取对应节点的文本内容即可
内容的提问来源于stack exchange,提问作者Edit
相关产品推荐
相关产品推荐

