Python+selenium自动下载xml或exe文件

  • 2019 年 12 月 5 日
  • 筆記

本文介绍了用 Python + selenium 的方式从网络上自动下载xml/exe文件。

笔者最近在写一个小工具,需要从pubmed上批量下载包含文献信息的xml文件。很明显,这是一个爬虫任务,笔者选用了python+selenium的组合。代码写好后运行一切都很顺利,直到最后Chrome出现了警告信息,提示我是否要保留文件:

用Chrome下载一般的文件,如txt文件是不会有警告的,但是如xml、exe等类型的文件就会有警告。这样看上去可能是一种安全策略。虽然这个警告信息只需要点击一下就可以让程序继续运行,但是点击操作需要人工介入,这个程序就不能算作“全自动”了。最好能避开这个警告,让文件直接下载。

笔者开始上网搜寻避开警告信息的办法,经过试验可以成功运行的代码如下[1]:

from selenium import webdriver  from selenium.webdriver.chrome.options import Options    # 设置chrome的下载参数。  download_dir = "/path/to/your/download/dir"  chrome_options = Options()  chrome_options.add_experimental_option("prefs", {    "download.default_directory": download_dir,    "download.prompt_for_download": False,  })  browser = webdriver.Chrome(chrome_options=chrome_options)    # 让chrome可以自动下载文件的最关键命令  browser.command_executor._commands["send_command"] = ("POST", '/session/$sessionId/chromium/send_command')  params = {'cmd': 'Page.setDownloadBehavior', 'params': {'behavior': 'allow', 'downloadPath': download_dir}}  command_result = browser.execute("send_command", params)

一些可以让低版本的Chrome/chromedriver自动下载xml/exe文件的方法一旦升级到最新版的Chrome就不管用了。比如设置下面这些参数,都达不到效果:

prefs = {"profile.default_content_settings.popups": 0,           "safebrowsing.enabled": True}  chrome_options.add_experimental_option("prefs", prefs)

最关键的还是browser.command_executor._commands那三句命令!

笔者的Chrome版本是78.0.3904.108,chromedriver的版本是77.0.3865.40。

当然,网上还有通过判断文件已下载大小的变化来实现下载xml/exe文件的,因为实现起来麻烦还是不推荐了[2]。

参考: [1]https://blog.csdn.net/weixin_41812940/article/details/82423892 [2]https://segmentfault.com/a/1190000018538071?utm_source=tag-newest