使用requests爬取BAIR学生页面时无法获取姓名等关键信息
解决伯克利BAIR学生页面爬虫问题
问题原因
你遇到的两个问题本质是同一个原因:页面的学生姓名是通过JavaScript动态渲染的。requests.get()只能获取页面的静态HTML框架,那些学生信息是页面加载完成后,通过JS异步拉取数据再渲染到页面上的,所以静态HTML里的<span class="name">是空的,且只保留了第一条占位元素。
解决方案
方案1:用Playwright渲染动态页面(推荐)
Playwright可以模拟真实浏览器的行为,自动处理JS渲染,完整获取页面内容:
- 先安装依赖:
pip install playwright playwright install chromium
- 编写爬虫代码:
from playwright.sync_api import sync_playwright URL = "https://bair.berkeley.edu/students.html" with sync_playwright() as p: # 启动无界面Chrome浏览器 browser = p.chromium.launch(headless=True) page = browser.new_page() page.goto(URL) # 等待姓名元素加载完成,避免获取空内容 page.wait_for_selector(".name") # 提取所有姓名文本 student_names = page.locator(".name").all_text_contents() # 过滤空内容并打印 for name in student_names: clean_name = name.strip() if clean_name: print(clean_name) browser.close()
方案2:直接请求后端API接口
打开浏览器开发者工具的「网络」面板,刷新页面后,找到加载学生数据的JSON接口(通常在XHR/fetch分类下),直接请求接口获取数据会更高效:
import requests # 替换为你抓包得到的真实API地址 API_URL = "这里填实际的学生数据接口URL" resp = requests.get(API_URL) student_data = resp.json() # 根据接口返回的JSON结构提取姓名,示例如下(需根据实际结构调整) for item in student_data: print(item.get("name"))
注意:抓包时要注意接口的请求头和参数,确保请求符合网站的规则。
内容的提问来源于stack exchange,提问作者Julius
相关产品推荐
相关产品推荐

