工作日志:自动查询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 pd
import 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 MyLog
import time
from aip_demo.project_path import test_case_path
logger=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 webdriver
options = 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 我们将第一时间删除。
相关素材