700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 用undetected_chromedriver代替selenium解决浏览器打不开网页

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

时间:2018-11-10 09:28:14

相关推荐

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

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

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

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

结果:requests方案失败。

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

from selenium import webdriverfrom selenium.webdriver.chrome.options import Optionsoptions = 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的webdriverdriver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {"source": """Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"""})

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

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

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

方案5:改用undetected_chromedriver代替selenium。

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

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

import undetected_chromedriver.v2 as ucdriver = 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 webdriveroptions = webdriver.ChromeOptions()# 去除“Chrome正受到自动测试软件的控制”的显示options.add_experimental_option("excludeSwitches", ["enable-automation"])driver = webdriver.Chrome(options=options)# 设置headersdriver.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的webdriverdriver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {"source": """Object.defineProperty(navigator, 'webdriver', {get: () => False})"""})url='http://这里改为你要打开的网址'driver.get(url)

结果:成功!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。