如何在 python 中读取由 selenium webdriver 下载的文件
How to read a file downloaded by selenium webdriver in python
我在 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')
我需要print
将此 csv 的内容发送到终端。许多具有随机名称的类似文件将被下载到同一个文件夹中,因此无法通过文件名访问文件,因为我事先不知道它是什么
在 Selenium 中下载文件从来都不是一个好主意。您无法控制下载文件的位置和文件名,如果您想知道,则必须使用肮脏的技巧。这取决于浏览器及其设置,以及之前是否已经下载过相同的文件。
此外,您必须注意在下载后删除文件,否则,同一个文件的大量副本将向您的硬盘发送垃圾邮件,直到它完全装满为止。
如果可能,你应该这样调用
string downloadUrl = ButtonDownloadPdf.GetAttribute("href");
然后自己处理下载,使用传统方法,而不是 Selenium。
您可以从该位置获取最后下载的文件,然后读取该文件:
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 as:
下载文件
import urllib
urllib.urlretrieve( "http://www.example.com/yourfile.ext", "your-file-name.ext") // you can provide unique-id to your file name
此答案由之前的堆栈溢出问题、答案以及此 post 中的评论组合而成,谢谢大家。
我将 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
我希望这对某人有所帮助
我在 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')
我需要print
将此 csv 的内容发送到终端。许多具有随机名称的类似文件将被下载到同一个文件夹中,因此无法通过文件名访问文件,因为我事先不知道它是什么
在 Selenium 中下载文件从来都不是一个好主意。您无法控制下载文件的位置和文件名,如果您想知道,则必须使用肮脏的技巧。这取决于浏览器及其设置,以及之前是否已经下载过相同的文件。
此外,您必须注意在下载后删除文件,否则,同一个文件的大量副本将向您的硬盘发送垃圾邮件,直到它完全装满为止。
如果可能,你应该这样调用
string downloadUrl = ButtonDownloadPdf.GetAttribute("href");
然后自己处理下载,使用传统方法,而不是 Selenium。
您可以从该位置获取最后下载的文件,然后读取该文件:
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 as:
下载文件import urllib
urllib.urlretrieve( "http://www.example.com/yourfile.ext", "your-file-name.ext") // you can provide unique-id to your file name
此答案由之前的堆栈溢出问题、答案以及此 post 中的评论组合而成,谢谢大家。
我将 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
我希望这对某人有所帮助