selenium执行Js

本文介绍了作者在使用selenium爬取一个依赖ActiveX的旧网站时遇到的挑战,如动态加载、时间戳参数以及只能用IE访问等问题。作者通过execute_script()和execute_async_script()执行JavaScript解决异步请求,将数据存储在body属性中以获取所需信息。文章总结了selenium在模拟用户行为和处理异步请求方面的优势,并提醒读者注意驱动程序与selenium版本的匹配以及异常处理和日志记录的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

好久不更了,工作太忙- -入职不到两三个月,编程语言从Java跳C/C++,后来又需要爬虫,又去学了python,最近几日还在学vue...怎么说呢,往好听了说叫博学多识,往坏了说广而不专- -。 接下来我就对最近的爬虫工作做一个总结。

我要爬取的网站不方便贴出来,不过这是个老网站了,没有什么验证码那一类的反爬措施。要说麻烦在哪了的话,那就是小日本的编程逻辑了吧...请求参数命名随心所欲(从这一点上来看,是个外包公司没错了,听说日本好多来中国找外包,这个应该不是,因为我在JS里看到的注释是日文的),着实让人摸不着头脑。这些参数大多是纯英文,但是有那么一部分关键的参数命名是用的日文发音加英文写的。。。在他们的请求参数里,还有一个时间戳参数,你每一次请求都会更新时间戳,下一次的请求必须时间戳跟这个时间戳一摸一样。这个操作可以的,直接让我没办法用同一个账号的cookie多个服务器同时爬。

最坑的是,它只能通过IE访问,因为它是ActiveX做的,这是微软提供的一个IE插件,我爬虫的过程中好多问题都让我怀疑人生了,动不动页面就卡住动不了了。所以,我程序里日志和异常捕获做的特别多。。。

selenium的execute_script()

我一开始使用webdriver获取元素然后.click()做的点击事件,不知道是不是ActiveX的问题...所以,通通换成了用Js操作:

    document.getElementById('Login').click()

而输入账号密码,用send_keys()仿佛又太慢了,干脆换成:

document.getElementById('XXX').value = 'SSM'

由于页面是动态加载的,所以在通过F12观察并拼接参数后,就开始访问对应的URL获取JSON(通过Python中的requests插件发送的请求),不过对有一部分URL的访问遇到了问题,没有报错,但是返回的JSON中缺少了我所需要的数据。于是突发奇想,干脆在页面上执行JS发送XMLHttpRequest请求获取数据好了,结果一试还真的就拿到了。但是XMLHttpRequest是异步的,获取后台数据后,会执行回调函数。所以突发奇想,用JS把数据都放到body标签的一个自定义的属性里,后面再获取这个属性就好了。以下,是我封装的方法:

def get_response_by_xml_request(driver, params, url, wait_time=1.5):
    "
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值