Python+selenium自動下載xml或exe文件

本文介紹了用 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章