• selenium工作原理和反爬分析


    一、 Selenium

    Selenium是最广泛使用的开源Web UI(用户界面)自动化测试套件之一,支持并行测试执行。Selenium通过使用特定于每种语言的驱动程序支持各种编程语言。Selenium支持的语言包括C#,Java,Perl,PHP,Python和Ruby。Selenium支持的浏览器包括Internet Explorer,Mozilla Firefox,Google Chrome和Safari。

    二、 Selenium WebDriver

    WebDriver是由Selenium主持的W3C的一个标准。利用浏览器原生的API来与浏览器进行交互。使用了Client-Server的模式,还实现了一个基于HTTP的服务,对selenium提供了一套API。不同了浏览器的厂商提供自己对应的webdriver,Chrome的Chromedriver,Firefox就有专门的FirefoxDriver等,但是对外提供的API是一致的。Webdriver可以通过浏览器原生的API,对浏览器进行各种操作,由于是厂商自己提供的,稳定性、可靠性和安全性都是有保障的。

    三、浏览器

    常见的浏览器IE、Microsoft Edge、Chrome/Chromium、Firefox、Safari等,selenium都支持。Chrome和Chromium对比:

    ChromiumChrome
    开源项目不是开源项目
    开发版,更新速度快,会添加新功能,性能稍低是正式版,更新速度慢,比较稳定,性能高
    没有自动更新联网可以检测更新

    四、Selenium工作原理


    各个浏览器厂商根据WebDriver协议实现各自浏览器的webdriver,webdriver是可以向selenium客户端提供统一http接口的,常见的开发语言都可以实现selenium客户端Python、Java、C#等。
    Webdriver协议接口 https://www.w3.org/TR/webdriver1/#list-of-endpoints
    以Python selenium为例,实现了相关的接口协议

    可以看出selenium支持多种浏览器。

    调用Chrome浏览器时,selenium初始化过程中先,将chromedriver作为参数初始化Server类,并且执行start方法。


    进到start方法中可以看到,执行了一个CMD的命令,就是在启动chromedriver.exe服务。

    在初始化Server过程中起到了给chromedriver指定了一个空闲的端口号。


    可以看到后台进程chromedriver进程并且监听51650端口

    Selenium 发送http请求给webdriver,启动浏览器(有些网站反爬策略,会监控是否是webdriver驱动的浏览器

    当打开一个网页是调用get方法,其实是给webdriver发送对应的http请求

    五、反爬检测

    1、 检测浏览器指纹

    检测网站 https://bot.sannysoft.com/,左边是selenium启动的chromium,右边是手动启动。

    2、 浏览器启动参数

    查看命令 wmic process where caption=“chrome.exe” get caption,commandline /value
    Selenium通过webdriver启动浏览器参数

    手动启动浏览器参数

    3、检测浏览器驱动

    如果使用webdriver启动的浏览器,会被检测window.navigator.webdriver

    4、 检测webdriver特征

    Webdriver源码:

    检测结果淘宝滑动验证失败:

    通过js可以看出对webdriver的特征检测等

    六、优化方案

    1、 给webdriver添加日志选项,方便出问题时定位分析。

    2、 使用undetected_chromedriver隐藏特殊标识
    1)、打开浏览器的时,注入js修改webdriver属性值。


    3、 修改webdriver二进制文件中的特征值

    4、 先启动浏览器,然后再使用webdriver连接控制。

    七、扩展(Chrome DevTools Protocol)

    谷歌浏览器开发协议,Chrome DevTools 就是一个 Web 服务工具,它通过使用 Chrome DevTools Protocol 与后端进行交互。浏览器启动时加上参数 --remote-debugging-port={port}就可以通过发送http和websocket请求直接控制浏览器。
    启动浏览器chrome.exe --remote-debugging-port=9255
    发送请求查看浏览器信息,包含websocket连接url。


    新建浏览器标签页,其中页包含了新标签页的websocket连接url。

    Cdp开源信息 https://github.com/ChromeDevTools/awesome-chrome-devtools 支持的语言和第三方库。

    Python的第三方库

    1. Pychrome调用简单,但是版本较老,很久没有维护,(网捕手也集成这个库)
    2. Pyppeteer是用python改写官方提供的js代码,支持异步,使用广泛容易被反爬策略识别。
  • 相关阅读:
    C++指针(五)完结篇
    数据结构与算法———力扣977——双指针——python
    云上攻防-云原生篇&K8s安全&Config泄漏&Etcd存储&Dashboard鉴权&Proxy暴露
    HDMI之HDCP 2.3
    Stream流
    Tomcat中间件版本信息泄露
    自主设计,模拟实现 RabbitMQ - 多虚拟主机管理
    API 接口应该如何设计?如何保证安全?如何签名?如何防重?
    关于LPC1768在线升级的实现的注意事项
    如何在webapp中于动发布一个应用
  • 原文地址:https://blog.csdn.net/u010442378/article/details/134074498