如何用Python从React应用的script标签爬取数据(RateMyProfessor场景)
无需渲染页面提取RateMyProfessor的教师数据
直接用requests配合HTML解析和JSON处理就能提取window.__RELAY_STORE__里的教师数据,不用Selenium渲染,步骤如下:
第一步:解析页面找到目标script标签
使用BeautifulSoup解析请求到的页面内容,筛选出包含window.__RELAY_STORE__的script标签。先安装依赖:pip install requests beautifulsoup4第二步:提取并处理JSON数据
从找到的script内容中,截取window.__RELAY_STORE__ =之后的JSON字符串,去掉末尾的分号等无关字符,再用json模块解析成Python字典。第三步:提取目标教师信息
遍历解析后的JSON对象,筛选出包含教师评分信息的条目,提取legacyId、avgRating、numRatings等字段。
完整代码示例
import requests from bs4 import BeautifulSoup import json # 请求目标页面 url = "https://www.ratemyprofessors.com/search/teachers?query=Michael&sid=U2Nob29sLTM5OQ==" headers = { # 添加必要的请求头模拟浏览器,避免被拦截 "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" } response = requests.get(url, headers=headers) soup = BeautifulSoup(response.text, "html.parser") # 查找包含window.__RELAY_STORE__的script标签 target_script = None for script in soup.find_all("script"): if script.string and "window.__RELAY_STORE__" in script.string: target_script = script.string break if target_script: # 提取JSON部分 json_str = target_script.split("window.__RELAY_STORE__ = ")[1].rstrip(";\n") relay_store = json.loads(json_str) # 遍历提取教师信息 teacher_data = [] for key, value in relay_store.items(): # 筛选包含目标字段的条目 if all(k in value for k in ["legacyId", "avgRating", "numRatings"]): teacher_info = { "legacyId": value["legacyId"], "avgRating": value["avgRating"], "numRatings": value["numRatings"] } teacher_data.append(teacher_info) # 打印结果 for teacher in teacher_data: print(teacher) else: print("未找到包含window.__RELAY_STORE__的script标签")
注意事项
- 务必添加
User-Agent请求头,否则网站可能拒绝请求或返回不完整内容。 - 若网站结构调整,
window.__RELAY_STORE__的命名或script标签的位置可能变化,需要根据实际页面内容调整筛选逻辑。 - 不要频繁发送请求,避免触发网站反爬机制。
内容的提问来源于stack exchange,提问作者Trollermaner
相关产品推荐
相关产品推荐

