Python BeautifulSoup抓取新冠疫苗接种表格代码问题求助
问题排查与解决
已确认的2个核心问题
- 反爬拦截:你没给请求加浏览器伪装头,requests默认的请求头会被站点识别为爬虫,所以你拿到的HTML根本不是目标站点的正常响应,从你贴的HTML片段的title就能看出来,返回的是其他站点的内容
- 动态渲染问题:就算请求正常,你要的疫苗统计表格是页面加载完成后由JS异步拉取数据渲染生成的,静态HTTP请求拿到的初始HTML里没有任何表格数据,自然找不到
<tr>元素
推荐解决方法
直接用Selenium模拟真实浏览器访问,自动等待JS渲染完成后再提取数据,适配动态页面的同时也能绕过基础反爬。
第一步:安装依赖
pip install selenium beautifulsoup4 webdriver-manager
第二步:修正后的代码
from selenium import webdriver from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager from bs4 import BeautifulSoup 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(service=Service(ChromeDriverManager().install())) driver.get("https://ourworldindata.org/covid-vaccinations") # 显式等待表格加载完成,最多等10秒,比固定等待时间更高效 try: WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.TAG_NAME, "table")) ) # 拿到渲染完成的完整HTML page_source = driver.page_source soup = BeautifulSoup(page_source, "html.parser") # 定位表格,建议你自己打开浏览器F12审查你要的表格的class/id,替换下面的选择器,定位更精准 target_table = soup.find("table") if target_table: rows = target_table.find_all("tr") for row in rows[1:]: # 跳过表头行 cols = [col.text.strip() for col in row.find_all("td")] if len(cols) >=3: # 按你需要的列顺序取对应字段即可 country = cols[0] fully_vaccinated = cols[1] partly_vaccinated = cols[2] print(country, fully_vaccinated, partly_vaccinated) finally: # 自动关闭浏览器 driver.quit()
注意事项
你可以用浏览器F12的元素选择器点击目标表格,复制对应的CSS选择器,替换代码中的target_table = soup.find("table")部分,就能精准定位到你要的那个表格,避免拿到页面其他无关表格的内容。
内容的提问来源于stack exchange,提问作者Sophie
相关产品推荐
相关产品推荐

