无头 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 处理程序