python爬蟲(chóng)代碼爬取rpm依賴包(附帶源碼解析)

前言
由于需要離線安裝藍(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)地址很多猖任,以下列舉一些以供參考:

  1. 清華大學(xué)開(kāi)源軟件鏡像站
  2. centos鏡像站
  3. rpmfind
  4. pkgs
  5. fedora koji
  6. pbone

本次使用 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ò)極差谁尸,下載中失敗了很多次。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末纽甘,一起剝皮案震驚了整個(gè)濱河市良蛮,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌悍赢,老刑警劉巖决瞳,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件货徙,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡皮胡,警方通過(guò)查閱死者的電腦和手機(jī)痴颊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)胸囱,“玉大人祷舀,你說(shuō)我怎么就攤上這事瀑梗∨氡剩” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵抛丽,是天一觀的道長(zhǎng)谤职。 經(jīng)常有香客問(wèn)我,道長(zhǎng)亿鲜,這世上最難降的妖魔是什么允蜈? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮蒿柳,結(jié)果婚禮上饶套,老公的妹妹穿的比我還像新娘。我一直安慰自己垒探,他們只是感情好妓蛮,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著圾叼,像睡著了一般蛤克。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上夷蚊,一...
    開(kāi)封第一講書(shū)人閱讀 52,441評(píng)論 1 310
  • 那天构挤,我揣著相機(jī)與錄音,去河邊找鬼惕鼓。 笑死筋现,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的箱歧。 我是一名探鬼主播夫否,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼叫胁!你這毒婦竟也來(lái)了凰慈?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤驼鹅,失蹤者是張志新(化名)和其女友劉穎微谓,沒(méi)想到半個(gè)月后森篷,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡豺型,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年仲智,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片姻氨。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡钓辆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出肴焊,到底是詐尸還是另有隱情前联,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布娶眷,位于F島的核電站似嗤,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏届宠。R本人自食惡果不足惜烁落,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望豌注。 院中可真熱鬧伤塌,春花似錦、人聲如沸轧铁。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)属桦。三九已至熊痴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間聂宾,已是汗流浹背果善。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留系谐,地道東北人巾陕。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像纪他,于是被迫代替她去往敵國(guó)和親鄙煤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • Linux程序包的管理需要依賴程序包管理工具茶袒,程序包管理工具可以實(shí)現(xiàn)程序的安裝梯刚、升級(jí)、卸載薪寓、查詢和校驗(yàn)亡资,等等相關(guān)操...
    Arroganter閱讀 904評(píng)論 0 2
  • Linux程序包的管理需要依賴程序包管理工具澜共,程序包管理工具可以實(shí)現(xiàn)程序的安裝、升級(jí)锥腻、卸載嗦董、查詢和校驗(yàn),等等相關(guān)操...
    piziyang12138閱讀 917評(píng)論 0 0
  • 軟件包管理 軟件運(yùn)行和編譯 鏈接主要作用是把各個(gè)模塊之間相互引用的部分處理好瘦黑,使得各個(gè)模塊之間能夠正確地銜接京革,分為...
    塵曦的雨閱讀 718評(píng)論 0 0
  • Linux程序包的管理需要依賴程序包管理工具,程序包管理工具可以實(shí)現(xiàn)程序的安裝幸斥、升級(jí)匹摇、卸載、查詢和校驗(yàn)睡毒,等等相關(guān)操...
    學(xué)渣角鹿白閱讀 366評(píng)論 0 1
  • 1.軟件的運(yùn)行和編譯 ? ABI:Application Binary Interface(不同的操作系統(tǒng)有不同的...
    尛尛大尹閱讀 185評(píng)論 0 0