在使用 Selenium 进行爬虫时,有些网站可能会使用 JavaScript 的事件机制来实现用户行为的模拟,例如模拟鼠标点击、键盘输入等操作,同时使用 isTrusted 属性来验证事件对象是否来自真实的用户操作。如果 isTrusted 属性为 false,则说明事件对象是由 JavaScript 代码生成的,而不是来自真实的用户操作,这可能会导致爬虫被识别并被阻止访问网站。
要绕过这种 isTrusted 验证,有几种方法可供尝试:使用 headless 模式:Selenium 支持 headless 模式,即在无头浏览器中运行测试,这样可以绕过大部分 JavaScript 的验证机制。例如,可以使用 Chrome 浏览器的 headless 模式启动 Selenium:
from selenium import webdriver
# 创建 Chrome 浏览器实例
options = webdriver.ChromeOptions()
options.add_argument('--headless')
driver = webdriver.Chrome(options=options)
修改事件属性:可以使用 JavaScript 修改事件对象的 isTrusted 属性,将其设置为 true。例如,可以注入以下 JavaScript 代码,将 isTrusted 属性设置为 true:
driver.execute_script('''
function dispatchEvent(element, event) {
event.isTrusted = true;
element.dispatchEvent(event);
}
''')
然后,在模拟用户点击或输入等操作时,使用 dispatchEvent 方法代替 click 或 send_keys 方法,例如:
# 获取搜索框元素
input_box = driver.find_element_by_name('q')
# 创建模拟事件
event = driver.execute_script('return new Event("input")')
# 修改事件属性
driver.execute_script('''
arguments[0].isTrusted = true;
''', event)
# 触发事件
driver.execute_script('''
arguments[0].target.value = arguments[1];
arguments[0].target.dispatchEvent(arguments[1]);
''', input_box, event)
使用第三方库:有些第三方库可以模拟真实的用户操作,绕过 isTrusted 验证。例如,可以使用 pyautogui 库模拟鼠标移动、点击、键盘输入等操作,例如:
import pyautogui
# 获取搜索框元素
input_box = driver.find_element_by_name('q')
# 将光标移动到搜索框
input_box.click()
pyautogui.moveTo(input_box.location['x'] + 10, input_box.location['y'] + 10)
# 输入关键词
pyautogui.typewrite('selenium')
# 模拟回车键
pyautogui.press('enter')
需要注意的是,以上方法都不是绝对可行的,具体效果可能会因网站实现方式和浏览器版本等因素而有所不同,需要根据具体情况进行尝试和调整。同时,也应该遵守相关法律法规和伦理规范,避免对被爬取网站造成不必要的影响。
网友回复
python如何实现torrent的服务端进行文件分发p2p下载?
如何在浏览器中录制摄像头和麦克风数据为mp4视频保存下载本地?
go如何编写一个类似docker的linux的虚拟容器?
python如何写一个bittorrent的种子下载客户端?
ai能通过看一个网页的交互过程视频自主模仿复制网页编写代码吗?
ai先写功能代码通过chrome mcp来进行测试功能最后ai美化页面这个流程能行吗?
vue在手机端上下拖拽元素的时候如何禁止父元素及body的滚动导致无法拖拽完成?
使用tailwindcss如何去掉响应式自适应?
有没有直接在浏览器中运行的离线linux系统?
nginx如何保留post或get数据进行url重定向?