使用 Python 中的 Selenium Headless Chrome 下载文件

3
所以,通过selenium使用headless chrome下载文件的问题仍然存在,就像一个月前在这里提出的那样,没有答案。但是我不明白他们如何实现bug线程中的js。有什么选项可以添加或当前的解决方法吗?原始的bug页面位于这里. 我的所有东西都是最新的,截至今天10/22/17。
在Python中:
from selenium import webdriver


options = webdriver.ChromeOptions()

prefs = {"download.default_directory": "C:/Stuff", 
         "download.prompt_for_download": False,
         "download.directory_upgrade": True, 
         "plugins.always_open_pdf_externally": True
         }

options.add_experimental_option("prefs", prefs)
options.add_argument('headless')
driver = webdriver.Chrome(r'C:/Users/aaron/chromedriver.exe', chrome_options = options)

# test file to download which doesn't work
driver.get('http://ipv4.download.thinkbroadband.com/5MB.zip')

如果删除无头选项,这将没有问题。
我正在尝试下载位于.aspx网址的PDF文件。通过执行 .click() 进行下载,这种方法非常好用,但是无头浏览器版本却不行。 hrefs 是 javascript do_postback 脚本。
3个回答

1
我相信现在Chromium已经支持了这个功能(正如你链接的bug票据所示),现在就需要chromedriver团队添加对该功能的支持。这里有一个开放的票据这里,但目前似乎没有高优先级。请所有需要此功能的人都去给它点个赞!

1
为什么不定位锚点href,然后使用get请求下载文件。这样在无头模式下运行会更快。我已经在C#中完成了这个操作。
def download_file(url):
    local_filename = url.split('/')[-1]
    # NOTE the stream=True parameter
    r = requests.get(url, stream=True)
    with open(local_filename, 'wb') as f:
        for chunk in r.iter_content(chunk_size=1024): 
            if chunk: # filter out keep-alive new chunks
                f.write(chunk)
                #f.flush() commented by recommendation from J.F.Sebastian
    return local_filename

我正在尝试下载PDF文件,但链接实际上是JavaScript的do_postback脚本。查看PDF时生成的链接都是相同的.aspx网址。 - A A Ron

0

对于那些没有关注上面链接的Chromium票证或者还没有找到解决方案的人,这个方法适用于我。Chrome已经更新到v65,chromedriver/selenium截至2018年4月16日也都是最新版本。

    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)

如果在下载时出现“文件路径过长”的错误,请确保下载路径没有尾随空格或斜杠或反斜杠。路径必须仅使用反斜杠。我不知道为什么会这样。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接