使用Python requests.get()无法抓取MIT页面排名标准区域的问题
问题原因与解决办法
无法抓取排名参数区域的原因
目标页面中包含10个排名参数的区域是JavaScript动态加载的:requests.get()只能获取页面初始的静态HTML代码,而该区域的数据是页面加载完成后,通过异步请求后端接口获取并由JS渲染到页面上的,所以静态请求无法拿到这部分内容。
解决方案
方案1:直接抓取数据接口(高效推荐)
打开浏览器开发者工具(F12),切换到「Network」标签页,刷新页面后筛选「XHR/Fetch」类型的请求,找到返回排名参数数据的接口(通常是JSON格式),直接请求该接口即可获取数据,无需解析HTML。
示例代码:
import requests # 需自行通过抓包确认实际接口URL api_url = "https://www.topuniversities.com/sites/default/files/qs-rankings-data/374055.txt" headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36"} response = requests.get(api_url, headers=headers) data = response.json() parameters_list = [] value_list = [] # 根据接口返回的实际数据结构调整字段名 for indicator in data["indicators"]: parameters_list.append(indicator["name"]) value_list.append(str(indicator["score"])) print("参数列表:", parameters_list) print("分数列表:", value_list)
方案2:用Selenium模拟浏览器渲染
如果找不到接口或接口有反爬限制,可以用Selenium模拟浏览器加载页面,等待JS渲染完成后再获取完整HTML,进而解析目标内容。
示例代码:
from selenium import webdriver from selenium.webdriver.chrome.options import Options from bs4 import BeautifulSoup url = 'https://www.topuniversities.com/universities/massachusetts-institute-technology-mit' # 配置无头浏览器(可选,不显示窗口) chrome_options = Options() chrome_options.add_argument("--headless=new") chrome_options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36") driver = webdriver.Chrome(options=chrome_options) driver.get(url) # 等待页面动态内容加载完成(可根据实际情况调整等待时间) driver.implicitly_wait(10) # 获取渲染后的完整页面源码 soup = BeautifulSoup(driver.page_source, 'lxml') driver.quit() # 定位目标元素(需根据页面实际HTML结构调整选择器) parameters_list = [] value_list = [] for item in soup.find_all('div', class_='indicator-item'): param_name = item.find('div', class_='indicator-name').text.strip() param_score = item.find('div', class_='indicator-score').text.strip() parameters_list.append(param_name) value_list.append(param_score) print("参数列表:", parameters_list) print("分数列表:", value_list)
内容的提问来源于stack exchange,提问作者Gautam Swamy
相关产品推荐
相关产品推荐

