在利用selenium进行隐身模拟登录或者爬虫的时候,会被目标网站检测出selenium的特征值,从而被进行反爬了。
模拟浏览器的隐身模式和显示模式,就是是否添加headless属性值,options.add_argument('headless')。现在对这两种方式常规登录检测一下。
检测代码
from selenium import webdriver
url = 'https://intoli.com/blog/making-chrome-headless-undetectable/chrome-headless-test.html'
options = webdriver.ChromeOptions()
# options.add_argument('headless')
driver = webdriver.Chrome(options=options)
driver.get(url)
driver.save_screenshot('1.png')
显示模式浏览器特征
隐藏模式浏览器特征
取消上面headless的注释,然后发现ua和length出现飘红,说明这两项值需要进行修改。
利用mitmdump对浏览器指纹进行修改检测,首先创建监听mitmdump文件,编写driver_check.py文件。
这里我就简单检测了一下,将useragent进行修改,然后检测后,没有无头浏览器标识
def request(flow):
for info in flow.request.headers:
if info == 'User-Agent' and info == 'User-Agent'.lower() :
value = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36'
flow.request.headers[info] = value
运行测试sele.py文件
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
options = Options()
options.add_argument('--proxy-server=http://127.0.0.1:6666')
# options.add_argument('headless')
driver = webdriver.Chrome(options=options)
url = 'https://intoli.com/blog/making-chrome-headless-undetectable/chrome-headless-test.html'
driver.get(url)
webdriver = driver.execute_script("return window.navigator.webdriver")
print(webdriver)
language =driver.execute_script("return window.navigator.languages")
print(language)
plugins = driver.execute_script("return window.navigator.plugins")
print(plugins)
driver.save_screenshot('1.png')
# driver.close()
运行cmd命令,输入mitmdump -p 666 -s driver_check.py文件进行监听
在显示浏览器模式下,ua值是正常的
在隐身浏览器模式下,ua值是由无头标识的
接下来在drier_check文件中注入js代码
import re
EXE_JS = 'Object.defineProperties(navigator,{webdriver:{get:() => false}});Object.defineProperty(navigator, "plugins", {get: () => new Array(Math.floor(Math.random() * 6) + 1),});Object.defineProperty(navigator, "languages", {get: function() {return ["en", "es"];}});Object.defineProperty(HTMLDivElement.prototype, "offsetHeight", {get: function() {if (this.id === "modernizr") {return 1;}return elementDescriptor.get.apply(this);},});'
def response(flow):
match = re.search(r'\.js$', flow.request.url)
if match:
# 屏蔽selenium检测
# print(flow.response.text)
flow.response.text = EXE_JS + flow.response.text
# print(flow.response.text)
输入检测结果,可以看到webdriver属性、plugins属性值等都被修改为正常值
发现检测值都被成功修改,修改完之后,我们在运行代码中加入正常的js注入方法就行。
通过mitmdump我们可以对隐身浏览器进行监测,并对某些值进行修改,修改完可以对其进行检查,在检查无误后,就可以对selenium浏览器进行js注入,通过mitmdump进行抓包分析,可以轻松的对浏览器进行检查