用undetected_chromedriver代替selenium解决浏览器打不开网页
当selenium模拟浏览器打开网页出现空白页时,请试试用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)
结果:成功!
更多推荐
所有评论(0)