无头 Chrome 驱动程序不适用于 Selenium

Posted

技术标签:

【中文标题】无头 Chrome 驱动程序不适用于 Selenium【英文标题】:Headless Chrome Driver not working for Selenium 【发布时间】:2021-04-11 14:31:28 【问题描述】:

当我设置options.add_argument("--headless") 时,我的刮刀出现问题。但是,当它被删除时,它工作得很好。谁能建议我如何使用无头模式获得相同的结果?

下面是我的python代码:

from seleniumwire import webdriver as wireDriver
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.chrome.options import Options
    
chromedriverPath = '/Users/applepie/Desktop/chromedrivermac'

    def scraper(search):

    mit = "https://orbit-kb.mit.edu/hc/en-us/search?utf8=✓&query="  # Empty search on mit site
    mit += "+".join(search) + "&commit=Search"
    results = []

    options = Options()
    options.add_argument("--headless")
    options.add_argument("--window-size=1440, 900")
    driver = webdriver.Chrome(options=options, executable_path= chromedriverPath)

    driver.get(mit)
    # Wait 20 seconds for page to load
    timeout = 20
    try:
        WebDriverWait(driver, timeout).until(EC.visibility_of_element_located((By.CLASS_NAME, "header")))
        search_results = driver.find_element_by_class_name("search-results")
        for result in search_results.find_elements_by_class_name("search-result"):
            resultObject = 
                "url": result.find_element_by_class_name('search-result-link').get_attribute("href")
            
            results.append(resultObject)
        driver.quit()
    except TimeoutException:
        print("Timed out waiting for page to load")
        driver.quit()

    return results

这里也是我print(driver.page_source)get()之后的截图:

【问题讨论】:

你能解释一下到底是什么问题吗? @PApostol,当我添加options.add_argument("--headless") 时,刮板没有返回任何结果。但是,当 options.add_argument("--headless") 被删除时,它可以正常工作 也许可以尝试使用options.headless = True 而不是options.add_argument("--headless") 看看是否有区别。还可以考虑包括一个人们可以运行以重现该问题的示例。 @PApostol options.headless = True 也不起作用。 @ApplePie 截图或打印get()后面的driver.page_source,确认get()是否成功。 【参考方案1】:

这个截图...

...暗示Cloudflare 已将您对网站的请求检测为自动机器人,随后拒绝您访问该应用程序。


解决方案

在这些情况下,一个潜在的解决方案是在headless 模式下使用undetected-chromedriver 来初始化google-chrome-headless 浏览上下文。

undetected-chromedriver 是一个优化的 Selenium Chromedriver 补丁,它不会触发像 Distill Network / Imperva / DataDome / Botprotect.io 这样的反僵尸服务。它会自动下载驱动程序二进制文件并对其进行修补。

代码块:

import undetected_chromedriver as uc
from selenium import webdriver

options = webdriver.ChromeOptions() 
options.headless = True
driver = uc.Chrome(options=options)
driver.get(url)

参考文献

您可以在以下位置找到一些相关的详细讨论:

Selenium app redirect to Cloudflare page when hosted on Heroku How to bypass being rate limited ..html Error 1015 using Python

【讨论】:

我收到以下错误:ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1122) @ApplePie SSLCertVerificationError 是一个证书问题,与通过headless 模式访问应用程序的一般问题相比,这是一个更细化的问题。你能根据你的新要求提出一个新问题吗? *** 贡献者将很乐意为您提供帮助。

以上是关于无头 Chrome 驱动程序不适用于 Selenium的主要内容,如果未能解决你的问题,请参考以下文章

复制粘贴不适用于 python selenium 中的无头浏览器

Chrome ios - iframe:window.open 不适用于 onload 处理程序

无头Chrome驱动的分布式爬虫

Selenium 2.53 不适用于 Firefox 28

正则表达式验证不适用于 Google Chrome Android 应用程序,但适用于 Chrome 浏览器 - PC

Charles SSL Proxy 适用于 chrome 但不适用于应用程序