工作日志:自动查询maven仓库中依赖库的开源协议

发布于 2021-09-02 19:16

    这几天工作中遇到一个需求:

    开发提供项目的pom文件,我们需要提取pom文件中的各种依赖库,然后去maevn仓库,搜索,记录其开源协议。

    pom文件,一个父,多个子,子pom中,有的依赖库在当前文件,有的则在父pom中。

    

    pom文件内容,随便查看一个,我们需要获取  <dependency>标签中的内容。

解决方案:

1、手工点点点(作为励志成长为测试开发的测试人员,这是不能容忍的,实在代码搞不懂也不是不行)

2、代码读取pom文件,提取记录groupId,artifactId,然后还有版本信息;抓包maevn仓库查询接口,开发代码循环请求搜索,根据返回结果,提取开源协议字段

实际进行遇到的问题和解决方案:

1、pom文件内容提取,我开始用的python代码。会出现的问题:artifactId,artifactId并不是完全一一成对的,就不好去写入同一条数据中;还有一些屏蔽的引用,因为也有这两个标签,也会被统计到。后来同事找到了java有个处理pom的库,会根据dependency标签获取内容,这个标签下面就是这两个id和版本了。然后同事协助处理成了多个excel文档,每个子pom对应一个。

import  xml.dom.minidom#打开xml文档dom = xml.dom.minidom.parse('E:\pom-task.xml')#得到文档元素对象root = dom.documentElement#获得标签对之间的数据artifactId = root.getElementsByTagName('artifactId')groupId = root.getElementsByTagName('groupId')# 打印所有artifactId标签的内容for index,i in enumerate(artifactId):    #有些标签内容不符合,需要剔除    if 'se' not in i.firstChild.data and 'low' not in i.firstChild.data  and 'maven' not in i.firstChild.data :        print(i.firstChild.data)

2、自动生成的文档很多,而且有的文档里面内容是空的,我想把它们合并在一起,于是百度了一段成熟的代码。这里会踩坑,pandas 自动安装的话,会安装最新的版本,但是,新版本有一些问题,这里使用1.1.5,运行的时候还会报一些错误,把错误信息百度一下就行,就是安装一些库什么的。

import pandas as pdimport os#文件路径file_dir = r'E:\Pychavn\pom_excel'#构建新的表格名称new_filename = file_dir + '\\new_file.xls'#找到文件路径下的所有表格名称,返回列表file_list = os.listdir(file_dir)new_list = []for file in file_list:    #重构文件路径    file_path = os.path.join(file_dir,file)    #将excel转换成DataFrame    dataframe = pd.read_excel(file_path)    #保存到新列表中    new_list.append(dataframe)#多个DataFrame合并为一个df = pd.concat(new_list)#写入到一个新excel表中df.to_excel(new_filename,index=False)

    处理好的表,大概就是这个样子。

3、依赖库两个id和版本信息都拿到了,最后自动请求maven搜索。这里遇到了postman请求可以成功,代码403的情况,添加证书啊,忽略证书,添加各种请求头,最终无果。开始尝试第二种方案,selenium,简单的编写代码后,发现只有第一次搜索会成功,第二次就人机验证了,防爬真牛逼。我觉得我还能抢救一下,于是让selenium调用自己本地已经打开的浏览器,终于成功了。

    首先是数据获取部分,我把之前接口测试的代码改了改。

from aip_demo.my_log import MyLogimport timefrom aip_demo.project_path import test_case_pathlogger=MyLog()class MyExcel:    """    初始化传入文件名和表单名    """    def __init__(self,file_name,sheet_name):        self.file_name=file_name        self.sheet_name=sheet_name    def get_data(self):#获取测试数据        wb=load_workbook(self.file_name)#打开工作簿        sheet=wb[self.sheet_name]#测试用例的表单        test_data=[]        for i in range(2,sheet.max_row+1):#sheet.max_row    sheet.max_column获取表单最大行   列            sub_data = {}            sub_data['id']=sheet.cell(i,1).value#序号            sub_data['name'] = sheet.cell(i, 2).value            sub_data['groupId'] = sheet.cell(i, 3).value            sub_data['artifactId'] = sheet.cell(i, 4).value            sub_data['version'] = sheet.cell(i, 5).value            test_data.append(sub_data)        return test_data    def write_back(self,row,lis,):#写回数据到Excel        wb=load_workbook(self.file_name)        sheet=wb[self.sheet_name]        logger.info("正在写入序号:{}的开源协议{}".format(row-1,lis))        sheet.cell(row,6).value=lis        wb.save(self.file_name)

    然后,构造了一下数据,因为请求的时候是拼接两个id和版本号进行的,最终我把构造好的url放在了一个列表中。

datas = MyExcel('E:\Pycan.xlsx','Sheet1').get_data()print(datas)list1 =[]for i in datas:    a=''    groupId = i['groupId']    artifactId=i['artifactId']    version=i['version']    url = "https://mvnrepository.com/artifact/"    a=url+str(groupId)+'/'+str(artifactId)+'/'+str(version)    list1.append(a)print(list1)

    最后就是selenium循环请求和写入数据了。对了运行代码之前,需要先用命令打开浏览器。

from selenium import webdriveroptions = webdriver.ChromeOptions()options.debugger_address = "127.0.0.1:9222"driver = webdriver.Chrome(options=options)for index ,j in enumerate(list1):    driver.get(j)    # 获取开源协议元素    ele = driver.find_element_by_xpath('//span[@class="b lic"]')    lis = ele.text #获取元素的问题    MyExcel('E:\PycharmPan.xlsx', 'Sheet1').write_back(index+2, lis)    time.sleep(1)

    最后运行代码,可以看开源协议都写进去了。

本文来自网络或网友投稿,如有侵犯您的权益,请发邮件至:aisoutu@outlook.com 我们将第一时间删除。

相关素材