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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值