使用Python定义Chromedriver Selenium的下载目录

8

标题已经说明了一切!

有没有办法在python中使用selenium-chromedriver定义下载目录呢?

尽管进行了许多研究,但我并没有找到什么结论性的东西……作为新手,我看到了许多关于"所需的能力"或"选项"的Chromedriver的东西,但没有解决我的问题……(而且我仍然不知道它是否会!)

为了更好地解释我的问题: 我有很多要扫描的URL(200,000个),每个URL有一个要下载的文件。 我必须为每个网页创建一张表格,其中包括该网页的URL、我抓取到的信息以及我刚刚下载的文件的名称。 由于要处理的数据量很大,我创建了线程来打开多个Chromedriver实例以加快处理速度。 问题是每个下载的文件都到达相同的默认目录,我不能再将文件链接到URL… 因此,想法是为每个线程创建一个下载目录,逐个管理它们。

如果有人有我标题中问题的答案或一个解决方法来识别已下载的文件并将其与当前的URL链接起来,我将非常感激!


一般来说,我建议您不要使用Chrome下载东西,因为它通常是一个没有经过深思熟虑的测试,只会将所有内容下载到静态文件夹中。您是否对下载的文件进行了任何处理?请阅读以下内容:http://ardesco.lazerycode.com/index.php/2012/07/how-to-download-files-with-selenium-and-why-you-shouldnt/,然后再看这个:http://www.blog.pythonlibrary.org/2012/06/07/python-101-how-to-download-a-file/。 - Ardesco
你好,感谢您的回复。 实际上我并不使用Selenium来运行测试,而是用它来自动化大量数据CSV文件的下载以进行后续处理。 我尝试过探索urllib2的方法,但是在网站上进行身份验证时遇到了困难... (可能是因为我是一个星期天的DIY新手,当我发现Selenium时,它就像金蛋鹅一样珍贵!...) - matlabat
3个回答

1
对于chromedriver1,创建一个新的配置文件,在该配置文件中将download.default_directory设置为所需位置,并使用chrome.profile将此配置文件设置为Chrome的配置文件。 selenium-chromedriver包应该有一些方法用于创建新的配置文件(至少在ruby中是这样),因为它们需要一些特殊处理。
Chromedriver2不支持设置配置文件。您可以使用它来设置偏好设置。如果您想设置下载目录,可以按照以下方式进行:
prefs: { download: { default_directory: "/tmp" } }

Ruby的selenium-webdriver目前还不支持此功能,但Python版本可能会支持。

1

我最近遇到了同样的问题。尝试了很多在互联网上找到的解决方案,但没有一个有用。所以最后我做了以下操作:

  • 使用空的用户数据目录(在 /tmp 文件夹中)启动 Chrome,让 Chrome 初始化它
  • 退出 Chrome
  • 修改新创建的用户数据目录中的 Default/Preferences,在根对象中添加这些字段(只是一个示例):

    "download": { "default_directory": "/tmp/tmpX7EADC.downloads", "directory_upgrade": true }

  • 再次使用相同的用户数据目录启动 Chrome

现在它可以正常工作。

另一个提示:如果您不知道要下载的文件的文件名,请创建下载目录的快照(文件列表),然后下载该文件并通过比较快照和当前文件列表来查找其名称。


如果您需要某种Python伪代码来解决问题,请告诉我。 - Dmitry Nedbaylo

0
请尝试以下代码...
System.setProperty("webdriver.chrome.driver", "/path/to/chromedriver");
String downloadFilepath = "/path/to/download";
HashMap<String, Object> chromePrefs = new HashMap<String, Object>();
chromePrefs.put("profile.default_content_settings.popups", 0);
chromePrefs.put("download.default_directory", downloadFilepath);
ChromeOptions options = new ChromeOptions();
HashMap<String, Object> chromeOptionsMap = new HashMap<String, Object>();
options.setExperimentalOptions("prefs", chromePrefs);
options.addArguments("--test-type");
DesiredCapabilities cap = DesiredCapabilities.chrome();
cap.setCapability(ChromeOptions.CAPABILITY, chromeOptionsMap);
cap.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true);
cap.setCapability(ChromeOptions.CAPABILITY, options);
WebDriver driver = new ChromeDriver(cap);

2
C#对于一个Python问题的答案? - DeepSpace

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