Selenium+Pyquery爬取宾大专业列表仅返回Loading如何解决
问题描述
我编写的实现代码如下:
driver = webdriver.Chrome() wait = WebDriverWait(driver, 20) driver.get("https://www.college.upenn.edu/majors-list") #print(driver.title) td5 = pq(driver.page_source)
代码运行后输出内容如下:
Penn List of College Majors\nLoading... List of College Majors\nLoading... List of College Majors\nLoading...
我的需求是获取该页面的学院专业完整列表,目前已尝试Pyquery和Selenium两种实现方案均未成功,恳请协助排查解决。
问题根因
代码中虽然初始化了20秒时长的显式等待对象,但没有绑定任何等待判定规则,driver.get()发起请求后立刻读取页面源码,此时页面的专业列表数据还在异步拉取中,前端仅展示Loading...加载占位符,因此无法获取到完整的专业列表内容。
可行解决方案
方案1:修正Selenium等待逻辑,等内容渲染完成后再解析
添加显式等待判定规则,等专业列表的条目元素加载到DOM树之后再读取页面源码做解析,修正后可正常拿到数据:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from pyquery import PyQuery as pq driver = webdriver.Chrome() wait = WebDriverWait(driver, 20) driver.get("https://www.college.upenn.edu/majors-list") # 等待专业列表条目加载完成 wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, ".view-majors-list li"))) doc = pq(driver.page_source) # 提取所有专业名称 major_list = [item.text().strip() for item in doc(".view-majors-list li a").items()] driver.quit() print(major_list)
方案2:直接请求数据接口(无需渲染页面,效率更高)
通过浏览器开发者工具抓包可以发现,页面加载时会通过异步接口拉取专业列表的结构化数据,直接请求该接口可以跳过页面渲染步骤,爬取效率更高:
import requests from pyquery import PyQuery as pq api_url = "https://www.college.upenn.edu/views/ajax?view_name=majors&view_display_id=page_1" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36", "Referer": "https://www.college.upenn.edu/majors-list" } resp = requests.get(api_url, headers=headers) data = resp.json() # 从返回的HTML片段中解析专业列表 doc = pq(data[-1]["data"]) major_list = [item.text().strip() for item in doc("li a").items()] print(major_list)
内容的提问来源于stack exchange,提问作者Wei Zhang
相关产品推荐
相关产品推荐

