• selenium webdriver 防爬问题 C#


    一、常见的方法是使用如下配置解决window.navigator.webdriver属性值问题,确实有用,有些网站正常可以打开,selenium中打不开,或者返回错误,可以试下

                   

     options.AddArgument("--disable-blink-features=AutomationControlled");

    再进阶点,利用浏览器端开发霸权强制写入一段js,修改变量值window.navigator.webdriver

    1.   driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
    2.         "source": """
    3.                     Object.defineProperty(navigator, 'webdriver', {
    4.                       get: () => undefined
    5.                     })
    6.                   """
    7.     })

    二、我遇到的问题比较奇葩,第一次可以打开,一旦使用driver.findxxx(),或者driver.getxx()之后就会触发反爬策略,症状就是之后任何请求都会报错,具体原因没搞清楚。但是,f12执行js是不会导致以上情况。基于f12无问题的原则,翻了chrome dev tools的开发文档:

    Chrome DevTools Protocol - Runtime domain

    发现有一个可以执行js的接口,而且还可以有接收返回值,奈何资料实在太少,好不容易跑通,执行了个alert没有触发,代码如下

    (  C#代码,注意引用最新版webdriver,nuget搜selenium前两个)               

    1.  string path = AppDomain.CurrentDomain.BaseDirectory + "/test.js";
    2.                 string str2 = File.ReadAllText(path);
    3.                 //没找到怎么传参, 用这个low方法把
    4.                 str2 = str2.Replace("_name_", name);
    5.                 //log("注入的js代码:" + str2);
    6.                 p.Add("expression", str2);
    7.                 //调用Runtime.evaluate,传入p执行
    8.                 driver.ExecuteCdpCommand("Runtime.evaluate", p);

    (js代码)

                 

      alert(1);

    三、继续尝试如何接收返回值,毕竟要爬东西。

            (C#)             

    1.    string path = AppDomain.CurrentDomain.BaseDirectory + "/test2.js";
    2.                 string str2 = File.ReadAllText(path);
    3.                 p.Add("expression", str2);//代码
    4.                 p.Add("returnByValue", true);//接收返回值【注意,js中return必须是json格式,不然收不到!!!】
    5.                 p.Add("awaitPromise", true);//是否异步
    6.                 //执行,并接收返回值
    7.                 Dictionary<string, Object> r =(Dictionary<string,Object>)driver.ExecuteCdpCommand("Runtime.evaluate", p);

            (js:匿名函数,直接执行,【同步返回】)               

    1. function(){
    2.                             return {a:1}
    3.                    })();

            (js:匿名函数,异步返回)               

    1. async function(){
    2.                         return new Promise((resolve, reject) => {
    3.                                 resolve({a:1});
    4.                           });
    5.                    })();

    over,能写js,随时随地执行,能传参,能接返回值,还能异步,还有什么做不了的呢?

  • 相关阅读:
    VB.NET 中使用SqlConnection类连接到Microsoft SQL Server数据库的详细步骤
    Ant-design 组件库使用
    【获取最大软件版本号】python实现-附ChatGPT解析
    [RK3568 Android11] Input UI 使用流程
    拦截浏览器从服务器后台加载的js 文件 替换为本地js文件 方便调试线上前端bug
    【Syslog】采用Syslog4j发送总线日志
    DHCP原理和配置
    关于对四维空间一些理解
    MAX25————用vray还原模型在Substance Painter的光照以及材质效果
    给出一组正整数arr,你从第0个数向最后一个数,每个数的值表示你从这个位置可以向右跳跃的最大长度,计算如何以最少的跳跃次数跳到最后一个数。
  • 原文地址:https://blog.csdn.net/wenshanshan0824/article/details/126130976