如何爬取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開始作一個小的工具(都不算項目)。整個過程雖然說小困難不斷,可是基本都能找到問題所在,網上找到解決方法。其實沒想象的難的,只要拆分紅一部分一部分而後開始動手就好。雖然說以前學得部分實在生疏,但作這個確實熟練了不少,就好像之前學習的時候,看着老師講都懂,可是本身實際作題就懵了。多練就好!而後建議你們也在學習的過程當中不斷的找一些對本身能用上的小項目去作,會有成就感的!

相關文章
相關標籤/搜索