【问题标题】:Take entire page screenshot with selenium python使用 selenium python 截取整个页面截图
【发布时间】:2021-07-12 18:56:49
【问题描述】:

我正在尝试使用 selenium 和 chromedriver 截取整页截图,但我得到的是这个半截截图。我试过其他方法,但目前只有这一种有效,而且只截取半页截图。

任何人都可以使用其他技巧来解决这个问题,也可以附加输出结果。

import time
from selenium import webdriver
from selenium.webdriver.chrome.options import Options


options = webdriver.ChromeOptions()
options.headless = True
driver = webdriver.Chrome(options=options)

URL = "http://stevens.ekkel.ai"

driver.get(URL)

S = lambda X: driver.execute_script('return document.body.parentNode.scroll'+X)
driver.set_window_size(S('Width'),S('Height')) # May need manual adjustment                                                                                                                
driver.find_element_by_tag_name('body').screenshot('web_screenshot.png')

driver.quit()

【问题讨论】:

    标签: python python-3.x selenium selenium-webdriver selenium-chromedriver


    【解决方案1】:

    我正在使用 PyPI 包:Selenium-Screenshot
    您可以使用命令安装它 - pip install Selenium-Screenshot
    这个包的详细信息可以在这里找到:https://pypi.org/project/Selenium-Screenshot/

    分享一个关于如何使用这个包进行全屏截图的示例补丁:

    from Screenshot import Screenshot_Clipping
            
    #Saving screenshot
    ob=Screenshot_Clipping.Screenshot()
    img=ob.full_Screenshot(driver,save_path=r'D:/OneDrive -Libin/Python/Sel_python/Pytest/Screenshots',image_name="Screenshot1.png")
        
    driver.close()
    driver.quit()
    

    查看截图以供参考:https://i.stack.imgur.com/opgPi.png

    【讨论】:

    • 非常感谢您的帮助,它的工作,但屏幕截图有问题,它一次又一次地向我显示标题。你能解决这个问题吗?这是截图链接Picture Screenshot
    • 嘿@Khasif,这个截图能用吗? i.stack.imgur.com/MwQN9.jpg
    • @LibinThomas 是的,你是怎么得到那个的?代码?
    • @Khasif 我完全从页面中删除了导航元素。由于它是一个粘性导航,我找到了这个替代方案。分享下面的代码补丁作为另一个答案。如果您认为它可以完成工作,则可以将其标记为已接受。 :)
    【解决方案2】:

    卡西夫,

    我不是最好的,但我似乎能够完成它,在一个屏幕截图中,没有标题问题,没有重复标题,所有无头浏览,并且没有任何额外的模块导入。

    我已经通过 pagedowns/滚动来获得完整的屏幕截图。

    可能需要稍微清理一下代码,但它可以按您的意愿工作。

    尝试:

    import time
    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    from selenium.webdriver.common.keys import Keys
    
    
    options = webdriver.ChromeOptions()
    options.headless = True
    driver = webdriver.Chrome(options=options)
    
    URL = "http://stevens.ekkel.ai"
    
    driver.get(URL)
    
    S = lambda X: driver.execute_script('return document.body.parentNode.scroll'+X)
    
    browser = webdriver.Chrome(executable_path=r"C:\Users\User\Documents\chromedriver_win32\chromedriver.exe", options=options)
    elem = browser.find_element_by_tag_name("body")
    
    # make page downs =>10 to catch the whole page
    
    no_of_pagedowns = 15
    
    while no_of_pagedowns:
    
        elem.send_keys(Keys.PAGE_DOWN)
        time.sleep(0.2)
    
        driver.set_window_size(S('Width'), S('Height'))  # May need manual adjustment
        driver.find_element_by_tag_name('body').screenshot('web_screenshot4.png')
        no_of_pagedowns -= 1
    
    driver.quit()
    

    【讨论】:

    • 这是否回答了您的问题,或者其中是否存在我现在似乎无法发现的错误、缺陷和/或限制?我当然想改进代码,所以 # of pagedowns 不是硬编码的,但我觉得如果不是所有网站都适用于大多数网站(如无限滚动)。如果有任何帮助,您可以考虑加分或接受我的回答吗?非常感激。也许改进所以不必滚动,但我认为这很难(尽管必须有办法!驱动程序的设置也许!??)
    • 我确实认为这是网络驱动程序“设置”。 “向下翻页”并不像我们想象的那样向下翻页。它是分数的。如果我们可以调整这些规范(我相信我们可以),我们甚至可能不需要任何滚动并且您的原件就可以工作!事实上,我认为这是一种快速处理它的方法。
    • 你能帮忙解决这个问题吗:stackoverflow.com/questions/67164927/…
    • @Khasif,我会试试!!,我会试一试,但我现在出去了。我会看看它并在我回家时尝试。 (附注:它看起来很大!)
    • 非常感谢,兄弟。是的,它很大,因为我不知道问题出在哪里:) 但希望你可以运行代码并轻松检查它。输出
    【解决方案3】:

    正如评论中提到的,下面的补丁将删除导航功能区并截取整页截图。此外,我进行了一些编辑以将 .png 文件另存为 urlname。

    import pytest
    from Screenshot import Screenshot_Clipping
    from selenium import webdriver
    import time
        
    ###add class and mothods accordingly
    page_url="http://stevens.ekkel.ai/"
    driver.get(page_url)
    time.sleep(5)
    
    js_string = "var element = document.getElementsByClassName(\'w3-row w3-padding w3-black\');element[0].parentNode.removeChild(element[0]);"
    driver.execute_script(js_string)
    time.sleep(2)
    
    # Saving screenshot
    correction=page_url.replace("/","")
    ss_name=correction.replace(":","")
    
    ob=Screenshot_Clipping.Screenshot()
    img_url=ob.full_Screenshot(
    driver,save_path=r'D:/OneDrive - Libin/Python/Sel_python/Pytest/Screenshots',image_name="{}.png".format(ss_name))
     
    

    【讨论】:

      【解决方案4】:

      我设法获得了整个页面,没有使用来自here 的代码的迭代、键或向下翻页或 lambda 函数,并且只更改了屏幕尺寸尺寸。

      问题是,至少对于您的网页而言,必须重新调整(扩展)宽度以拍摄整个标题的图片,即使这样它也不会占用整个宽度并最终看起来拼接在一起。

      标题宽度是简单的纯硒代码中的问题。 (在我的系统上):

      from selenium import webdriver
      from selenium.webdriver.chrome.options import Options
      
      chrome_options = Options() 
      chrome_options.add_argument('--headless')
      chrome_options.add_argument("--window-size=3200x20800") # ANYTHING MORE THAN 3200 width my pycharm cant cope (Rendering error)
      
      driver = webdriver.Chrome(options=chrome_options, executable_path=r"C:\Users\User\Documents\chromedriver_win32\chromedriver.exe") # webdriver.Chrome(options=options)
      outFileName = (r'D:\08102020 Random Work\NewFolder4PythonOut')
      driver.maximize_window()
      
      URL = "http://stevens.ekkel.ai"
      
      driver.get(URL) #time.sleep(0.5)
      #driver.maximize_window()
      
      driver.get_screenshot_as_file(outFileName+"/"+"capture4.png")
      

      另外,--window-size=3200x20800") 在 Pycharm 无法运行或在 渲染 问题的错误消息中通知我之前,我可以在我的机器上最大程度地制作它(剩余的 ram 空间有限)。但是即使我可以最大运行整个页面,屏幕截图也会像这样,所以我建议你使用@Libin Thomas pytest 代码。

      我的 chrome(故意降级到 chrome 89,因为 chrome 90 的 webdriver 尚不存在或我可以找到),也在一个非常高度标记的权威 SO 线程中(herehere 或其他地方 - 我已经读了这么多,但还没有为我们找到一个简单的通用解决方案)我[弄错了吗?还是拿走?那],正如 SO 中高度标记的答案之一所说,Chrome Webdriver 还没有“截取整个网页截图”功能,正如您在图片中看到的那样,但 FireFox 有(我不想用,不能用,已经删除了。RAM)

      编辑 18:20 pm

      在做了所有这些之后,我意识到我看错了。 ZOOM 正是我所需要的。

      我确实设法在驱动程序打开页面后使用driver.execute_script("document.body.style.zoom='10%'") 一口气获得了整个事情的屏幕截图。

      (它帮助我理解了为什么即使是您的第一次尝试,以及我成功的向下滚动页面,我们的标题看起来也被拉伸并且比正文的其他部分更窄)。

      真正的标题与其他部分相比是巨大的,但至少屏幕截图是真实的并且没有拉伸,或者只是它的中间部分,它是真实的原样标题的全部内容。

      (虽然可能不是你想要的)。

      from selenium import webdriver
      from selenium.webdriver.chrome.options import Options
      
      chrome_options = Options() #
      chrome_options.add_argument('--headless')
      chrome_options.headless = True
      
      #https://stackoverflow.com/questions/56201707/how-to-take-screenshot-of-youtube-page-without-opening-the-browser-in-python-or
      #chrome_options.add_argument("--window-size=4000x5800")
      
      driver = webdriver.Chrome(options=chrome_options, executable_path=r"C:\Users\User\Documents\chromedriver_win32\chromedriver.exe") # webdriver.Chrome(options=options)
      #driver.maximize_window()
      
      outFileName = (r'D:\08102020 Random Work\NewFolder4PythonOut')
      
      
      URL = "http://stevens.ekkel.ai"
      
      driver.get(URL) #time.sleep(0.5)
      #driver.maximize_window()
      driver.execute_script("document.body.style.zoom='10%'")
      driver.get_screenshot_as_file(outFileName+"/"+"capture5.png")
      

      我希望我在一些小的方面有所帮助,即使不是你想要的方式。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-06-02
        • 2022-07-01
        • 2017-12-25
        • 2019-01-10
        • 2014-11-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多