Bilibili到底有多少御阪妹?(二)

目錄

1、構造header

2、代碼走起 


1、構造header

爲了要模仿瀏覽器操作,所以我們要僞造一下header(爲防止惡意操作,這裏不分享構造方法)

根據開發者工具裏的信息,我們發現是GET請求, parameter部分我們只留下四個有用的(附帶一個jsonp=>返回值是json)

                                 

2、代碼走起 

 代碼的詳細註釋已經在下方展示了,再此就不再贅述了。

header = {
    .............................
}

def search(par):
    return requests.get("https://api.bilibili.com/x/web-interface/search/type", params=par, headers=header).json()

def collect():
    # 連接數據路
    db = pymysql.connect(host="127.0.0.1", user="root", passwd="*****", db="sisters", charset='utf8')
    cursor = db.cursor()

    # 新建一個文本文檔用於輸出重複的結果
    err_text = open("error.txt", "a+")

    # 構造返回值中有用的用戶信息的"鍵(Key)"
    construct_sis = ["mid", "uname", "upic", "usign", "level", "gender", "fans", "videos", "is_upuser"]

    # Get請求時傳遞的參數
    query = {
        "search_type": "bili_user",
        "keyword": "",
        "page": 1,
        "jsonp": "jsonp",
    }

    # for循環進行爬取數據(0號 到 20001號 -> Last order)
    for cnt in range(0, 20002):
        print("Searching ", cnt)
        # 根據循環次數來更新本次搜索的是御阪xx號
        query["keyword"] = "御阪" + str(cnt)
        # 先進行一次接口訪問,獲取結果的總頁數用於第二層for循環
        # (原因是返回的數據是分頁的,要二次循環來獲取對於一個關鍵字的所有搜索結果)
        total_pages = search(query)["data"]["numPages"]

        # 從1到總頁數進行二層循環
        for i in range(1, total_pages + 1):
            # 更新本次查詢的頁數
            query["page"] = i
            # 獲取本次(本關鍵字、本頁)的搜索結果
            response = search(query)["data"]
            # 取出所有用戶信息
            sisters = response["result"]
            # 構造 value 執行mysql語句,將信息存入數據庫
            for sis in sisters:
                value = []
                # construct_sis中是所有我們需要的鍵,用於獲取對應的值添加進value
                for item in construct_sis:
                    value.append(sis[item])
                # MySQL添加語句
                sql = "INSERT INTO sisters.network(mid, name, pic, sign, ulevel, gender, fans, videos, up) VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s)"
                try:
                    cursor.execute(sql, value)
                except pymysql.err.IntegrityError as err:
                    # 如果捕獲到異常,將主鍵重複信息輸出到文本文檔中
                    err_text.write(str(sis["mid"]) + "  " + sis["uname"] + " --- Already existed." + "\n")
                # 提交數據庫更新
                db.commit()
    # 關閉數據庫連接
    db.close()

OK,等待運行完畢,我們就可以查看 成果 了!

 不好意思,老闆再來一斤花生米!【下面纔是成果】(其實上面也是)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章