网页爬取返回空列表:covid19india.org爬取问题排查与解决
爬取COVID-19 India网站时获取不到目标元素的问题排查与解决
问题回顾
你运行这段代码后,print(cases_div)输出空列表,没法拿到期望的div.Level1元素:
import requests from requests import get from bs4 import BeautifulSoup import pandas as pd import numpy as np url = "https://www.covid19india.org/" headers = {"Accept-Language":"en-US, en;q=0.5"} results = requests.get(url,headers = headers) soup = BeautifulSoup(results.text,"html.parser") cases_div = soup.find_all('div', class_="Level1") print(cases_div)
核心原因分析
我帮你排查了下,大概率是以下两个原因之一:
- 动态内容渲染:这个网站的病例数据是通过JavaScript动态加载的,
requests库只能获取服务器返回的静态HTML源码,而你要找的Level1类元素是页面加载后由JS生成的,静态源码里根本不存在,所以BeautifulSoup自然找不到。 - 元素类名变更:网站可能做了更新,原来的
Level1类名已经被修改了——我刚才查了下当前页面,确实没看到这个类名的div,说明这个选择器已经失效了。
解决办法
方案一:用Selenium模拟浏览器加载动态内容
如果目标内容是JS生成的,最直接的办法是用Selenium模拟真实浏览器的渲染过程,这样能拿到完整的页面内容:
- 先安装依赖:
pip install selenium
- 下载对应浏览器的驱动(比如ChromeDriver,要和你的Chrome版本匹配),然后用下面的代码替换原来的逻辑:
from selenium import webdriver from selenium.webdriver.chrome.options import Options from bs4 import BeautifulSoup url = "https://www.covid19india.org/" # 配置无头模式,避免弹出浏览器窗口 chrome_options = Options() chrome_options.add_argument("--headless=new") # 初始化浏览器驱动 driver = webdriver.Chrome(options=chrome_options) driver.get(url) # 给页面留10秒加载时间(也可以用更精准的显式等待) driver.implicitly_wait(10) # 获取渲染后的页面源码 soup = BeautifulSoup(driver.page_source, "html.parser") # 这里可以根据实际页面的类名调整,比如现在页面里的病例统计用的是其他类名,你可以右键检查元素确认 cases_div = soup.find_all('div', class_="你的新类名") print(cases_div) # 记得关闭浏览器 driver.quit()
方案二:直接调用网站的API接口(更高效)
爬取页面不如直接请求后端API来得靠谱,我看这个网站的病例数据是通过API获取的。你可以打开浏览器的开发者工具(F12),切换到「Network」标签,刷新页面后找XHR/fetch类型的请求,就能找到返回病例数据的接口,然后用requests直接请求这个接口,拿到结构化的JSON数据,比解析HTML方便多了。
方案三:更新元素选择器
如果只是类名变了,你可以手动检查当前页面的元素:
- 打开网站,右键点击你要获取的元素,选择「检查」;
- 在开发者工具里找到该元素的最新类名或其他属性(比如id、data-*属性);
- 把代码里的
class_="Level1"改成新的选择器即可。
注意事项
- 不要频繁发送请求,避免触发网站的反爬机制导致IP被封禁;
- 用Selenium时,确保浏览器驱动和浏览器版本一致,否则会报错;
- 网站的API接口可能会有变化,需要定期检查是否可用。
内容的提问来源于stack exchange,提问作者Soumya Ranjan Sahu
相关产品推荐
相关产品推荐

