草庐IT

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

Scott0902 2023-04-04 原文

关于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. ruby - 在 Ruby 中用键盘诅咒数组浏览 - 2

    我正在尝试在Ruby中制作一个cli应用程序,它接受一个给定的数组,然后将其显示为一个列表,我可以使用箭头键浏览它。我觉得我已经在Ruby中看到一个库已经这样做了,但我记不起它的名字了。我正在尝试对soundcloud2000中的代码进行逆向工程做类似的事情,但他的代码与SoundcloudAPI的使用紧密耦合。我知道cursesgem,我正在考虑更抽象的东西。广告有没有人见过可以做到这一点的库或一些概念证明的Ruby代码可以做到这一点? 最佳答案 我不知道这是否是您正在寻找的,但也许您可以使用我的想法。由于我没有关于您要完成的工作

  2. ruby-on-rails - 浏览 Ruby 源代码 - 2

    我的主要目标是能够完全理解我正在使用的库/gem。我尝试在Github上从头到尾阅读源代码,但这真的很难。我认为更有趣、更温和的踏脚石就是在使用时阅读每个库/gem方法的源代码。例如,我想知道RubyonRails中的redirect_to方法是如何工作的:如何查找redirect_to方法的源代码?我知道在pry中我可以执行类似show-methodmethod的操作,但我如何才能对Rails框架中的方法执行此操作?您对我如何更好地理解Gem及其API有什么建议吗?仅仅阅读源代码似乎真的很难,尤其是对于框架。谢谢! 最佳答案 Ru

  3. 「Python|Selenium|场景案例」如何定位iframe中的元素? - 2

    本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决

  4. ruby - 如何使用 Selenium Webdriver 根据 div 的内容执行操作? - 2

    我有一个使用SeleniumWebdriver和Nokogiri的Ruby应用程序。我想选择一个类,然后对于那个类对应的每个div,我想根据div的内容执行一个Action。例如,我正在解析以下页面:https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=puppies这是一个搜索结果页面,我正在寻找描述中包含“Adoption”一词的第一个结果。因此机器人应该寻找带有className:"result"的div,对于每个检查它的.descriptiondiv是否包含单词“adoption

  5. ruby - 下载位置 Selenium-webdriver Cucumber Chrome - 2

    我将Cucumber与Ruby结合使用。通过Selenium-Webdriver在Chrome中运行测试时,我想将下载位置更改为测试文件夹而不是用户下载文件夹。我当前的chrome驱动程序是这样设置的:Capybara.default_driver=:seleniumCapybara.register_driver:seleniumdo|app|Capybara::Selenium::Driver.new(app,:browser=>:chrome,desired_capabilities:{'chromeOptions'=>{'args'=>%w{window-size=1920,1

  6. ruby - 强制浏览器下载文件而不是打开文件 - 2

    我要下载http://foobar.com/song.mp3作为song.mp3,而不是让Chrome在其native中打开它浏览器中的播放器。我怎样才能做到这一点? 最佳答案 您只需要确保发送这些header:Content-Disposition:attachment;filename=song.mp3;Content-Type:application/octet-streamContent-Transfer-Encoding:binarysend_file方法为您完成:get'/:file'do|file|file=File.

  7. ruby - 404 未找到,但可以从网络浏览器正常访问 - 2

    我在这方面尝试了很多URL,在我遇到这个特定的之前,它们似乎都很好:require'rubygems'require'nokogiri'require'open-uri'doc=Nokogiri::HTML(open("http://www.moxyst.com/fashion/men-clothing/underwear.html"))putsdoc这是结果:/Users/macbookair/.rvm/rubies/ruby-2.0.0-p481/lib/ruby/2.0.0/open-uri.rb:353:in`open_http':404NotFound(OpenURI::HT

  8. ruby - 如何在 watir 测试套件结束时关闭浏览器? - 2

    使用ruby​​的watir测试网络应用程序时,浏览器最后会保持打开状态。网上的一些建议是,要进行真正的单元测试,您应该在每次测试时(在拆卸调用中)打开和关闭浏览器,但这很慢而且毫无意义。或者他们做这样的事情:defself.suites=superdefs.afterClass#Closebrowserenddefs.run(*args)superafterClassendsend但这会导致摘要输出不再显示(诸如“100次测试、100次断言、0次失败、0次错误”之类的内容仍应显示)。我怎样才能让ruby​​或watir在我的测试结束时关闭浏览器? 最佳答案

  9. ruby - Selenium 的最佳编程语言是什么? - 2

    Asitcurrentlystands,thisquestionisnotagoodfitforourQ&Aformat.Weexpectanswerstobesupportedbyfacts,references,orexpertise,butthisquestionwilllikelysolicitdebate,arguments,polling,orextendeddiscussion.Ifyoufeelthatthisquestioncanbeimprovedandpossiblyreopened,visitthehelpcenter提供指导。9年前关闭。我打算学习Seleni

  10. ruby - 无法在 Mac 上设置 ruby​​-selenium Webdriver - 2

    我一直在工作中使用seleniumIDE。现在我们决定将Seleniumwebdriver与Ruby结合使用。我完全不知道如何设置我的Mac,MacProYosemite10.10.5。在我的终端中,我运行了这些命令:$ruby-e"$(curl-fsSLhttps://raw.githubusercontent.com/Homebrew/install/master/install)"$brewdoctorYoursystemisreadytobrew.$brewinstallruby==>Summary/usr/local/Cellar/openssl/1.0.2d_1:464fi

随机推荐