Python Selenium Chrome驱动程序无法使用--headless选项

at0kjp5o  于 2023-01-24  发布在  Python
关注(0)|答案(6)|浏览(227)

我正在运行chromedriver试图从一个网站上抓取一些数据。没有headless选项时一切都很好。然而,当我添加选项时,webdriver需要很长时间来加载url,当我试图找到一个元素(在没有--headless的情况下运行时会找到)时,我收到一个错误。
使用print语句并在url "loaded"后获取html,我发现没有html,它是空的(见下面的输出)。

class Fidelity:
    def __init__(self):
        self.url = 'https://eresearch.fidelity.com/eresearch/gotoBL/fidelityTopOrders.jhtml'
        self.options = Options()
        self.options.add_argument("--headless")
        self.options.add_argument("--window-size=1500,1000")
        self.driver = webdriver.Chrome(executable_path='.\\dependencies\\chromedriver.exe', options = self.options)
        print("init")

    def initiate_browser(self):
        self.driver.get(self.url)
        time.sleep(5)
        script = self.driver.execute_script("return document.documentElement.outerHTML")
        print(script)
        print("got url")

    def find_orders(self):
        wait = WebDriverWait(self.driver, 15)
        data= wait.until(ec.visibility_of_element_located((By.CSS_SELECTOR, '[id*="t_trigger_TSLA"]'))) #ERROR ON THIS LINE

以下是整个输出:

init
<html><head></head><body></body></html>
url
Traceback (most recent call last):
  File "C:\Users\Zachary\Documents\Python\Tesla Stock Info\Scraper.py", line 102, in <module>
    orders = scrape.find_tesla_orders()
  File "C:\Users\Zachary\Documents\Python\Tesla Stock Info\Scraper.py", line 75, in find_tesla_orders
    tesla = self.driver.find_element_by_xpath("//a[@href='https://qr.fidelity.com/embeddedquotes/redirect/research?symbol=TSLA']")
  File "C:\Program Files (x86)\Python37-32\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 394, in find_element_by_xpath
    return self.find_element(by=By.XPATH, value=xpath)
  File "C:\Program Files (x86)\Python37-32\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 978, in find_element
    'value': value})['value']
  File "C:\Program Files (x86)\Python37-32\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "C:\Program Files (x86)\Python37-32\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"//a[@href='https://qr.fidelity.com/embeddedquotes/redirect/research?symbol=TSLA']"}
  (Session info: headless chrome=74.0.3729.169)
  (Driver info: chromedriver=74.0.3729.6 (255758eccf3d244491b8a1317aa76e1ce10d57e9-refs/branch-heads/3729@{#29}),platform=Windows NT 10.0.17763 x86_64)

更新代码的新错误:

init
<html><head></head><body></body></html>
url
Traceback (most recent call last):
  File "C:\Users\Zachary\Documents\Python\Tesla Stock Info\Scraper.py", line 104, in <module>
    orders = scrape.find_tesla_orders()
  File "C:\Users\Zachary\Documents\Python\Tesla Stock Info\Scraper.py", line 76, in find_tesla_orders
    tesla = wait.until(ec.visibility_of_element_located((By.CSS_SELECTOR, '[id*="t_trigger_TSLA"]')))
  File "C:\Program Files (x86)\Python37-32\lib\site-packages\selenium\webdriver\support\wait.py", line 80, in until
    raise TimeoutException(message, screen, stacktrace)
selenium.common.exceptions.TimeoutException: Message:

我试过通过谷歌找到这个问题的答案,但没有一个建议起作用。还有人对某些网站有这个问题吗?任何帮助都很感激。

更新

不幸的是,这个脚本仍然不起作用,webdriver在headless时由于某种原因没有正确加载页面,即使在没有使用headless选项运行这个脚本的情况下一切都能正常工作。

h79rfbju

h79rfbju1#

对于那些想知道如何解决这个问题的人来说,有些网站在chrome的无头选项下无法正确加载,我不认为有什么方法可以解决这个问题,只要使用不同的浏览器(比如firefox)就行了,感谢user8426627。

kulphzqa

kulphzqa2#

你试过使用用户代理吗?
我也遇到了同样的错误。首先我所做的是下载HTML源页面的无头和正常与:

html = driver.page_source
file = open("foo.html","w")
file.write(html)
file.close()

headless模式的HTML源代码是一个很短的文件,几乎在最后有这一行:The page cannot be displayed. Please contact the administrator for additional information.但正常模式是预期的HTML。
我通过添加一个User-Agent解决了这个问题:

from fake_useragent import UserAgent
user_agent = 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.2 (KHTML, like Gecko) Chrome/22.0.1216.0 Safari/537.2'
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument(f'user-agent={user_agent}')
driver = webdriver.Chrome(executable_path = f"your_path",chrome_options=chrome_options)
iyfamqjs

iyfamqjs3#

尝试设置窗口大小以及无头。添加此:

chromeOptions.add_argument("--window-size=1920,1080")

headless浏览器的默认大小很小。如果代码在headless未启用时工作,可能是因为你的对象在窗口之外。

carvr3hs

carvr3hs4#

添加显式等待。您还应该使用另一个定位器,当前的定位器匹配3个元素。该元素具有唯一的id属性

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ec
from selenium.webdriver.common.by import By

wait = WebDriverWait(self.driver, timeout)
data = wait.until(ec.visibility_of_element_located((By.CSS_SELECTOR, '[id*="t_trigger_TSLA"]')))
vu8f3i0k

vu8f3i0k5#

一些网站只是不能正确加载与无头选项的 chrome .
之前的说法其实是错误的。我刚刚遇到这个问题,Chrome没有检测到元素。当我看到@LuckyZakary的答案时,我感到震惊,因为有人用nodeJs创建了同一个网站的剪贴板,但没有得到这个错误。
@AtulGumar answer在Windows上有帮助,但在Ubuntu服务器上失败了。所以这还不够。在阅读了this之后,@AtulGumar遗漏了添加–disable-gpu标志。
因此,它为我工作的Windows和Ubuntu服务器没有图形用户界面与这些选项:

webOptions = webdriver.ChromeOptions()
webOptions.headless = True
webOptions.add_argument("--window-size=1920,1080")
webOptions.add_argument("–disable-gpu")
driver = webdriver.Chrome(options=webOptions)

我还按照建议安装了xvfb和其他软件包here

sudo apt-get -y install xorg xvfb gtk2-engines-pixbuf
sudo apt-get -y install dbus-x11 xfonts-base xfonts-100dpi xfonts-75dpi xfonts-cyrillic xfonts-scalable

并执行:

Xvfb -ac :99 -screen 0 1280x1024x16 &
export DISPLAY=:99
xpcnnkqh

xpcnnkqh6#

strong text尝试将可执行路径添加到服务对象中

options =  Options()
options.add_argument('---incognito')
options.add_argument('---disable-extension')
options.add_argument("--no-sandbox")
options.add_argument('-–disable-gpu')
options.add_argument('--headless')
service = Service (executable_path=ChromeDriverManager().install() )
return webdriver.Chrome(service=service  , options=options)

它对我的工作:)

相关问题