還在為pip安裝發愁?whl自助腳本問世!
- 2019 年 10 月 6 日
- 筆記
還在為pip安裝發愁?whl自助腳本問世!
0.導語
在學習Python的過程中,大家肯定會遇到pip安裝失敗的問題,要麼是因為網速問題,要麼是因為win系統上與vs綁定,必須要裝vs等一些系列問題,而這些問題有個很關鍵的解決辦法,那就是直接下載相應的whl包來安裝。
所以,我就想到,如果有一個能夠支援搜索查找及下載whl包的腳本,那是不是很棒哦,果不其然,可以做到,讓我時刻想到需求來源於生活,技術用於提升工作效率!
昨日花了一會時間寫下這個腳本,並做了測試,今天來總結一下,歡迎大家star,fork,轉發,收藏本篇文章!
源碼地址(或者點擊閱讀原文):
https://github.com/Light-City/AutoDownloadWhl
本次腳本我將它命名為:Whl自助搜索下載器
實現了如下功能:
- 支援檢索
- 支援查找
- 支援下載
- 單、多文件下載
2.如何使用及功能演示
2.1 如何使用
運行腳本需要:
- requests、lxml、os庫
- curl或axel命令
win系統的直接下載win版本的按照網上配置即可!
linux系統與mac系統可用yum 或 apt 或 brew等來進行安裝!
複製源碼地址並下載腳本,運行腳本即可:
python AutoDownloadWhl.py
2.2 功能演示
- 所有包資訊展示
- 適應平台whl包
- 多包下載
完整演示如下:



3.程式碼詳解
3.1 封裝
封裝包地址與下載地址:
class AutoDownWhl(): def __init__(self): # 包地址 self.url = 'https://www.lfd.uci.edu/~gohlke/pythonlibs/' # 下載地址 self.base_url = 'https://download.lfd.uci.edu/pythonlibs/r5uhg2lo/' # 模擬瀏覽器 self.headers = { 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.96 Safari/537.36' } 3.2 獲取選擇器與包名
解析源碼與獲取包名:
# 獲取選擇器與包名 def getLib(self): raw_text = requests.get(self.url, headers=self.headers).content seletor = etree.HTML(raw_text) lib_names = seletor.xpath('//ul[@class="pylibs"]//li//strong//text()') return seletor, lib_names 3.3 輸出所有包名
一行15個包名列印:
# 輸出所有包名 def print_AllLib(self, lib_names): print('n------------------共查找到' + str(len(lib_names)) + '個包------------------n') for i in range(len(lib_names)): if i and i % 15 == 0: print('n') print(lib_names[i], end=' ') 3.4 搜索與下載
只摘取了核心程式碼,下載採用調用系統命令curl與axel,請在自己的系統上安裝這兩個其中之一下載!
def searchDown(self, downloadMethod='axel'): # 此部分程式碼只摘取核心部分 if int(lib_sequence) <= max: detail_name = detail_libs[int(lib_sequence) - 1].strip().replace('‑', '-') download_url = self.base_url + detail_name print('nn輸入包名正確,下載地址:' + download_url + 'n') print("---------------------------------------開始下載---------------------------------------n") if downloadMethod == 'curl': cmd = 'curl -O %s' % download_url else: cmd = 'axel %s' % download_url while True: cmd_res = os.system(cmd) if cmd_res == 0: print('下載成功!n') break else: print('下載失敗!n') is_try = input('是否重試下載(y|n): ') if is_try == 'y' or is_try == 'Y': continue else: break else: print("n 33[1;31m 輸入序號不符合要求,請重新輸入! 33[0m n") 3.5 調用
採用axel下載:
dw = AutoDownWhl() dw.searchDown(downloadMethod='axel')