软件系统开发定制用undetected_chromedriver代替selenium解决浏览器打不开网页

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

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

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

结果:requests方案失败。

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

  1. from selenium import webdriver
  2. from selenium.webdriver.chrome.options import Options
  3. options = webdriver.ChromeOptions()
  4. driver = webdriver.Chrome(options=options)
  5. driver.execute_cdp_cmd("Network.setExtraHTTPHeaders",
  6. {"headers":
  7. {"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",
  8. }
  9. })
  10. url='http://这里改为你要打开的网址'
  11. 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:

  1. # 去除“Chrome正受到自动测试软件的控制”的显示
  2. options.add_experimental_option("excludeSwitches", ["enable-automation"])
  3. # 防止网站检测selenium的webdriver
  4. driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
  5. "source": """
  6. Object.defineProperty(navigator, 'webdriver', {
  7. get: () => undefined
  8. })
  9. """})

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

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

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

方案5:改用undetected_chromedriver代替selenium。

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

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

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

结果:undetected_chromedriver成功!

方案6:改善方案3:

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

  1. from selenium import webdriver
  2. options = webdriver.ChromeOptions()
  3. # 去除“Chrome正受到自动测试软件的控制”的显示
  4. options.add_experimental_option("excludeSwitches", ["enable-automation"])
  5. driver = webdriver.Chrome(options=options)
  6. # 设置headers
  7. driver.execute_cdp_cmd("Network.setExtraHTTPHeaders",
  8. {"headers":
  9. {"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",
  10. }
  11. })
  12. # 防止网站检测selenium的webdriver
  13. driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
  14. "source": """
  15. Object.defineProperty(navigator, 'webdriver', {
  16. get: () => False
  17. })
  18. """})
  19. url='http://这里改为你要打开的网址'
  20. driver.get(url)

结果:成功!

网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发