通过python下载Selenium和无头镀铬

时间:2017-10-22 19:50:17

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

因此,使用selenium通过无头镀铬下载文件的问题似乎仍然是一个问题,因为asked here一个月前没有答案。但我不明白他们是如何实现bug线程中的js。我可以添加一个选项或当前修复此问题吗?位于here的原始错误页面 我所有的东西都是截至今天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 个答案:

答案 0 :(得分:1)

我相信现在Chromium支持这个feature(当你链接到错误票证时),它会落入chromedriver团队以增加对该功能的支持。有一个开放的票证here,但它目前似乎没有高优先级。请各位需要此功能的人给它+1!

答案 1 :(得分:0)

为什么不找到锚点href,然后使用get request下载文件。这样它将在无头模式下工作,并且速度会快得多。我在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

答案 2 :(得分:0)

对于那些没有上面链接的铬票的人或者没有找到解决方案。这对我有用。 Chrome已更新至v65,chromedriver / selenium从4/16/18开始都是最新的。

    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'}}
    self.driver.execute("send_command", params)

如果您在下载时遇到错误文件路径太长错误,请确保donwload路径没有尾随空格或斜杠\或反斜杠。路径也必须仅使用反斜杠。我不知道为什么。