ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python 爬取 CSDN 用户粉丝总数、粉丝用户名、昵称和粉丝ID

2021-12-25 09:02:01  阅读:155  来源: 互联网

标签:blog 粉丝 python list 爬取 fans data id


前言

python版本:python3.9.7
开发环境:Anaconda + pycharm
相关库:
在这里插入图片描述

实现逻辑讲解

1、获取总粉丝数

请求地址:https://blog.csdn.net/你的用户名/article/list/
用BeautifulSoup解析返回的html,检索id=“fanBox”,得到粉丝总数
在这里插入图片描述

2、找到粉丝信息API

访问地址: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
在这里插入图片描述

3、解析返回的json串,存入数据库

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程序运行完毕!")

标签:blog,粉丝,python,list,爬取,fans,data,id
来源: https://blog.csdn.net/Ikaros_521/article/details/121906468

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有