在之前的项目中,我们完成了UP主全数据爬取、基础数据分析、UP主选题分析、受众播赞比分析、视频封面画像拼图展示等。
alt text
alt text
alt text

相较于市面上的成熟商用网站,目前还欠缺一个重要功能,就是记录并分析UP主的粉丝增量数据。
有了这个数据,就可以更好的分析热点话题,新视频受众认可度等。对UP主的选题提供清晰的思路。

由于粉丝增量数据是一个长周期的动态数据。不可能通过一个爬虫获取。
故需要将爬虫脚本放在服务器上,进行定时的爬取UP主粉丝数据,
从而分析一个周期内UP主的粉丝增量情况。

同时我们需要使用数据库存储每次获取到的数据。

本次我们使用sqlite 轻量化数据库

Sqlite数据库

SQLite和MySQL是两种广泛使用的数据库管理系统,但它们在设计、用途和功能方面有显著的不同。以下是SQLite和MySQL之间的一些主要对比:

  1. 架构:

    • SQLite: 轻量级,文件系统基础,通常存储在单一文件中。
    • MySQL: 完整的数据库服务器,需要服务器进程和客户端库。
  2. 用途:

    • SQLite: 适合小型应用、移动应用、桌面应用、原型开发。
    • MySQL: 适合大型应用、企业级应用、需要高并发和多用户支持的场景。
  3. 性能:

    • SQLite: 在低到中等负载下表现良好,但不适合高并发环境。
    • MySQL: 优化的查询处理和缓存机制,适合处理大规模数据和高并发请求。

简而言之,SQLite是一个简单、轻量级的嵌入式数据库,适合轻量级应用;而MySQL是一个功能强大的数据库服务器,适合需要复杂查询、高并发和可扩展性的应用。

连接ubuntu 服务器

安装

sudo apt  install sqlite3 libsqlite3-dev

创建数据库文件

sqlite3 mydatabase.db

这将创建一个名为mydatabase.db的文件,并打开一个SQLite会话。

创建表,表结构为,序号、日期、粉丝数量。
表名称为UP主名称,以下以小约翰可汗为例:

CREATE TABLE xiaoyuehan (
    id INTEGER PRIMARY KEY,
    date DATE,
    followers_count INTEGER
);

完成后测试加入数据:

INSERT INTO xiaoyuehan (date, followers_count) VALUES (DATE('now'), 30);

测试查询:

select * from xiaoyuehan;

推出

.exit

Ubuntu搭建python 运行环境

在Ubuntu上搭建Python运行环境,你可以遵循以下步骤:

1. 安装Python

sudo apt install python3 python3-pip

2. 验证安装

安装完成后,检查Python版本:

python3 --version

3. 安装Python包

使用pip安装所需的Python包。例如,安装 xxxxxx库:

pip3 install xxxxxxxxxxxxxxxx

编写代码获取UP主每日的粉丝数量

引入库

由于本次不需要使用到浏览器,故使用SessionPage即可

from DrissionPage import SessionPage
import json

构建请求对象,并请求链接

page = SessionPage()
page.get("https://api.bilibili.com/x/relation/stat?vmid=2435767")

解析结果

tmp=page.html
UP_json=json.loads(tmp)
print(UP_json)

alt text

获取粉丝数量

follower=UP_json['data']['follower']

将粉丝数存储入sqlite

注意!!!
windows上面未安装sqlite,执行会报错,故需要在ubuntu上进行执行。

import sqlite3
conn = sqlite3.connect('mydatabase.db')
cursor = conn.cursor()

# 插入数据
sql_str="INSERT INTO xiaoyuehan (date, followers_count) VALUES (datetime('now'), "+str(follower)+")"
print(sql_str)
cursor.execute(sql_str)

# 提交事务
conn.commit()

# 关闭连接
cursor.close()
conn.close()

print("数据已存储到SQLite数据库中")

查看数据库结果

xiandai@xiandai-pc:~$ sqlite3 mydatabase.db 
SQLite version 3.31.1 2020-01-27 19:55:54
Enter ".help" for usage hints.
sqlite> select * from xiaoyuehan;
1|2024-06-02 13:19:57|1582289
2|2024-06-02 13:20:01|1582289
sqlite> .exit
xiandai@xiandai-pc:~$

通过计划任务定时执行python脚本

在Ubuntu上,你可以使用 cron来设置计划任务,以定时执行Python脚本。以下是设置步骤:

1. 打开终端

2. 编辑当前用户的cron任务列表

crontab -e

3. 添加cron任务

在打开的cron任务列表中,添加一行来定义你的任务。cron的基本格式如下:

分钟 小时 日期 月份 星期 命令

例如,如果你希望每天早上8点运行脚本,可以添加如下行:

0 8 * * * python3 /home/xiandai/爬取粉丝数.py

其中的* 表示任意

4. 保存并关闭编辑器

保存更改后,cron会自动安装新的cron任务。

5. 检查cron服务状态

确保cron服务正在运行:

sudo systemctl  restart cron
sudo systemctl  status cron

cron 举例并辨析

  1. 每小时执行一次

    0 * * * * python3 /home/xiandai/crawl_fans_count.py
    
  2. 每天午夜(00:00)执行

    0 0 * * * python3 /home/xiandai/crawl_fans_count.py
    
  3. 每个工作日(周一到周五)的上午9点和下午5点

    0 9,17 * * 1-5 python3 /home/xiandai/crawl_fans_count.py
    
  4. 每个星期六和星期日的午夜

    0 0 * * 6,0 python3 /home/xiandai/crawl_fans_count.py
    
  5. 每周一上午8点,周三中午12点,周五下午3点

    0 8 * * 1 python3 /home/xiandai/crawl_fans_count.py
    0 12 * * 3 python3 /home/xiandai/crawl_fans_count.py
    0 15 * * 5 python3 /home/xiandai/crawl_fans_count.py
    
  6. 每15分钟执行一次

    */15 * * * * python3 /home/xiandai/crawl_fans_count.py
    

请注意,cron表达式的格式非常重要,错误的时间设置可能导致任务不按预期执行。另外,确保脚本路径和Python解释器路径是正确的,并且Python脚本具有执行权限。

程序存在的问题

运行后发现,存储到sqlite中的时间不对。

核对后发现,比真实时间早了8小时,是时区错误。中国使用的UTC+8时区。

故代码需要进行修改

from datetime import datetime, timedelta
# ....
# 获取当前UTC时间并转换为UTC+8时区
utc_now = datetime.utcnow()
utc_plus_8 = utc_now + timedelta(hours=8)
formatted_time = utc_plus_8.strftime('%Y-%m-%d %H:%M:%S')

# ....
# 插入数据
sql_str = f"INSERT INTO xiaoyuehan (date, followers_count) VALUES ('{formatted_time}', {follower})"

调整后时间应该是正确的