使用Chrome驱动程序通过python和selenium在指定位置下载文件

Posted

技术标签:

【中文标题】使用Chrome驱动程序通过python和selenium在指定位置下载文件【英文标题】:Downloading a file at a specified location through python and selenium using Chrome driver 【发布时间】:2016-05-21 18:54:23 【问题描述】:

我正在尝试通过 selenium 的点击功能自动下载一些链接,并且我使用 chrome webdriver 和 python 作为编程语言。 如何通过python程序选择下载目录,以免下载到默认的Downloads目录。我找到了 firefox 的解决方案,但是每次单击 Chrome 中不会发生的链接时,下载对话框都会不断弹出。

【问题讨论】:

转到 chrome 设置并检查在下载前要求保存每个文件 setting Chrome preferences w/ Selenium Webdriver in Python的可能重复 【参考方案1】:

我发现接受的解决方案不起作用,但是这个微小的变化确实有效:

from selenium import webdriver

chrome_options = webdriver.ChromeOptions()
prefs = 'download.default_directory' : '/path/to/dir'
chrome_options.add_experimental_option('prefs', prefs)
driver = webdriver.Chrome(chrome_options=chrome_options)

【讨论】:

干得好,Hoju, 谢谢!这真的解决了我的问题。但是,它似乎不适用于相对路径。例如D:/ddd 有效,而 ./tmp 无效。 ./tmp(相对路径)最终会弹出一个对话框让我手动选择目录... 有没有办法在 当前会话 上更改下载路径,类似于单击 Chrome 设置->下载的方式?我看到的答案总是导致 build new option + new driver + get a whole new session 。我不希望关闭当前会话,因为我的文件夹分离基于下拉列表中的每个项目,并且无需重新加载新页面。该下拉列表中有数千个项目;接受的方法意味着关闭和加载页面数千次。 成功了! Mac google chrome 78.0.3904.97chromedriver 2.40 WebDriver启动后如何更改默认目录?【参考方案2】:

2018 年更新:

它不是有效的 Chrome 命令行开关,请参阅下面的 source code 使用 hoju answer 来设置首选项。

原文:

您可以为 chrome 创建配置文件并定义测试的下载位置。这是一个例子:

from selenium import webdriver

options = webdriver.ChromeOptions() 
options.add_argument("download.default_directory=C:/Downloads")

driver = webdriver.Chrome(chrome_options=options)

【讨论】:

为什么需要import Options 这似乎不起作用。也许 Chromedriver 的界面发生了变化? hoju 的反应现在似乎奏效了。 如果我们想下载一个视频是行不通的..在 chrome 上播放视频而不是下载...现在如何下载视频? 这在 mac 中不适合我,请尝试以下答案:prefs = 'download.default_directory' : '/path/to/dir'; chrome_options.add_experimental_option('prefs', prefs) 不推荐使用此答案。可接受的答案应改为 Hoju 的。【参考方案3】:

我在尝试做你想做的事情时也遇到过的确切问题:)

对于 chrome

from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument("--start-maximized")
prefs = "profile.default_content_settings.popups": 0,
             "download.default_directory": 
                        r"C:\Users\user_dir\Desktop\\",#IMPORTANT - ENDING SLASH V IMPORTANT
             "directory_upgrade": True
options.add_experimental_option("prefs", prefs)
browser=webdriver.Chrome(<chromdriver.exe path>, options=options)

对于 Firefox: 请关注此博客以获取答案: https://srirajeshsahoo.wordpress.com/2018/07/26/how-to-bypass-pop-up-during-download-in-firefox-using-selenium-and-python/

该博客介绍了弹出窗口和下载目录以及如何操作

【讨论】:

【参考方案4】:

使用首选项解决了我的问题

path = os.path.dirname(os.path.abspath(__file__))
prefs = "download.default_directory":path
options = Options()
options.add_experimental_option("prefs", prefs)
driver = webdriver.Chrome('../harveston/chromedriver.exe',options = options)

【讨论】:

【参考方案5】:

这在 Chrome v81.0.4044.138 上对我有用

preferences = 
                "profile.default_content_settings.popups": 0,
                "download.default_directory": os.getcwd() + os.path.sep,
                "directory_upgrade": True
            

chrome_options.add_experimental_option('prefs', preferences)
browser = webdriver.Chrome(executable_path="/usr/bin/chromedriver", options=chrome_options)

【讨论】:

这个也适用于Chrome 80.0.3987.149。我尝试了上面的其他答案,但它们在我的 Ubuntu 机器上不起作用。谢谢@CodeWalker 同上使用 81.0.4044.69。需要添加 chrome_options = webdriver.ChromeOptions() also: webdriver.Chrome(options=blah) superceedes webdriver.Chrome(chrome_options=blah) 我会使用 chrome_options 或 options 以外的变量名以避免混淆。 chrome_options 现已弃用。如果我使用前面评论中提到的选项不起作用(我想知道为什么它不起作用)。上面的代码适用于我的 Chrome 版本 83 的 Mac【参考方案6】:

要提供下载目录和chrome的dive可执行路径,请使用以下代码。

from selenium import webdriver
options = webdriver.ChromeOptions() 
options.add_argument("download.default_directory=C:/Your_Directory")
driver = webdriver.Chrome(options=options ,executable_path='C:/chromedriver')

相应地更改代码中的路径。

【讨论】:

【参考方案7】:

如果你使用的是 linux 发行版

使用此代码

prefs = 'download.prompt_for_download': False,
         'download.directory_upgrade': True,
         'safebrowsing.enabled': False,
         'safebrowsing.disable_download_protection': True

options.add_argument('--headless')
options.add_experimental_option('prefs', prefs)
driver = webdriver.Chrome('chromedriver.exe', chrome_options=options)
driver.command_executor._commands["send_command"] = ("POST", '/session/$sessionId/chromium/send_command')
driver.desired_capabilities['browserName'] = 'ur mum'
params = 'cmd': 'Page.setDownloadBehavior', 'params': 'behavior': 'allow', 'downloadPath': r'C:\chickenbutt'
driver.execute("send_command", params)

【讨论】:

【参考方案8】:

我看到很多人有同样的问题,只是在末尾添加反斜杠

op = webdriver.ChromeOptions()
prefs = 'download.default_directory' : 'C:\\Users\\SAJComputer\\PycharmProjects\\robot-test\\'
op.add_experimental_option('prefs', prefs)
driver = webdriver.Chrome(executable_path=driver_path , options=op)

【讨论】:

【参考方案9】:

以下代码 sn-p 适用于 Windows/linux/MacOs 发行版:

    downloadDir = f"os.getcwd()//downloads//"
    # Make sure path exists.
    Path(downloadDir).mkdir(parents=True, exist_ok=True)
    
    # Set Preferences.
    preferences = "download.default_directory": downloadDir,
                   "download.prompt_for_download": False,
                   "directory_upgrade": True,
                   "safebrowsing.enabled": True

    chromeOptions = webdriver.ChromeOptions()
    chromeOptions.add_argument("--window-size=1480x560")
    chromeOptions.add_experimental_option("prefs", preferences)

    driver = webdriver.Chrome(DRIVER_PATH, options=chromeOptions)
    driver.get(url)
    time.sleep(10)
    driver.close()

【讨论】:

【参考方案10】:

这是没有 chrome 分析/选项设置的非代码级解决方案。

如果您仅在本地计算机上使用脚本,请使用此解决方案

点击菜单 -> 设置 -> 显示高级设置... -> 下载

现在取消选中

在下载前询问每个文件的保存位置

希望对你有帮助:)

【讨论】:

这个问题是关于通过称为 selenium 的自动化系统控制 chrome。你回答得好像他问手动控制 chrome。 这是您必须进行的一次性配置,是的,它也是一种解决方案 这实际上是一个有效且有效的答案。它对我来说非常有效。 请评价这个答案..如果它有负面评价,我需要删除它 Shubam 回答得很好。设置您的 chrome 配置文件的默认目录,然后它将成为解决方案。

以上是关于使用Chrome驱动程序通过python和selenium在指定位置下载文件的主要内容,如果未能解决你的问题,请参考以下文章

如何用python写chrome插件

sele nium 模块

Python自动检测Chrome浏览器版本号并下载对应驱动文件[chromedriver.exe]

Chrome 网络驱动程序 - Python

如何处理Chrome Selenium网络驱动程序中的弹出窗口-Python

python的selenium自动化打开chrome后自动和手工混合操作?