如何在python中读取selenium webdriver下载的文件

时间:2016-01-20 12:15:31

标签: python selenium selenium-webdriver web-scraping webdriver

我在python中使用selenium和webdriver从站点下载csv文件。该文件将下载到指定的下载目录中。以下是我的代码概述

fp = webdriver.FirefoxProfile()
fp.set_preference("browser.download.folderList", 2)
fp.set_preference("browser.download.manager.showWhenStarting", False)
fp.set_preference("browser.download.dir",'xx/yy')
fp.set_preference('browser.helperApps.neverAsk.saveToDisk', "text/plain, application/vnd.ms-excel, text/csv, text/comma-separated-values, application/octet-stream")
driver = webdriver.Firefox(fp)
driver.get('url')

我需要{c}这个csv的内容print到终端。许多具有随机名称的类似文件将被下载到同一文件夹中,因此通过文件名访问文件将无法正常工作,因为我不知道它将提前是什么

3 个答案:

答案 0 :(得分:3)

您可以从该位置获取上次下载的文件,然后阅读文件:

path = /path to folder
list = os.listdir(path)
time_sorted_list = sorted(list, key=os.path.getmtime)
file_name = time_sorted_list[len(time_sorted_list)-1]

然后你可以从这个文件中读取。希望并行进程不会有多个文件到达那里。

编辑: 刚刚看到多个实例可以下载的评论,所以其他方法可以使用urllib并使用其url下载文件:

import urllib
urllib.urlretrieve( "http://www.example.com/yourfile.ext", "your-file-name.ext") // you can provide unique-id to your file name

答案 1 :(得分:1)

在Selenium中下载文件绝不是一个好主意。您无法控制文件的下载位置和文件名,如果您想查找,则必须使用脏黑客。这取决于浏览器及其设置,以及是否已经下载过相同的文件。

另外,在下载后你必须注意删除文件,否则,同一文件的大量副本会将你的硬盘垃圾邮件发送到完全填满。

如果可能,你应该打电话给

string downloadUrl = ButtonDownloadPdf.GetAttribute("href");

然后使用传统方法自行处理下载,而不是Selenium。

答案 2 :(得分:1)

这个答案是由以前的堆栈溢出问题,答案以及本文中的评论组合而成的,所以谢谢大家。

我将selenium webdriver与python请求模块结合使用。我基本上使用selenium登录网站,从webdriver会话中复制cookie,然后使用requests.get(url,cookies = webdriver_cookies)来获取文件。

这是我的解决方案的要点

fp = webdriver.FirefoxProfile() 
fp.set_preference("browser.download.folderList", 2)
fp.set_preference("browser.download.manager.showWhenStarting", False) 
fp.set_preference("browser.download.dir",'xx/yy') 
fp.set_preference('browser.helperApps.neverAsk.saveToDisk', "text/plain, application/vnd.ms-excel, text/csv, text/comma-separated-values, application/octet-stream") 
driver = webdriver.Firefox(fp)

# selenium login code ...

driver_cookies = driver.get_cookies()
cookies_copy = {}
for driver_cookie in driver_cookies:
    cookies_copy[driver_cookie["name"]] = driver_cookie["value"]
r = requests.get('url',cookies = cookies_copy)
print r.text

我希望这有助于某人