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

前言
由于需要離線安裝藍(lán)鯨運(yùn)維平臺(tái),需要下載一堆的rpm依賴包,來解決離線環(huán)境的依賴包版本不一致問題,于是決定下載相關(guān)系統(tǒng)版本的所有依賴包,一次下載,終生受用。還可以制作離線環(huán)境的yum源,以供所有離線環(huán)境主機(jī)進(jìn)行rpm安裝包的依賴下載,不過這是后話,先按下不表。

首先找到系統(tǒng)rpm安裝包的下載地址,相關(guān)地址很多,以下列舉一些以供參考:

  1. 清華大學(xué)開源軟件鏡像站
  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)
# 訪問該url
browser.get(url=weburl)

# 抓取到頁面信息
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ò)中斷,從中斷處再開始下載即可
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)行訪問,和持久化存儲(chǔ)數(shù)據(jù),timeout必須加上,防止服務(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)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Linux程序包的管理需要依賴程序包管理工具,程序包管理工具可以實(shí)現(xiàn)程序的安裝、升級(jí)、卸載、查詢和校驗(yàn),等等相關(guān)操...
    Arroganter閱讀 1,053評(píng)論 0 2
  • Linux程序包的管理需要依賴程序包管理工具,程序包管理工具可以實(shí)現(xiàn)程序的安裝、升級(jí)、卸載、查詢和校驗(yàn),等等相關(guān)操...
    piziyang12138閱讀 997評(píng)論 0 0
  • 軟件包管理 軟件運(yùn)行和編譯 鏈接主要作用是把各個(gè)模塊之間相互引用的部分處理好,使得各個(gè)模塊之間能夠正確地銜接,分為...
    塵曦的雨閱讀 784評(píng)論 0 0
  • Linux程序包的管理需要依賴程序包管理工具,程序包管理工具可以實(shí)現(xiàn)程序的安裝、升級(jí)、卸載、查詢和校驗(yàn),等等相關(guān)操...
    學(xué)渣角鹿白閱讀 433評(píng)論 0 1
  • 1.軟件的運(yùn)行和編譯 ? ABI:Application Binary Interface(不同的操作系統(tǒng)有不同的...
    尛尛大尹閱讀 220評(píng)論 0 0

友情鏈接更多精彩內(nèi)容