从trackcorona.live提取新冠病例遇IndexError问题求助
解决爬取trackcorona.live时触发IndexError的问题
嘿,我碰到过类似的情况!你这个问题大概率是因为目标网站的页面结构或者数据加载方式变了——之前能用的numbers类名可能被换掉了,或者现在数据是靠JavaScript动态渲染的,直接用requests拿静态HTML根本抓不到内容。下面给你几个可行的解决思路:
1. 先排查页面结构的变化
首先打开浏览器访问网站,按F12调出开发者工具,找到显示确诊病例的元素,看看它现在用的是什么类名或者选择器。比如原来的numbers类可能改成了stat-value之类的,那你只需要修改find_all的参数就行:
# 假设新的类名是stat-value,根据实际情况调整 li = data.find_all(class_='stat-value')
2. 处理动态渲染的场景
如果查完发现数据是页面加载后通过JS从后台拉取的,那requests就不管用了——它只能拿到初始的空HTML,不会执行JavaScript。这时候可以用Selenium模拟浏览器加载页面,获取渲染后的完整内容:
先装Selenium:
pip install selenium
然后下载对应浏览器的驱动(比如ChromeDriver),把驱动路径配置好,再用下面的示例代码:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 初始化Chrome驱动,路径不对的话要自己修改 driver = webdriver.Chrome(executable_path='./chromedriver') driver.get('https://www.trackcorona.live') # 等待10秒,直到目标元素加载出来(选择器要换成你实际找到的) try: confirmed_elem = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CLASS_NAME, 'your-new-class-name')) ) confirmed = int(confirmed_elem.text.replace(',', '')) # 记得处理数字里的千分位逗号 print('Confirmed Cases:', confirmed) finally: driver.quit()
3. 最优解:直接调用网站的API
其实很多动态网站都会有后台API提供数据,你可以在开发者工具的「网络」标签里,过滤XHR/fetch请求,找到网站拉取病例数据的接口。直接请求这个API拿JSON数据比解析HTML靠谱多了,也不容易因为页面改版失效:
import requests # 这里的API地址需要你自己抓包确认,以下是示例格式 api_url = 'https://api.trackcorona.live/data/all' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36' } response = requests.get(api_url, headers=headers) data = response.json() confirmed = data['confirmed'] print('Confirmed Cases:', confirmed)
小提示:请求API的时候记得加个合理的
User-Agent头,不然容易被网站的反爬机制拦下来。
内容的提问来源于stack exchange,提问作者Yoda
相关产品推荐
相关产品推荐

