0


Python Selenium绕过Cloudflare抓取网页

Cloudflare和很多其他网站一样会检测访问是否为Selenium bot,其中一项为检测Selenium运行时出现的特有js变量。

这里主要包括了是否含有"selenium"/ "webdriver"的变量或者含有"$cdc_"/"$wdc_"的文件变量。

每个driver的检测机制会不一样,此处给出的方案基于chromedriver。

1. Undetected-chromedriver

非常简单好用的包,直接pip安装,如下初始化driver即可,之后就像正常Selenium使用即可。

import undetected_chromedriver as uc
driver = uc.Chrome()
driver.get('https://nowsecure.nl')

2. 直接修改chromedriver executable

将key变量修改成任意不含"cdc"的字符。

/**
 * Returns the global object cache for the page.
 * @param {Document=} opt_doc The document whose cache to retrieve. Defaults to
 *     the current document.
 * @return {!Cache} The page's object cache.
 */
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_';
  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];
  }
}

这两种本质上没有太大的区别,undetected-chromedriver本质上是给chromedriver启动时打上了一个补丁,完成了修改key的那一步

def patch_exe(self):
    """
    Patches the ChromeDriver binary
    :return: False on failure, binary name on success
    """
    logger.info("patching driver executable %s" % self.executable_path)

    linect = 0
    replacement = self.gen_random_cdc() #此处修改了cdc的名称
    with io.open(self.executable_path, "r+b") as fh:
        for line in iter(lambda: fh.readline(), b""):
            if b"cdc_" in line:
                fh.seek(-len(line), 1)
                newline = re.sub(b"cdc_.{22}", replacement, line)
                fh.write(newline)
                linect += 1
        return linect

*具体可参考这篇stackoverflow文章

标签: 大数据

本文转载自: https://blog.csdn.net/kzhulu/article/details/125837517
版权归原作者 kzhulu 所有, 如有侵权,请联系我们删除。

“Python Selenium绕过Cloudflare抓取网页”的评论:

还没有评论