使用python完成一个定时从版本库下载daily版本

每天凌晨打开http去寻找并下载当日最新的daily版本,用一个5行4列的表格更新下载状态done, bat脚本的运行时间由windows去定时运行

#!/usr/bin/python
# -*- coding:utf-8 -*-

import os, sys, io, webbrowser, time, selenium, xlrd, numpy, urllib.request, urllib.error, re, requests, document

from urllib.parse import quote

from selenium import webdriver

import selenium.webdriver.support.ui as ui

from openpyxl import load_workbook

from bs4 import BeautifulSoup

#from lxml import html  # 把lxml是解析xml语言的库
#etree = html.etree

sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf8') #改变标准输出的默认编码

f = open('D:\\ver_pac_download\\result.txt', 'a') #打印信息存储
sys.stdout = f

nowtime = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())) #时间戳获取

#功能函数

def open_chrome():
    #初始化浏览器
    options = webdriver.ChromeOptions()
    #屏蔽显示ERROR:device_event_log_impl.cc 接管浏览器
    options.add_experimental_option("excludeSwitches",["enable-logging"])
    #打开浏览器
    driver = webdriver.Chrome(options=options)
    return driver

def open_url(url, driver):
    #打开url
    driver.get(url)
    req = urllib.request.Request(url)
    webpage = urllib.request.urlopen(req)
    html = webpage.read()
    return html
    #html=urllib.request.urlopen(url).read()
    #html = requests.get(url)


def get_first_tag_fun(html):
    #解析url
    soup = BeautifulSoup(html, 'html.parser', from_encoding='utf-8')
    #从html的源码中获取第一个构建节点
    flag = soup.find(attrs={"update-parent-class":".build-row"})
    #保存到txt文档中
    #fn = open('D:tag.txt', 'w+', encoding='utf-8')
    for i in flag:
        i = str(i)
        #fn.write(i)
        str1 = i
    print(str1, flush=True)
    print(nowtime)
    #从提取到的字符中去掉节点的#和空格,供url的拼接使用
    data = str1.strip('#').strip()
    print(data, flush=True)
    print(nowtime)
    return data

def get_daily_build():
    str1 = "daily build"
    #判断打开的这个节点是否是daily build的
    if str1 in driver.page_source:
        return True
    else:
        return False

def open_daily_build(url, data, driver):
    url = url + str(data) #获取当前节点的url
    open_url(url, driver) #打开当前节点的url
    while True:
        flag = get_daily_build() #查找是否是daily build节点
        #找到是daily build就执行下一个while去找版本,不是就从上一次构建找daily buld,直到找到
        if flag:#是daily build就退出此循环,进入下个循环判断是否有Build Artifacts,表示构建完成
            #获取当前页面的链接
            url = driver.current_url
            print("daily build node be found", flush=True)
            print(nowtime)
            return url
        else:#不是daily build节点,就看上次构建是不是
            wait = ui.WebDriverWait(driver,10) #10秒内每隔500毫秒扫描1次页面变化,当出现指定的元素后结束
            linkElem = wait.until(lambda driver:driver.find_element_by_link_text("上次构建"))
            linkElem.click()
            print("daily build node be not found", flush=True)
            print(nowtime)
            time.sleep(1)
            continue
        return url

def down_func(driver):
    '''
    while True:
        #找到daily build之后点击Build Artifacts进去,如果还没有构建出来,就找上次有Build Artifacts的
        try:#判断daily build的节点是否构建出来
            wait = ui.WebDriverWait(driver,10)
            linkElem = wait.until(lambda driver:driver.find_element_by_link_text("Build Artifacts"))
            print("this node is build ok", flush=True)
            print(nowtime)
            break
        except:#没有构建出来,就找上个构建是否构建出来
            wait = ui.WebDriverWait(driver,10)
            linkElem = wait.until(lambda driver:driver.find_element_by_link_text("上次构建"))
            count = count + 1 #计数从daily build开始向前找了几个节点
            linkElem.click()
            print("this node is not build ok", flush=True)
            print(nowtime)
            time.sleep(1)
            continue
        #从有Build Artifacts的节点处,再往前走回去找daily build的Images_FullCode
    '''
    time.sleep(1)
    wait = ui.WebDriverWait(driver,10)
    linkElem = wait.until(lambda driver:driver.find_element_by_link_text("Images_FullCode"))
    linkElem.click()
    read_pac_inf(driver)

#表格信息读取,获取下载信息
def read_pac_inf(driver):
    #打开version_config.xlsx
    try:
        #打开version_config.xlsx
        wb = load_workbook('D:\\ver_pac_download\\version_config.xlsx')
        # 获取当前所有的sheet
        sheets = wb.worksheets
        print(sheets, flush=True)
        print(nowtime)
    except:
        print("There is no excel name version_config.xlsx\n Please cheek", flush=True)
        print(nowtime)
    # 获取第一张sheet
    sheet1 = sheets[0]
    # sheet1 = wb['Sheet']  # 也可以通过已知表名获取sheet
    print(sheet1, flush=True)
    print(nowtime)
    sheet1 = wb.active
    row = 14
    for i in range(2, row):
        downflag = sheet1.cell(i, 5).value
        if (sys.argv[1] == downflag): #表格下载参数
            data = sheet1.cell(i,2).value #版本形态
            if data is None:
                print("this pac is not ok", flush=True)
                print(nowtime)
                continue
            flag = sheet1.cell(i,4).value #版本是否下载标志
            if flag is not None:
                print("this pac is download yet \n", flush=True)
                print(nowtime)
                continue
            #wait = ui.WebDriverWait(driver,10)
            #linkElem = wait.until(lambda driver:driver.find_element_by_link_text(data))
            time.sleep(1)
            linkElem = driver.find_element_by_link_text(data)
            print(linkElem, flush=True)
            print(nowtime)
            linkElem.click()
            time.sleep(1)
            data = sheet1.cell(i,3).value #PAC包
            wait = ui.WebDriverWait(driver,10)
            linkElem = wait.until(lambda driver:driver.find_element_by_link_text(data))
            print(linkElem, flush=True)
            print(nowtime)
            linkElem.click()
            time.sleep(3)
            try:
                sheet1.cell(row = i, column = 4).value = 'done'
                wb.save('D:\\ver_pac_download\\version_config.xlsx')
                print("save is ok", flush=True)
                print(nowtime)
            except:
                print("save is failed", flush=True)
                print(nowtime)
            time.sleep(3)
            driver.back()
            time.sleep(1)

# This is main function;
if __name__=="__main__":
    url = "http://pubbuild.unisoc.com:8080/jenkins/job/sprdroid12_trunk/"
    driver = open_chrome() #打开浏览器
    html = open_url(url, driver) #解析url
    data = get_first_tag_fun(html) #获取构建节点
    url = open_daily_build(url, data, driver)
    str1 = "/artifact/"
    url = url + str1#拼接url
    open_url(url, driver) #打开最新节点url
    #down_func(url, data, driver) #下载版本
    down_func(driver) #下载版本
    print("+++++++++++++++++++++++++分割+++++++++++++++++++++++++++++++++++\n\r")
    f.close()
    #time.sleep(1)
    #os.system("taskkill /f /im cmd.exe") # 关闭cmd窗口



## 使用一个bat脚本来运行
@echo off
::choice /t 10 /d y /n >nul
echo satrt run down.py
python D:\ver_pac_download\down.py %*
exit
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值