puppeteer無頭模式下反反爬配置集合


思路來源於此篇文章,歸納的非常全面,但在具體繞過方案上有些部分講的並不夠明晰,本文着重講具體如何配置。

因為puppeteer的page.evaluateOnNewDocument在selenium中並無對應功能,所以selenium無法使用相同方案。

const browser = await puppeteer.launch({ignoreDefaultArgs: ["--enable-automation"], headless: true}); //去除自動化測試的提醒
  const page = await browser.newPage();
  await page.evaluateOnNewDocument(() => { //在每個新頁面打開前執行以下腳本
    const newProto = navigator.__proto__;
    delete newProto.webdriver;  //刪除navigator.webdriver字段
    navigator.__proto__ = newProto;
    window.chrome = {};  //添加window.chrome字段,為增加真實性還需向內部填充一些值
    window.chrome.app = {"InstallState":"hehe", "RunningState":"haha", "getDetails":"xixi", "getIsInstalled":"ohno"};
    window.chrome.csi = function(){};
    window.chrome.loadTimes = function(){};
    window.chrome.runtime = function(){};
    Object.defineProperty(navigator, 'userAgent', {  //userAgent在無頭模式下有headless字樣,所以需覆寫
        get: () => "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.113 Safari/537.36",
    });
    Object.defineProperty(navigator, 'plugins', {  //偽裝真實的插件信息
        get: () => [{"description": "Portable Document Format",
                    "filename": "internal-pdf-viewer",
                    "length": 1,
                    "name": "Chrome PDF Plugin"}]
    });
    Object.defineProperty(navigator, 'languages', { //添加語言
        get: () => ["zh-CN", "zh", "en"],
    });
    const originalQuery = window.navigator.permissions.query; //notification偽裝
    window.navigator.permissions.query = (parameters) => (
    parameters.name === 'notifications' ?
      Promise.resolve({ state: Notification.permission }) :
      originalQuery(parameters)
  );
  
  await page.goto("https://www.aabbccc.com");
  //...
  await browser.close();

該配置足以應付絕大部分針對無頭瀏覽器的檢測。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM