前言
由于需要離線安裝藍(lán)鯨運(yùn)維平臺(tái)摄欲,需要下載一堆的rpm依賴包,來(lái)解決離線環(huán)境的依賴包版本不一致問(wèn)題纬凤,于是決定下載相關(guān)系統(tǒng)版本的所有依賴包,一次下載撩嚼,終生受用移斩。還可以制作離線環(huán)境的yum源,以供所有離線環(huán)境主機(jī)進(jìn)行rpm安裝包的依賴下載绢馍,不過(guò)這是后話向瓷,先按下不表。
首先找到系統(tǒng)rpm安裝包的下載地址舰涌,相關(guān)地址很多猖任,以下列舉一些以供參考:
本次使用 centos鏡像站作為rpm軟件包提供的服務(wù)器地址,相關(guān)源碼及注釋如下所示:
import random
import re
import socket
import struct
import requests
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
RANDOM_IP_POOL = ['192.168.10.222/0']
# 生成隨機(jī)IP地址
def __get_random_ip():
str_ip = RANDOM_IP_POOL[random.randint(0, len(RANDOM_IP_POOL) - 1)]
str_ip_addr = str_ip.split('/')[0]
str_ip_mask = str_ip.split('/')[1]
ip_addr = struct.unpack('>I', socket.inet_aton(str_ip_addr))[0]
mask = 0x0
for i in range(31, 31 - int(str_ip_mask), -1):
mask = mask | (1 << i)
ip_addr_min = ip_addr & (mask & 0xffffffff)
ip_addr_max = ip_addr | (~mask & 0xffffffff)
return socket.inet_ntoa(struct.pack('>I', random.randint(ip_addr_min, ip_addr_max)))
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
# rpm安裝包源地址
weburl = "https://vault.centos.org/7.7.1908/os/x86_64/Packages/"
# rpm安裝包名獲取規(guī)則
ex1 = '<a href="(.*?.rpm)">'
# 初始化browser對(duì)象
browser = webdriver.Chrome(executable_path='chromedriver.exe', chrome_options=chrome_options)
# 訪問(wèn)該url
browser.get(url=weburl)
# 抓取到頁(yè)面信息
page_text = browser.execute_script("return document.documentElement.outerHTML")
# 獲取安裝包名的list列表
name_list = re.findall(ex1, page_text, re.M)
# 循環(huán)遍歷瓷耙,當(dāng)超時(shí)時(shí)報(bào)錯(cuò)中斷朱躺,從中斷處再開(kāi)始下載即可
for i in range(584, len(name_list)):
print(str(i + 1) + '.' + str(name_list[i]))
# 獲取rpm安裝包名
filename = str(name_list[i])
# rpm安裝包下載到的本地地址
save_path = "D:\\7.7.1908\\Packages\\"
save_file = save_path + filename
# rpm安裝包獲取的url地址
url = weburl + filename
print(str(i + 1) + '.' + save_file)
print(str(i + 1) + '.' + url)
# 獲取隨機(jī)ip地址
dir_ip = __get_random_ip()
# 進(jìn)行UA偽裝,防止服務(wù)器將請(qǐng)求直接打回
webheader2 = {
'Connection': 'Keep-Alive',
'Accept': 'text/html, application/xhtml+xml, */*',
'Accept-Language': 'en-US,en;q=0.8,zh-Hans-CN;q=0.5,zh-Hans;q=0.3',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko',
'Accept-Encoding': 'gzip, deflate',
'Host': dir_ip,
'DNT': '1'
}
# 調(diào)用requests.get方法對(duì)url進(jìn)行訪問(wèn)搁痛,和持久化存儲(chǔ)數(shù)據(jù)长搀,timeout必須加上,防止服務(wù)端無(wú)響應(yīng)后程序卡死
audio_content = requests.get(url=url, headers=webheader2, timeout=(3, 7)).content
# 存入本地
with open(save_file, 'wb') as f:
f.write(audio_content)
print(save_file + " 下載完成")
# 退出瀏覽器
browser.quit()
執(zhí)行程序后就靜靜等待rpm包全部下載完成即可鸡典,如有報(bào)錯(cuò)中斷源请,修改range()函數(shù)的起始位置至失敗處,重新執(zhí)行程序彻况,筆者由于工作環(huán)境網(wǎng)絡(luò)極差谁尸,下載中失敗了很多次。