用undetected_chromedriver代替selenium解决浏览器打不开网页

关于Python爬虫代码打开网页的方法,教科书以及前辈们都推荐requests和selenium两种途径来打开网页。

但现在越来越多网站建立反爬虫机制,比如我最近爬的一个机构网站,首页需要登录,前辈们的旧方法越来越不管用了:

方案1:requests的get和post:需要录入headers,以及post所需的表单数据。但我败在了获取post的表单数据这一步,试了很长时间都无法登录。

结果:requests方案失败。

方案2:selenium的webdriver:打开Chrome浏览器来模拟人工登录,往headers添加user-agent的代码如下:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
options = webdriver.ChromeOptions()
driver = webdriver.Chrome(options=options)
driver.execute_cdp_cmd("Network.setExtraHTTPHeaders",
                       {"headers":
                        {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36",
                        }
                       })
url='http://这里改为你要打开的网址'
driver.get(url)

浏览器显示:Chrome正受到自动测试软件的控制。某些网站已经检测到是selenium在模拟浏览器,尽管我怎么设置headers也无济于事,浏览器打开的页面不是空白,就是返回400或502等错误代码。

结果:selenium的webdriver方案失败。

方案3:浏览器按F12,打开console,输入命令:window.navigator.webdriver,如果返回True则说明网站会检测selenium的webdriver。前辈们的方法是在driver.get命令之前增加下面的代码,使得window.navigator.webdriver返回undefined:

# 去除“Chrome正受到自动测试软件的控制”的显示
options.add_experimental_option("excludeSwitches", ["enable-automation"])

# 防止网站检测selenium的webdriver
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
        "source": """
            Object.defineProperty(navigator, 'webdriver', {
                get: () => undefined
            })
        """})

结果:插入undefined代码,浏览器页面依旧显示空白,失败。

方案4:改用Firefox浏览器,不用添加方案3的代码。

前辈们推荐过该方案,可能对某些网站有效,但在我要爬的机构网站还是失败。代码我就不贴了。

方案5:改用undetected_chromedriver代替selenium。

这是最简单而且行之有效的方案,需要先安装它,在cmd里输入:pip install undetected_chromedriver

不需要设置headers等复杂的代码,只需要三行就轻松搞掂了:

import undetected_chromedriver.v2 as uc
driver = uc.Chrome()
driver.get('这里改为网址')

结果:undetected_chromedriver成功!

方案6:改善方案3:

前辈们教的方案3是设定undefined以防止网站检测。今天我突发奇想:正常情况下人工打开网站再按F12进入console,输入window.navigator.webdriver返回的是False,为什么前辈们要设定这个值为undefined呢?我设定为False可以吗?于是把那段代码的get: () => undefined改为get: () => False看看:

from selenium import webdriver

options = webdriver.ChromeOptions()
# 去除“Chrome正受到自动测试软件的控制”的显示
options.add_experimental_option("excludeSwitches", ["enable-automation"])
driver = webdriver.Chrome(options=options)
# 设置headers
driver.execute_cdp_cmd("Network.setExtraHTTPHeaders",
                       {"headers":
                        {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36",
                        }
                       })


# 防止网站检测selenium的webdriver
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
        "source": """
            Object.defineProperty(navigator, 'webdriver', {
                get: () => False
            })
        """})

url='http://这里改为你要打开的网址'
driver.get(url)

结果:成功!

用undetected_chromedriver代替selenium解决浏览器打不开网页_第1张图片

你可能感兴趣的:(Python,selenium,python,爬虫)