|-转 用undetected_chromedriver代替selenium解决浏览器打不开网页
整理的很完整,good,要是早看到能节省我十几个小时不止,只不过我几乎是也走了一遍试了各种办法都是失败,最后在网上搜到了用undetected_chromedriver,解决了后在考虑有时候undetected_chromedriver启动浏览器会失败的情况,搜的时候搜到了这篇文章 2024年3月10日 23:17
用undetected_chromedriver代替selenium解决浏览器打不开网页-CSDN博客
关于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的代码。
前辈们推荐过该方案,可能对某些网站有效,但在我要爬的机构网站还是失败。代码我就不贴了。 ...