摘要:背景實(shí)現(xiàn)需求批量下載聯(lián)想某型號的全部驅(qū)動程序。最終實(shí)現(xiàn)結(jié)果是我們希望根據(jù)網(wǎng)頁的列表進(jìn)行重命名和重新歸檔到文件夾,但是我們會發(fā)現(xiàn)如下幾個問題下載過來的文件名無法控制。
背景
實(shí)現(xiàn)需求:批量下載聯(lián)想某型號的全部驅(qū)動程序。
一般在做網(wǎng)絡(luò)爬蟲的時候,都是保存網(wǎng)頁信息為主,或者下載單個文件。當(dāng)涉及到多文件批量下載的時候,由于下載所需時間不定,下載的文件名不定,所以有一定的困難。
思路 參數(shù)配置在涉及下載的時候,需要先對chromedriver進(jìn)行參數(shù)配置,設(shè)定默認(rèn)下載目錄:
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)頁面分析
聯(lián)想官網(wǎng)上每個型號的驅(qū)動下載頁面如上圖所示,雖然前面有一個登陸的遮罩,但是實(shí)際上并不影響點(diǎn)擊。需要注意的是:
驅(qū)動列表,需要點(diǎn)擊才可以顯示具體的下載項(xiàng)目表格,否則可以找到對應(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下載處理
在頁面中,找到“普通下載”的元素,點(diǎn)擊即可下載。最終實(shí)現(xiàn)結(jié)果是我們希望根據(jù)網(wǎng)頁的列表進(jìn)行重命名和重新歸檔到文件夾,但是我們會發(fā)現(xiàn)如下幾個問題:
下載過來的文件名無法控制。
依次下載的話,我們無法確認(rèn)需要下載多久。并行下載的話,無法有效的區(qū)分重命名。
在網(wǎng)上找了很久,也沒找到在下載時直接重命名的方法,所以最終選擇依次下載,當(dāng)每次下載完成后進(jìn)行重命名和歸檔,思路如下:
對每個驅(qū)動目錄,先新建一個文件夾,如:主板
點(diǎn)擊下載后開始下載文件
通過os模塊,找到下載目錄中所有文件,并按創(chuàng)建時間排序,找到最新創(chuàng)建的文件
由于未完成的文件后綴為.crdownload(chrome),那么根據(jù)后綴來判斷是否已完成下載,未完成的話繼續(xù)等待
待下載完成,將文件重命名并剪切到開始建立的歸檔目錄。這里需要注意的是,有些文件名中不能存在/符號,否則會導(dǎo)致重命名失敗,需要做一下替換。
在后期測試的時候,發(fā)現(xiàn)還有幾個坑需要注意:
在查找最新創(chuàng)建的文件時,需要注意.DS_Store文件的處理。(Mac系統(tǒng),Windows則需要考慮thumbs.db)
需要判斷一下最新創(chuàng)建的文件是否為文件夾,可以通過filter函數(shù)來處理
最新文件的排序查找實(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é)
最終實(shí)現(xiàn)效果如下:
完整代碼參考:https://github.com/keejo125/w...
如果大家有更好的方法,也歡迎分享。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/43344.html
摘要:在本文,將替換文本協(xié)議為版本后的統(tǒng)一協(xié)議。協(xié)議格式在發(fā)送命令和返回結(jié)果中均使用同一套標(biāo)準(zhǔn)協(xié)議。實(shí)現(xiàn)通信協(xié)議版本協(xié)議實(shí)現(xiàn)初探很多相關(guān)的組件模塊工具都有協(xié)議的生成和解析實(shí)現(xiàn),并歷經(jīng)生產(chǎn)環(huán)境的考驗(yàn)。 寫在前面 本文實(shí)現(xiàn)的Godis代碼版本為:v0.0.3 在前三篇文章中,實(shí)現(xiàn)了客戶端/服務(wù)端的交互(基于textprotoco)、服務(wù)端初始化和get/set命令。如果閱讀過或者調(diào)試過粗略的代碼...
閱讀 2914·2021-07-30 15:30
閱讀 611·2019-08-30 15:55
閱讀 1677·2019-08-26 17:04
閱讀 692·2019-08-26 11:36
閱讀 2148·2019-08-26 10:58
閱讀 3631·2019-08-23 14:34
閱讀 1617·2019-08-22 18:48
閱讀 2592·2019-08-21 17:51