Selenium反爬的几种方式
selenium是用来自动化操作web页面元素的工具,当我们有需要自动化某些业务流程的时候就可以用到。但是对于有些网站来说,是有各类反爬机制,会监测到是否是真人操作,这里记录了几种可以绕过反爬机制的方式。
一. 利用devtools,用命令行启动chrome浏览器,指定remote-debugging-port,随后由selenium接管该进程,便达到了绕过selenium启动检查的目的。
这个在之前的一篇文章中有记录:Python加Selenium自动化测试知乎网站(一)配置启动浏览器
二. 修改window.navigator.webdriver的值,有些网站时监测window.navigator.webdriver的值来判断是否用了selenium自动化,于是修改该值便能绕过这个检查。
当用selenium打开浏览器时,该值为true,按如下操作启动浏览器,该值变为false
from selenium.webdriver import Chrome
from selenium.webdriver import ChromeOptions
option = ChromeOptions()
option.add_experimental_option('excludeSwitches', ['enable-automation'])
option.add_argument("--disable-blink-features=AutomationControlled")
driver = Chrome(options=option)
也可以加上这两句
script = '''object.defineProperty(navigator,'webdriver',{undefinedget: () => undefined})'''
driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {'source': script})
三. 修改chromedriver中的key,看到有其他人分享过有的网站会检查webdriver驱动文件的key值,那么替换掉该值可以绕过该检查。
但我还没见到过有这类逻辑的网站。
具体的方法是以chromedriver为例
vim chromedriver
用/cdc_做为关键词搜索,
就会看到类似如下的内容
function getPageCache(opt_doc, opt_w3c) {
var doc = opt_doc || document;
var w3c = opt_w3c || false;
// |key| is a long random string, unlikely to conflict with anything else.
var key = '$cdc_asdjflasutopfhvcZLmcfl_'; ## here
if (w3c) {
if (!(key in doc))
doc[key] = new CacheWithUUID();
return doc[key];
} else {
if (!(key in doc))
doc[key] = new Cache();
return doc[key];
}
}
把这个值改成同长度的值,或者就改最后一个字母比如var key = '$cdc_asdjflasutopfhvcZLmcflT';, 然后保存,再次启动driver。
四. 注意操作间隔时间, 有的网站的检查比较简单粗暴,看你每次操作的间隔,因为人和机器最明显的区别就是机器太快了,当一个流程操作达到一秒执行了十多个操作,那么不用说了,肯定不是真人。于是在这样的情况下注意设置一些等待时间即可。
上一篇:
Mac M1重装环境问题汇总