在使用 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')
需要注意的是,以上方法都不是绝对可行的,具体效果可能会因网站实现方式和浏览器版本等因素而有所不同,需要根据具体情况进行尝试和调整。同时,也应该遵守相关法律法规和伦理规范,避免对被爬取网站造成不必要的影响。
网友回复