python版本:python3.9.7
开发环境:Anaconda + pycharm
相关库:
请求地址:https://blog.csdn.net/你的用户名/article/list/
用BeautifulSoup解析返回的html,检索id=“fanBox”,得到粉丝总数
访问地址:https://blog.csdn.net/你的用户名?type=sub&subType=fans
粉丝信息API:https://blog.csdn.net/community/home-api/v2/get-fans-list?page=页数&pageSize=20&id=上一页最后一个粉丝的id&noMore=false&blogUsername=你的用户名
需要注意的就是id这个参数第一次传0,后面改为上一页的最后一个粉丝的id
sqlite数据库构建 CREATE TABLE IF NOT EXISTS user(username TEXT, nickname TEXT, id TEXT PRIMARY KEY)
# -*- coding: utf-8 -*- import json import time import urllib.request import urllib.parse import sqlite3 from bs4 import BeautifulSoup # https://blog.csdn.net/你的用户名?type=sub&subType=fans # 获取抽奖类型 blogUsername = input("请输入你的博客名(个人主页链接后的字符串):") referer = "https://blog.csdn.net/" + blogUsername + "?type=sub&subType=fans" # 请求头 headers1 = { 'Accept': 'application/json, text/plain, */*', 'Accept-Encoding': 'gzip, deflate, br', 'Accept-Language': 'zh-CN,zh;q=0.9', 'Connection': 'keep-alive', 'Content-Type': 'text/plain;charset=UTF-8', 'Referer': referer, # 'origin': 'https://blog.csdn.net', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3875.400 QQBrowser/10.8.4492.400' } # 配置数据库 def config_db(): global con, cur con = sqlite3.connect("fans_data.db") cur = con.cursor() # 创建表user sql = "CREATE TABLE IF NOT EXISTS user(username TEXT, nickname TEXT, id TEXT PRIMARY KEY)" cur.execute(sql) # 清空表数据 sql = "delete from user" cur.execute(sql) # 获取粉丝列表 def get_fans_list(page, last_id): # 根据API,传入对应参数 payload = {'page': page, 'pageSize': '20', 'id': last_id, 'noMore': 'false', 'blogUsername': blogUsername} data = urllib.parse.urlencode(payload) # https://blog.csdn.net/community/home-api/v2/get-fans-list?page=0&pageSize=20&id=上一页最后一个粉丝的ID&noMore=false&blogUsername=你的用户名 _url = urllib.request.Request('https://blog.csdn.net/community/home-api/v2/get-fans-list?%s' % data, headers=headers1) response = urllib.request.urlopen(_url, None, 10) ret = response.read().decode() # print(ret) json1 = json.loads(ret) # 返回code 和 最后一位粉丝的id return_data = {'code': json1["code"], 'id': 0} if json1["code"] == 200: for i in range(len(json1["data"]["list"])): temp_username = json1["data"]["list"][i]["username"] temp_nickname = json1["data"]["list"][i]["nickname"] temp_id = json1["data"]["list"][i]["id"] return_data["id"] = temp_id # 数据插入数据库 sql = "replace into user(username, nickname, id) values (?, ?, ?)" cur.execute(sql, (temp_username, temp_nickname, temp_id)) con.commit() else: print('获取失败,code:' + str(json1["code"])) return return_data # 获取用户粉丝数,调用粉丝信息获取 def get_user_info(): print("开始获取粉丝数...") # 请求文章页面 获取粉丝数 req = urllib.request.urlopen('https://blog.csdn.net/' + blogUsername + '/article/list/') ret = req.read().decode() # print(ret) # 创建 beautifulsoup 对象 soup = BeautifulSoup(ret, features='html.parser') # print(soup.select('#fanBox')) # 根据id定位到粉丝数所在标签 fans_num = soup.select('#fanBox')[0]['title'] print('粉丝数:' + fans_num) # 记录上一页最后一个粉丝的id last_id = 0 # 根据粉丝数转页数进行循环 for i in range(int((int(fans_num) - 1) / 20) + 1): print('开始获取第' + str(i + 1) + '页粉丝信息(20/页)...') return_data = get_fans_list(i, last_id) last_id = return_data["id"] time.sleep(0.5) # 配置数据库 config_db() # 获取用户粉丝数,调用粉丝信息获取 get_user_info() # 关闭游标 cur.close() # 断开数据库连接 con.close() print("\n程序运行完毕!")