【问题标题】:Some websites dont fully load/render in selenium headless mode一些网站没有在 selenium 无头模式下完全加载/渲染
【发布时间】:2021-03-13 11:29:52
【问题描述】:

所以我有一个问题,当我无头运行 selenium 时,我一直注意到它,其中某些页面没有完全加载/渲染某些元素。我不完全知道不加载 100% 会发生什么;也许JS 没有运行?

我的代码:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from decouple import config
from time import sleep

DEBUG = config('DEBUG')

class DiscordME(object):
    def __init__(self):
        self.LINUX = config('LINUX', cast=bool)
        self.DRIVER_VERSION = config('DRIVER_VERSION')
        self.HEADLESS = True

        options = Options()
        options.add_argument('--no-sandbox')
        options.add_argument('--disable-gpu')
        options.add_argument('--ignore-certificate-errors')
        options.add_argument('--disable-extensions')
        options.add_argument('--disable-dev-shm-usage')
        if self.HEADLESS:
            options.add_argument('--headless')
            options.add_argument('--window-size=1920,1200')

        if self.LINUX:
            self.browser = webdriver.Chrome(executable_path=f'./drivers/chromedriver-{self.DRIVER_VERSION}', options=options)
        else:
            self.browser = webdriver.Chrome(executable_path=f'.\drivers\chromedriver-{self.DRIVER_VERSION}.exe', options=options)

    def get_website(self):
        self.browser.get('https://discord.me/login')
        WebDriverWait(self.browser, 10).until(
            EC.url_changes('https://discord.me/login')
        )
        print(self.browser.current_url)
        print(self.browser.page_source)
        #print(self.browser.find_element_by_xpath('//*[@id="app-mount"]/div[2]/div/div[2]/div/div/form/div/div/div[1]/div[3]/div[1]/div/div[2]/input'))

DiscordME().get_website()

在此脚本中,它在访问 discord API 登录页面时不会加载登录输入。 正如我在page_source 中看到的那样,我注意到该页面没有被挂载,所以这可能是问题所在。

【问题讨论】:

    标签: python python-3.x selenium


    【解决方案1】:
    from selenium import webdriver
    from time import sleep
    
    options = webdriver.ChromeOptions()
    options.add_argument("--window-size=1920,1080")
    options.add_argument("--headless")
    options.add_argument("--disable-gpu")
    options.add_argument(
        "user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36")
    browser = webdriver.Chrome(options=options)
    

    一些网站使用用户代理来检测浏览器是否处于无头模式,因为无头浏览器使用与普通浏览器不同的用户代理。所以明确设置用户代理。

    Headless browser detection

    【讨论】:

    • 复制和粘贴你的 user-agent 参数在 Ubuntu linux 中对我有用,即使我使用的 chrome 驱动程序版本是 92.0.4515.107
    【解决方案2】:

    我只是想分享我在这方面的经验,因为解决这个问题花费了我很多时间尝试 Chrome 网络驱动程序的许多选项和设置。

    user-agent 设置解决了我抓取的一些网站的问题。但是,对于其他一些网站,唯一与我合作的解决方案是使用 FireFox webdriver 而不是 Chrome,如下所示:

    from selenium import webdriver
    from selenium.webdriver.firefox.options import Options
    
    fireFoxOptions = Options()  
    fireFoxOptions.add_argument("--headless") 
    fireFoxOptions.add_argument("--window-size=1920,1080")
    fireFoxOptions.add_argument('--start-maximized')
    fireFoxOptions.add_argument('--disable-gpu')
    fireFoxOptions.add_argument('--no-sandbox')
    
    driver = webdriver.Firefox(options=fireFoxOptions, 
    executable_path=r'C:\[your path to firefox webdriver exe file]\geckodriver.exe')
    
    driver.get('https://discord.me/login')
    

    使用链接here 下载最新的 FireFox geckodriver,并确保您的机器上已经安装了 FireFox 浏览器。

    【讨论】:

    • 我正在运行chrome driver v 92.0.4515.107,但我无法使用--headless 渲染一些网站,所以我必须安装Firefox 并将其用作备份驱动程序。到目前为止,Chrome + Firefox 已经适用于 100% 的用例。
    【解决方案3】:

    如果您在使用 selenium 加载网站时遇到问题,需要考虑的另一件事是处理能力。

    我使用的是带有单个 CPU 的 Micro AWS instance,它适用于许多网站,但是当我遇到更复杂的一个时,它在进行像 find_elements_by_xpath('//a[@href]') 这样的搜索时不断得到 0 elements。我将实例升级为具有更多 CPU(4 个,但 2 个可能就足够了)的实例,这使我能够完全加载站点并抓取元素。

    我肯定会先尝试此处发布的其他两种解决方案(chrome 选项或 firefox 浏览器),但处理能力也可能是问题所在。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-27
      • 2014-07-06
      • 2012-12-29
      • 1970-01-01
      • 2014-10-25
      • 2013-05-31
      • 1970-01-01
      相关资源
      最近更新 更多