无头 Chrome 驱动在 Selenium 中无法正常工作

4

我目前在使用爬虫时,当我设置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

这是我使用get()方法后,调用print(driver.page_source)的屏幕截图: enter image description here

你能解释一下实际上是什么问题吗? - PApostol
@PApostol,当我添加options.add_argument(“--headless”)时,爬虫程序没有返回任何结果。但是,当删除options.add_argument(“--headless”)时,它可以正常工作。 - ApplePie
也许尝试使用 options.headless = True 而不是 options.add_argument("--headless") 看看是否有区别。另外考虑包含一个可运行的示例以重现问题。 - PApostol
@PApostol options.headless = True 也不起作用。 - ApplePie
@ApplePie 在 get() 后截屏或打印 driver.page_source 来确认 get() 是否成功。 - undetected Selenium
@DebanjanB,我已经在上面添加了一张截图。 - ApplePie
2个回答

4

这个截图...

screenshot

这意味着Cloudflare检测到您的请求来自自动化机器人,并因此拒绝了您访问该应用程序的权限。

解决方案

在这些情况下,可能的解决方案是使用未检测到的Chromedriver无头模式初始化浏览上下文。

未检测到的Chromedriver是一个经过优化的Selenium Chromedriver补丁,不会触发反机器人服务,如Distill Network / Imperva / DataDome / Botprotect.io。它会自动下载驱动程序二进制文件并进行修补。

  • Code Block:

    import undetected_chromedriver as uc
    from selenium import webdriver
    
    options = webdriver.ChromeOptions() 
    options.headless = True
    driver = uc.Chrome(options=options)
    driver.get(url)
    

参考资料

以下是几篇相关的详细讨论:


我遇到了以下错误:ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1122) - ApplePie
@ApplePie SSLCertVerificationError 是一个证书问题,与通过“无头”模式访问应用程序的一般性问题相比,它更为细致。您可以根据新需求提出一个新问题吗?Stackoverflow 的贡献者们将很乐意帮助您解决问题。 - undetected Selenium

3

我知道这是一个非常老的问题,但最近(2023年)他们升级了无头Chrome,现在允许无头与扩展程序一起使用。

请参阅网页以获取更多详细信息。

只需将上面的无头选项替换为下面的选项即可。

options.add_argument('--headless=new')

根据该网站,如果您只使用--headless,它仍然使用旧版本,您必须明确指向新版本才能正常工作。


救了我的命,谢谢你。 - Tejas Krishna Reddy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接