chromedriver之"此類型文件可能會損害您的計算機"提示的處理

背景

最近在使用selenium進行自動文件下載時,忽然出現了一個報錯:python

圖片描述

下載進行不下去了。web

思路

通過各類谷歌、百度,均告訴我在要增長params,關閉瀏覽器安全選項,配置以下:chrome

chromeOptions = webdriver.ChromeOptions()
prefs = {"profile.default_content_settings.popups": 0,
          "download.default_directory": path,
          "download.prompt_for_download": False,
          # "download.directory_upgrade": 'true',
          "safebrowsing.enabled": True}
chromeOptions.add_experimental_option("prefs", prefs)

事實證實,可能之前的版本是可行的,如今的真心不行。windows

上面配置重點是"safebrowsing.enabled": True。在MacOS的環境下,哪怕不配也是沒有問題的,Windows就不行了。瀏覽器

最後在谷歌上找到一篇相關文章,大意是說這個是無解的,多是windows系統安全的問題,安全

對於這個解釋我仍是比較承認的,因此在mac上就不會提示。this

Let’s start frankly: you can’t disable this feature. You can merely tweak the download settings in order to avoid it.

https://windowsreport.com/typ...spa

那麼問題來了,既然這樣,有什麼曲線救國的辦法呢?code

當chromedriver彈出這個提示的時候,其實文件已經下載完成,以下圖:blog

圖片描述

咱們只須要將文件名修改成正確的名字和後綴便可(好比test.txt),直接無視警告提醒。思路以下:

  • 找到最新下載的文件:經過對下載目錄的文件按照建立時間排序,找到最新的
  • 判斷是否該文件是否已下載完成:經過判斷時間間隔先後該文件是否有大小的變化

結論

根據上面思路,實現的關鍵代碼以下:

def sort_file():
    global path
    dir_lists = os.listdir(path)
    dir_lists.sort(key=lambda fn: os.path.getmtime(os.path.join(path, fn)))
    return dir_lists[-1]
  
def changeName(path, oldname, newname):
    old_path = os.path.join(path, oldname)
    new_path = os.path.join(path, newname + '.txt')
    if os.path.exists(old_path):
        if os.path.exists(new_path):
            os.remove(new_path)
        os.rename(old_path, new_path)
        print ('rename done!' + newname)
    else:
        print ('no file found!')
  
def download():
  ...
  temp_filename = sort_file()
      if u'未確認' in temp_filename:
          temp_filesize_old = os.path.getsize(os.path.join(path, temp_filename))
          while True:
              time.sleep(1)
              temp_filesize_new = os.path.getsize(os.path.join(path, temp_filename))
              if temp_filesize_old == temp_filesize_new:
                  changeName(path, temp_filename, ip)
                  return
              else:
                  temp_filesize_old = temp_filesize_new
      else:
          print(u'下載失敗')

須要注意的是,在文件重命名的時候,先檢查下文件是否已經存在,先刪除,在建立。

以上。

若是有更好的思路,歡迎分享。

相關文章
相關標籤/搜索