在使用 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如何调用openai的api实现知识讲解类动画讲解视频的合成?
html如何直接调用openai的api实现海报可视化设计及文本描述生成可编辑海报?
f12前端调试如何找出按钮点击事件触发的那段代码进行调试?
abcjs如何将曲谱播放后导出mid和wav格式音频下载?
python如何将曲子文本生成音乐mp3或wav、mid文件
python中mp3、wav音乐如何转成mid格式?
js在HTML中如何将曲谱生成音乐在线播放并下载本地?
python如何实现在windows上通过键盘来模拟鼠标操作?
python如何给win10电脑增加文件或文件夹右键自定义菜单?
python如何将音乐mp3文件解析获取曲调数据?