selenium爬虫如何避免对isTrusted属性检测?

selenium爬虫如何避免对isTrusted属性检测?

1、前言

  各位码友,有两天不见,想小码哥了没,哈哈哈?成都疫情在平静9个月之后,又死灰复燃,目前还未找到确切的源头,提醒各位成都的码友一定注意戴口罩,做好自我防护,相信有关部门的防疫措施,一起共渡难关。   好了,今天咱们再继续selenium爬虫相关系列。主题是selenium爬虫如何做到避免事件的isTrusted属性检测。

2、原理

  首先我们问下自己什么是isTrusted属性?引用mozilla.org的解释:“Event接口的 isTrusted 属性是一个只读属性,它是一个布尔值(Boolean)。当事件是由用户行为生成的时候,这个属性的值为 true ,而当事件是由脚本创建、修改、通过 EventTarget.dispatchEvent() 派发的时候,这个属性的值为 false 。

3、举例

  上面只是书面上的概念,咱们以实际的网页作为例子来说明更直观一些。 我们有以下html的网页(在本地创建sample_istrusted.html文件,包含以下代码):

<html>
<body>

<h1>测试isTrusted</h1>

<button type="button" name="bt" id="bt">点我</button>

</body>
</html>

我们用selenium打开这个html,python代码如下:

from selenium import webdriver

chrome_options = webdriver.ChromeOptions()
chrome_options.add_experimental_option(
    "excludeSwitches", ["enable-automation"])
chrome_options.add_experimental_option('useAutomationExtension', False)
chrome_options.add_argument('lang=zh-CN,zh,zh-TW,en-US,en')
chrome_options.add_argument(
    'user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36')
driver = webdriver.Chrome(
    "./chromedriver", chrome_options=chrome_options)
driver.get("file:////Users/mdgc/Desktop/codesample/sample_istrusted.html")

打开网页显示如下:

  我们看到“点我”这个button它的id和name都是“bt”,我们通过js给这个按钮绑定一个点击事件的处理函数:

document.querySelector("#bt").addEventListener("click",
function(event) {
    console.log('被点击,isTrusted值为:');
    console.log(event.isTrusted);
});

  绑定事件的处理函数将会在button点击的时候在控制台输出isTrusted的值。   下面咱们开始测试以下两种情况,输出的isTrusted结果: - 1、手动点击button:   可以看到,手动点击输出isTrusted结果为true - 2、直接执行按钮的click函数:   我们可以看到程序模拟点击isTrusted输出为false

  到这里我们大概明白了原理:扩展到所有事件,如果事件是我们手动触发的isTrusted(可信)就是true,如果是通过JavaScript去直接执行就是false

  但是这与我们selenium有什么关系呢?别着急,我们用python的selenium代码再测试一下。

  怎么测试?首先我们在上面的python代码后面加个ipdb断点,全部代码如下:

from selenium import webdriver

chrome_options = webdriver.ChromeOptions()
chrome_options.add_experimental_option(
    "excludeSwitches", ["enable-automation"])
chrome_options.add_experimental_option('useAutomationExtension', False)
chrome_options.add_argument('lang=zh-CN,zh,zh-TW,en-US,en')
chrome_options.add_argument(
    'user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36')
driver = webdriver.Chrome(
    "./chromedriver", chrome_options=chrome_options)
driver.get("file:////Users/mdgc/Desktop/codesample/sample_istrusted.html")
import ipdb; ipdb.set_trace()#断点,执行到这里程序会进入ipython的调试控制台

我们执行以上代码,此时本地网页已经打开着,我们在打开的chrome控制台执行上面的绑定点击事件的js代码。另外在python代码,进入到断点,如下:

  • 1、我们直接用python代码click: 结果:

  我们可以看到,结果为true,这是为什么?咱们是通过代码去点击的啊? 不是手动的,别急,再测测另外一种。 - 2、我们直接用python执行js去点击: 结果: 不出所料,它其实与我们在chrome控制台直接执行js其实是一样的,结果为false。

4、原因

  因为我们在用python执行:

driver.find_element_by_name("bt").click();

  我们实际上走的是Chrome DevTools Protocol协议的这个接口:   并不是在chrome控制台下直接执行js,所以isTrusted还是和我们手动点击一样是可信的,就如同相当于浏览器给你开了一个方便之门,可以“假装是手动”,类似的其他点击操作原理一样,大家可以自己去尝试。

5、结果

  所以,最后我们需要注意的就是在selenium爬虫的时候,要想不要被前端反爬利用isTrusted检测到,就不要用直接执行js的方式去操作浏览器。

防止失联,关注微信公众号:码道工程。

本文作者:小码哥

本文链接:http://www.tnt0.com/archives/12

版权声明:本博客所有文章除特别声明外,均采用CC BY-NC-SA 3.0许可协议。转载请注明出处!

python requests爬虫如何p... <<
0 条评论

请先登陆注册

已登录,注销 取消