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