如何爬取gerrit

原由

主要是公司想要规范化工程师的提交信息,虽然说不是我来弄,可是我想试试用以前学的爬虫来尝试抓取,而且能够初步的数据处理分析,而后可视化。正好一整套的流程走一遍。说干就干,打开网页,F12。 发现数据在表格里。抓呗! git

可是发现抓出来的数据长的乱七八糟,最关键的是并无这个table。因此就猜测,应该是动态加载的,转到network,xhr。 github

再刷新下页面,发现数据都在这个接口里嘛,这就简单了! 正则表达式

设计流程:获取数据,处理数据,可视化。

第一步:先获取数据,存到表格里。

必定要记得cookie啊,血的教训,我折腾了很久,获得的都是几个字符,后来才醒悟过来。json

def requesst(url,limit_time):
    continue_flag = 1
    # while(url):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36',
        'Cookie': 'GerritAccount=aRqdfpU4Oa1tMBZglP3GWlz.y1oY.8am'
    }
    data = requests.get(url, headers=headers).text
    # content = data.text #你要的数据,JSON格式的
    remove = re.compile('\)\]\}\'') #去掉多余的几个垃圾字符 # data = data.replace(')]}\'',"")
    data = re.sub(remove, "", data)
    data_json = json.loads(data)

    with open("gerrit.csv", "a",newline='') as csvfile:
        writer = csv.writer(csvfile)
        for one in data_json:
            one["updated"] = time_format(one["updated"])
            if (time_cmp(one["updated"], limit_time) < 0):
                print("已经发现有超过期间的数据")
                continue_flag = 0
                break
            else:
                writer.writerow([one["project"], one["branch"], one["subject"], one["owner"]["name"], one["updated"]])
                print(one["project"], one["branch"], one["subject"], one["owner"]["name"], one["updated"], one["_sortkey"])
    return continue_flag, DOWNLOAD_URL + "&N=" + data_json[-1]["_sortkey"]
复制代码

continue_flag是为了主程序里超过我限定的时间后就再也不爬取下一页。 gerrit的默认url是下面这个url,而后下一页按钮的url是这个url加上这一页最后一项的_sortkey(形如0049b98c0000f3b8)。因此我要把下一页的url也return出来。bash

DOWNLOAD_URL = 'http://192.168.8.40:8080/changes/?q=status:merged&n=25&O=1'
# DOWNLOAD_URL = 'http://192.168.8.40:8080/changes/?q=status:merged&n=25&O=1&N=0049b98c0000f3b8'
复制代码

嘿嘿,这个是最后的结果,中间编写过程就不放了,总之是不断丰富,不断简化的过程。cookie

第二步:处理数据。

#用正则表达式统计不符合规范的人员及其出现的个数 获得一个DataFrame
def subject_format_count():
    nonstandard_count={}
    #newline=' '能够防止两行之间出现空行
    with open(r"gerrit.csv",newline='') as csvfile:
        readCSV = csv.reader(csvfile, delimiter=',')
        for row in readCSV:
            matchObj = re.match(r"^TFS_\d+:" + row[3] + "_\D+\w+:.+", row[2])
            if matchObj:
                pass
            else:
                if row[3] in nonstandard_count:
                    nonstandard_count[row[3]] += 1
                else:
                    nonstandard_count[row[3]] = 1
    #去掉统进来的标签
    nonstandard_count.pop('owner')
    #按出现次数递减排序
    sort_nonstandard_count = sorted(nonstandard_count.items(), key=lambda v: v[1], reverse=True)
    #这地方的设置能够先查看sort_nonstandard_count 而后看看具体要的是哪一个值 根据这里再写可视化
    df = pandas.DataFrame(sort_nonstandard_count, index=[item[0] for item in sort_nonstandard_count])
    return df
复制代码

正则表达式能够度娘在线正则表达式测试找到最合适的正则。若是符合正则表达式则不处理,若是不符合,则将其存到nonstandard_count而且值+1。而后获得的nonstandard_count按照值排序,大的在前面。返回一个DataFrame,方便后续处理。app

第三步:可视化

##可视化处理###############
def view_format_count(df):
    # x为横坐标刻度
    x = np.arange(len(df.index))
    # 设置y轴的数值,取df的1列,0列为横坐标
    y = np.array(df[1])
    # 设置x横坐标显示为0列的名字
    xticks1 = np.array(df[0])
    # 设置横坐标格式 倾斜30°
    plt.xticks(x, xticks1, size='small', rotation=30)
    # 画出柱状图 appha为透明度
    plt.bar(x, y, width=0.35, align='center', color='c', alpha=0.8)
    # 在柱形图上方显示y值 zip(x,y)获得的是tuple列表 即各列顶点的坐标
    # 而后再各列的顶点上方0.05设置一个文本 ha水平对齐left,right,center va垂直对齐 'center' , 'top' , 'bottom' ,'baseline'
    for a, b in zip(x,y):
        plt.text(a, b + 0.05, '%.0f' %b, ha='center', va='bottom', fontsize=11)
    plt.show()
复制代码

注释很详细了,就是画出df,而后在柱形图上加上这个值的text。ide

第四步 main

def main():
    limit_time = input("请输入截止时间 格式:20171211000000\n")
    url = DOWNLOAD_URL
    continue_flag = 1
    #写标题
    with open("gerrit.csv", "w",newline='') as csvfile:
        writer = csv.writer(csvfile)
        writer.writerow(["project", "branch", "subject", "owner", "updated"])
	#循环爬下一页
    while (continue_flag):
        continue_flag, url = requesst(url,limit_time)
    #处理数据并可视化
    view_format_count(subject_format_count())
复制代码

这个只是串起来了。关键的代码基本都贴出来了,其余的几个稍微处理数据的,没有贴出,能够访问我github查看。工具

github学习

这个直接爬是没用的哈,我是内网。

结果

额,我升级PyCharm前还好好的啊。升级完咋就这样了呢......我后面再琢磨琢磨。

##总结一下 总的来讲收获很大,本身实打实的从0开始作一个小的工具(都不算项目)。整个过程虽然说小困难不断,可是基本都能找到问题所在,网上找到解决方法。其实没想象的难的,只要拆分红一部分一部分而后开始动手就好。虽然说以前学得部分实在生疏,但作这个确实熟练了不少,就好像之前学习的时候,看着老师讲都懂,可是本身实际作题就懵了。多练就好!而后建议你们也在学习的过程当中不断的找一些对本身能用上的小项目去作,会有成就感的!

相关文章
相关标签/搜索