爬取名称、md5值、下载链接,批量下载升级包,计算文件MD5值

今日学习

功能介绍
  • 计算指定文件的md5值
  • 爬取绿盟升级包名称和md5值,并生成excle
  • 计算指定文件夹里的所有文件的md5值并与官网上爬取的绿盟升级包名称和md5值做比较
  • 自动下载同一类型(增量更新)升级包到指定文件夹
import requests
from lxml import etree
import os
import hashlib
import getopt
import sys
import xlwt
url = ''
path = ''
# 爬取网页上升级包的名称和md5值,放到字典dic1中
def spider_filename_md5(url):
    response = requests.get(url)
    html = response.content
    html = str(html, encoding='utf-8')
    s = etree.HTML(html)
    name = s.xpath('/html/body/section/div/section/div/div[2]/div[2]/table/tr/td/a')
    name = [str(i.text) for i in name]
    md5 = s.xpath('/html/body/section/div/section/div/div[2]/div[2]/table/tr[2]/td[1]/text()')
    md5 = [str(i.strip()) for i in md5]
    dic1 = dict(zip(name, md5))
    excel(dic1)
    return dic1

def excel(dic):
    # 创建workbook(其实就是excel,后来保存一下就行)
    workbook = xlwt.Workbook(encoding='utf-8')
    # 创建表
    worksheet = workbook.add_sheet('sheet1')
    # 往单元格内写入内容:写入表头
    worksheet.write(0, 0, label="name")
    worksheet.write(0, 1, label="md5")
    # 往单元格内写入内容:写入内容
    i = 1
    for word in dic:
        worksheet.write(i, 0, label=word)
        worksheet.write(i, 1, label=dic[word])
        i = i + 1
    workbook.save('md5.xls')
# 计算文件md5方法
def md5(path,Bytes=1024):
    md5_1 = hashlib.md5()
    with open(path,'rb') as f:
        while 1:
            data =f.read(Bytes)
            if data:
                md5_1.update(data)
            else:
                break
    ret = md5_1.hexdigest()
    return ret

# 取出指定文件夹中升级包的名称和md5值,放到字典dic1中
def local_filename_md5(path):
    name = [file for file in os.listdir(path)]
    dic2 = {}
    for i in name:
        dis={i:md5(path+'\\'+i)}
        dic2.update(dis)
    return dic2
# 本地文件的md5与正确文件的md5比对
def duibi(dic1,dic2):
    for i in dic2.keys():
        # print(i)
        # print(dic1.keys())
        if i in dic1.keys():
            if dic2[i] == dic1[i]:
              #  print(i+'文件正确')
                pass
            else:
                print(i+':md5值不正确')
        else:
             print('目标网址无此本地文件:'+i)

# 自动从官网下载补丁包(增量更新)
def down_file(url):
    response = requests.get(url)
    html = response.content
    html = str(html, encoding='utf-8')
    s = etree.HTML(html)
    down_path = s.xpath('/html/body/section/div/section/div/div[2]/div[2]/table/tr[1]/td[1]/a/@href')
    down_path = [str('http://update.nsfocus.com' + i) for i in down_path]
    name = s.xpath('/html/body/section/div/section/div/div[2]/div[2]/table/tr/td/a')
    name = [str(i.text) for i in name]
    dic3 = dict(zip(down_path, name))
    file_folder_name = s.xpath('/html/body/section/div/section/div/div[2]/div[2]/h2')
    file_folder_name = [str(i.text) for i in file_folder_name]
    headers = {
            'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:65.0) Gecko/20100101 Firefox/65.0',
            'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
            'Accept-Language':'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
            'Accept-Encoding':'gzip, deflate',
            'Connection':'close',
            'Upgrade-Insecure-Requests':'1',
        }
    for i in down_path:
        download = requests.get(i,headers=headers)
        path = os.path.abspath('.')
        name_path1 = path+'\\'+str(file_folder_name[0])
        name_path2 = name_path1 +'\\'+str(dic3[i])
        if not os.path.exists(name_path1):
            os.mkdir(name_path1)
        else:
            if not os.path.exists(name_path2):
                with open(name_path2, 'wb') as f:
                    f.write(download.content)
            else:
                pass

def use():
    print("helpinfo:")
    print("获取指定文件的md5值。格式:-m -p 文件路径包含文件名字;例子 python md5.py -m -p c:\\a\\p.bat")
    print("爬取指定网页升级包名称和md5值,并生成md5.excel。格式:-n -u url ;例子 python md5.py -n -u http://*.*.*.* ")
    print("获取指定文件夹内所有文件的md5值,并与官网比较。格式:-l -u url -s 文件夹目录 ")
    print("下载指定网页的升级包(增量更新) 格式:-d -u url")
opts,args = getopt.getopt(sys.argv[1:], "hldmnsp:u:")
if __name__ == '__main__':
    listen = None
    for a,b in opts:
        if a == "-h":
            use()
        elif a == "-m":
            listen = 1
        elif a == "-n":
            listen = 2
        elif a == "-l":
            listen = 3
        elif a == "-p":
            path = b
        elif a == "-u":
            url = b
        elif a == "-d":
            listen = 4
        else:
            assert False, "Unhandled Option"
    if listen == 1:
        print(md5(path))
    elif listen == 2:
        spider_filename_md5(url)
    elif listen == 3:
        duibi(spider_filename_md5(url),local_filename_md5(path))
    elif listen == 4:
        down_file(url)
    else:
        pass
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,558评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,002评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,024评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,144评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,255评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,295评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,068评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,478评论 1 305
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,789评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,965评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,649评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,267评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,982评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,800评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,847评论 2 351

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,094评论 1 32
  • 有一个故事,我不会忘记,这个故事是“廊桥遗梦”;有一个名字我记在心里,这个名字是罗伯特·金凯。 罗伯特·金凯是美国...
    小曼曼君阅读 507评论 0 1