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,等待运行完毕,我们就可以查看 成果 了!

 不好意思,老板再来一斤花生米!【下面才是成果】(其实上面也是)

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