使用Selenium爬取EMMA网站CUSIP详情无法提取目标HTML怎么办
问题原因
你代码的核心问题是:Selenium启动的浏览器和你后续调用的requests是完全独立的两个会话,不存在状态共享。你之前在浏览器中点击同意cookie、同意免责声明的操作产生的会话凭证、cookie都只存在于Selenium控制的Chrome进程里,用requests直接请求详情页URL时,网站会判定你未同意相关协议,直接返回无数据的空白/提示页面,自然找不到目标标签。
另外这类站点的详情数据大多是页面加载后动态渲染的,即使你给requests带上cookie,也大概率拿不到渲染后的完整内容。
解决方法
直接通过Selenium获取已经完成渲染的页面源码即可,不需要额外调用requests请求。你可以等目标元素加载完成后,调用driver.page_source拿到完整HTML。
修改后的完整代码
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 bs4 import BeautifulSoup as bs # 输入要搜索的CUSIP CUSIP = "266818BT9" # EMMA首页地址 URL = "https://emma.msrb.org/" driver = webdriver.Chrome() # 隐式等待全局只需设置一次 driver.implicitly_wait(10) driver.get(URL) wait = WebDriverWait(driver, 15) # 同意cookie wait.until(EC.element_to_be_clickable((By.XPATH,'//*[@id="acceptId"]'))).click() # 输入CUSIP并搜索 SearchBox = driver.find_element(By.XPATH, '//*[@id="quickSearchText"]') SearchBox.send_keys(CUSIP) SearchButton = driver.find_element(By.XPATH, '//*[@id="quickSearchButton"]') SearchButton.click() # 同意免责声明 AcceptButton2 = wait.until(EC.element_to_be_clickable((By.XPATH,'//*[@id="ctl00_mainContentArea_disclaimerContent_yesButton"]'))) AcceptButton2.click() # 等待目标数据块加载完成,避免页面还没渲染完就拿源码 wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'info-focus-2'))) # 直接拿Selenium渲染好的完整页面源码,不需要requests page_source = driver.page_source soup = bs(page_source, 'lxml') # 提取目标数据示例 info_block = soup.find('ul', class_='info-focus-2') # 拿Dated Date对应的值 dated_date = info_block.find('span', string='Dated Date').find_next('span', class_='float-right').text print(f"Dated Date: {dated_date}") # 遍历所有字段 for li in info_block.find_all('li'): label = li.find('span').text.strip() value = li.find('span', class_='float-right').text.strip() print(f"{label}: {value}") # 用完记得关闭浏览器 driver.quit()
补充说明
- 代码里把旧版Selenium的
find_element_by_xpath写法替换成了新版标准的find_element(By.XPATH, xxx),兼容Selenium 4.0+版本 - 增加了显式等待目标元素加载的逻辑,避免网络波动导致页面没渲染完就提取数据返回空值
- 不需要手动处理UA和cookie,Selenium控制的浏览器会自动处理所有会话状态
内容的提问来源于stack exchange,提问作者user16768885
相关产品推荐
相关产品推荐

