Selenium 操作被屏蔽
使用selenium自动化网页时,有一定的机率会被目标网站辨识,一旦被测量到,目标网站会拦截该客户端作出的网页操作。
比如天猫和大众点评的登入页,当打开浏览器,输入用户名和密码时,是能正常步入首页的,但是假如是通过selenium打开, 会直接提示验证失败,点击框体重试。
本文介绍一种办法,不需要更改浏览器属性,不需要注入JavaScript脚本,也能轻松绕开网站监测。
Selenium为什么会被测量
每一个浏览器访问网站时,都会带上特定的指纹特点,网站会解析这种特点,从而判定此次访问是不是自动化程序。
一个最广为人知的特点是window.navigator.webdriver,该特点直接标注此浏览器是webdriver程序。当一个浏览器通过selenium启动后,在开发者工具中输入这个属性,会发觉被标为 true, 而手工打开的浏览器是 false。
实际上,浏览器被测量为webdriver程序的特点并不止这一个,这意味着,就算你通过更改属性,也不一定能绕开网站的测量。
我们可以通过 sannysoft 来测量浏览器指纹,如果浏览器是通过selenium等自动化程序打开的,访问这个网址后会有很多特点曝露这种指纹,这些特点的值和手工打开后的值是不一样的,因此可以很轻易被他人检查下来。
有人也企图不用selenium,换成puppeter和playwright这样的自动化工具,但是结局都是一样的。
Selenium防止被测量方式
浏览器在启动时都会带上指纹特点,如果使用自动化程序启动时早已被标记,那为何不直接用手工启动,然后用Selenium联接早已启动的浏览器呢?
那手工打开浏览器要做哪些操作就能让Selenium联接呢?Selenium又是如何联接手工打开的浏览器呢?
我在 Selenium联接已存在的浏览器1 这篇文章详尽记录了须要的步骤,概括上去:
1、打开浏览器时添加以下参数:
--remote-debugging-port=9222 --user-data-dir="C:\\selenium\\ChromeProfile"
2、selenium中设置浏览器选项,通过前面设置的 9222端口联接浏览器:
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")
driver = webdriver.Chrome(options=chrome_options)
通过 subprocess 运行浏览器
当然,做自动化程序通常不会手工点击图标来打开浏览器,我们可以用命令行启动浏览器,然后再用 selenium 连接。
import subprocess
cmd = '"C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe" ' \\
'--remote-debugging-port=9222 ' \\
'--user-data-dir="C:\\selenium\\ChromeProfile"'
subprocess.run(cmd)
我是九柄,感谢耐心阅读,下次见。