溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

python使用selenium實現(xiàn)批量文件下載

發(fā)布時間:2020-08-29 15:36:23 來源:腳本之家 閱讀:156 作者:keejo 欄目:開發(fā)技術(shù)

背景

實現(xiàn)需求:批量下載聯(lián)想某型號的全部驅(qū)動程序。

一般在做網(wǎng)絡(luò)爬蟲的時候,都是保存網(wǎng)頁信息為主,或者下載單個文件。當涉及到多文件批量下載的時候,由于下載所需時間不定,下載的文件名不定,所以有一定的困難。

思路

參數(shù)配置

在涉及下載的時候,需要先對chromedriver進行參數(shù)配置,設(shè)定默認下載目錄:

global base_path
profile = {
  'download.default_directory': base_path
}
chrome_options = webdriver.ChromeOptions()
chrome_options.add_experimental_option('prefs', profile)
driver = webdriver.Chrome(executable_path='../common/chromedriver', options=chrome_options)
driver.implicitly_wait(10)

頁面分析

python使用selenium實現(xiàn)批量文件下載

聯(lián)想官網(wǎng)上每個型號的驅(qū)動下載頁面如上圖所示,雖然前面有一個登陸的遮罩,但是實際上并不影響點擊。需要注意的是:

驅(qū)動列表,需要點擊才可以顯示具體的下載項目表格,否則可以找到對應(yīng)元素但無法獲取正確的信息

driver_list.find_element_by_class_name('download-center_list_t_icon').click()

每個下載列表的表頭建議做跳過處理

if sub_list.find_element_by_class_name('download-center_usblist_td01').text == '驅(qū)動名稱':
  continue

下載處理

在頁面中,找到“普通下載”的元素,點擊即可下載。最終實現(xiàn)結(jié)果是我們希望根據(jù)網(wǎng)頁的列表進行重命名和重新歸檔到文件夾,但是我們會發(fā)現(xiàn)如下幾個問題:

  • 下載過來的文件名無法控制。
  • 依次下載的話,我們無法確認需要下載多久。并行下載的話,無法有效的區(qū)分重命名。

在網(wǎng)上找了很久,也沒找到在下載時直接重命名的方法,所以最終選擇依次下載,當每次下載完成后進行重命名和歸檔,思路如下:

  • 對每個驅(qū)動目錄,先新建一個文件夾,如:主板
  • 點擊下載后開始下載文件
  • 通過os模塊,找到下載目錄中所有文件,并按創(chuàng)建時間排序,找到最新創(chuàng)建的文件
  • 由于未完成的文件后綴為.crdownload(chrome),那么根據(jù)后綴來判斷是否已完成下載,未完成的話繼續(xù)等待

python使用selenium實現(xiàn)批量文件下載

待下載完成,將文件重命名并剪切到開始建立的歸檔目錄。這里需要注意的是,有些文件名中不能存在/符號,否則會導(dǎo)致重命名失敗,需要做一下替換。

在后期測試的時候,發(fā)現(xiàn)還有幾個坑需要注意:

在查找最新創(chuàng)建的文件時,需要注意.DS_Store文件的處理。(Mac系統(tǒng),Windows則需要考慮thumbs.db

需要判斷一下最新創(chuàng)建的文件是否為文件夾,可以通過filter函數(shù)來處理

最新文件的排序查找實現(xiàn)如下:

def sort_file():
 # 排序文件
 dir_link = base_path
 dir_lists = list(filter(check_file, os.listdir(dir_link)))
 if len(dir_lists) == 0:
   return ''
 else:
   dir_lists.sort(key=lambda fn: os.path.getmtime(dir_link + os.sep + fn))
   return os.path.join(base_path, dir_lists[-1])


def check_file(filename):
 # 忽略系統(tǒng)文件
 if filename == '.DS_Store' or filename == 'thumbs.db':
   return False
 global base_path
 # 排除文件夾
 return os.path.isfile(os.path.join(base_path, filename))

總結(jié)

最終實現(xiàn)效果如下:

python使用selenium實現(xiàn)批量文件下載

完整代碼參考:https://github.com/keejo125/web_scraping_and_data_analysis/tree/master/Lenovo

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持億速云。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI