Python中使用selenium打开网页后,仍然无法获取到关键数值,请教!

一个.net 的项目,模拟登陆,一路模拟点击到最后关键的页面,此页面是一个竞价拍卖的竞拍页面,显示当前的价格等关键数值,但是我打印了 page_resource,却看不到这些关键数值,所以导致无法获取到,这个.net 是个外包项目,之中的难处就不说了,提供支持的人都太水了,无法和他们沟通这些,我只知道这个页面最后是通过 signalR 和服务器保持通信的,不知道是否和此有关呢? 抱歉,因为是公司业务内部页面,我无法提供 url


Python中使用selenium打开网页后,仍然无法获取到关键数值,请教!

21 回复

我遇到过类似的问题,通常是因为页面元素还没加载完。试试用显式等待来确保元素出现再获取数据。

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

driver = webdriver.Chrome()
driver.get("你的网址")

try:
    # 等待特定元素出现,最长10秒
    element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "元素ID"))
    )
    value = element.text
    print(f"获取到的值: {value}")
except Exception as e:
    print(f"获取失败: {e}")
finally:
    driver.quit()

如果元素在iframe里,需要先切换进去:

iframe = driver.find_element(By.TAG_NAME, "iframe")
driver.switch_to.frame(iframe)
# 现在可以获取iframe内的元素了

数据可能是动态加载的,检查一下是不是AJAX请求,可能需要等更长时间或者监听网络请求。

用显式等待确保元素加载完成再操作。

我打印了 page_resource,元素能定位到,但是关键数值 myprice 没有渲染出来

<div class=“mypricetitle”>我的报价(<label class=“CurrencyUnit”>元</label>)</div>
<div class=“myprice”></div>

是不是浏览器加载了一些插件,在插件中显示的,.net 最喜欢搞这种东西

最后实在点不到了,可以试试用 js 点

我感觉是因为 selenium 的缘故,我直接调用 chrome,全程可以看到,都是顺利获取完成的
应该是 selenium 无法支持获取 websocket 数据的缘故吧,不知道 pyppeteer 是否可以?

https://groups.google.com/forum/#!topic/selenium-users/oQfUlZPB0Ck

元素可以定位,只是数据不交互

使用 selenium 操作 chrome 时,chrome 中出现数据了吗?
代码中 等待元素加载完成了吗?
https://blog.csdn.net/leorx01/article/details/71086875

一种可能是缺少 js 加载的时间,
验证方式是用 selenium 调 chrome 窗口模式直观看到页面的变化,看看有没有数据

应该是异步数据加载的关系吧,你可以试试打开关键页面之后,等待几秒钟再获取 page_resource

直接调用 chrome 是没有问题的,但是打印 page_resource 一些关键数值没有.我模拟点击报价,也点击了,但是没有事件发生.
页面是通过 websock 通信获取数据的,应该类似股票交易那种实时交互的,

大佬,有 python 的 demo 嘛?

你在 5 楼的想法有道理。现在有两种可能,要么是异步加载的问题,要么是 websocket 的问题。

我把最终的页面截了个图看了下,少一些关键的数值,这些数值,都是通过 websocket 交互的,查了资料,也没结果.
我最终其实并不是为了获取数值,我是要自动化一套完整的流程,避免人工,这个实在不知道咋搞了,最后一步卡主了…

建议跟踪下 ws 交互后的数据如何填充到页面上的。

  1. iframe
    2. 延时一会等加载完毕
    3. while 一直等加载完成
    4. 我遇到的是 SS 全局代理了, 导致无法访问…我调试了一个多小时才发现…菜的无法直视

另外一个思路,你这个数据是需要通过交互来获取的,你能确定你模拟点击报价那个元素生效了么。
不同的窗口页面元素有不同的排列,可能有元素挡在点击报价前面导致点击无效。

验证的方法是你把 chrome headless 模式关掉,在最终页面打开开发者工具,
1. 检查元素看看有没有遮挡。
2. 直接手动点击,看数据能不能加载出来。

1.sleep 一下
2.找到生成 muprise 的 js,js2py 执行

非常感谢各位,是最开始我发现是 iframe,我就直接访问的 iframe 的 url,结果导致了,数据是原页面获取的,往 iframe 里面套.
后来我有仔细学习了下用了 switch_to.iframe 切过去,最终搞定了,多谢以上各位朋友.

回到顶部