首页 > 数据库 >站在巨人的肩膀上开发 — Toutatis 批量获取 Instagram 数据更新数据库

站在巨人的肩膀上开发 — Toutatis 批量获取 Instagram 数据更新数据库

时间:2024-12-23 18:58:14浏览次数:5  
标签:粉丝 Instagram 数据库 Toutatis connection user 博主 print id

对爬虫不是很熟悉,电商平台数据库里沉淀了一批博主的基本信息(包括主页链接) 分别来自Instagram,TikTok和YouTube ,但博主的粉丝量会增长,如何保持博主粉丝的实时更新就是一个问题,TikTok和YouTube 的博主比较好解决,直接访问该博主的主页链接即可获取该博主的粉丝数量,但Instagram比较特殊,最简单的爬虫爬不出来,直到在github上找到了 Toutatis --https://github.com/megadose/toutatis?tab=readme-ov-file

TikTok和YouTube爬粉丝数:

Python 根据TikTok,YouTube 主页链接批量修改粉丝数

一.项目简介

 Toutatis is a tool that allows you to extract information from instagrams accounts such as e-mails, phone numbers and more

 Toutatis 是一款可让您从 Instagram 帐户中提取信息(例如电子邮件、电话号码等)的工具

二.项目部署

项目拉取下来之后

pip install toutatis
python setup.py install

 根据用户名查找信息(其中sessionid一段时间内不会改变,不刷新google即可)

toutatis -u username -s instagramsessionid

 例如:

可以看到,能够爬取到该博主的平台id,简介,粉丝数,email,phone等等

这样在源代码上进行开发即可满足现有的需求

三.站在巨人的肩膀上开发

上代码:
 

import subprocess
import re  # 导入正则表达式模块
from datetime import datetime
import mysql.connector
from mysql.connector import Error

# 数据库配置
DB_CONFIG = {
    "host": "xxxxxx",  # 数据库地址
    "database": "xxxx",  # 数据库名称
    "user": "xxxx",  # 用户名
    "password": "xxxx",  # 密码
    "port": xxxx  # 端口
}


def get_instagram_usernames_to_update(connection):
    """
    从数据库中获取需要更新的 Instagram 博主用户名
    条件:profile_url 包含 %insta%,且 update_time 不在今天
    :param connection: 数据库连接
    :return: Instagram 博主用户名列表
    """
    try:
        cursor = connection.cursor()
        today = datetime.now().strftime('%Y-%m-%d')  # 获取今天的日期
        sql_query = """
        SELECT name FROM kol_base_info
        WHERE profile_url LIKE '%insta%'
        AND (update_time IS NULL OR DATE(update_time) < %s)
        """
        cursor.execute(sql_query, (today,))  # 将日期作为参数传入
        rows = cursor.fetchall()  # 获取所有结果
        return [row[0] for row in rows]  # 提取用户名列表
    except Error as e:
        print(f"查询失败: {e}")
        return []
    finally:
        cursor.close()

def get_user_info(username):
    """
    使用 toutatis 命令获取 Instagram 博主的 userID 和粉丝数
    :param username: Instagram 博主的用户名
    :return: 包含 userID 和粉丝数的字典 (如果能成功获取), 否则返回 None
    """
    try:
        # 构造 toutatis 命令,用户名转换为小写
        command = f"toutatis -u {username.lower()} -s 71337797720%3AjmkMPB6tx25q4P%3A24%3AAYdyyWUVum_W-er6o8RyRL3aw49VDwIqe5i4Swr2RA"

        # 执行命令,指定输出编码为 utf-8
        print(f"正在执行命令: {command}")  # 添加日志输出,方便调试
        result = subprocess.run(command, shell=True, capture_output=True, text=True, encoding='utf-8')

        # 如果命令成功执行
        if result.returncode == 0:
            # 提取 userID
            user_id_match = re.search(r"userID\s*:\s*(\d+)", result.stdout)
            user_id = int(user_id_match.group(1)) if user_id_match else None

            # 提取粉丝数
            follower_match = re.search(r"Follower\s*:\s*(\d+)", result.stdout)
            followers = int(follower_match.group(1)) if follower_match else None

            # 检查是否成功提取到所需数据
            if user_id is not None and followers is not None:
                print(f"获取到 userID: {user_id}, 粉丝数: {followers}")
                return {"userID": user_id, "followers": followers}
            else:
                print(f"未找到 userID 或粉丝数,输出内容为: {result.stdout}")
                return None
        else:
            # 如果命令执行失败,打印错误信息
            print(f"执行 toutatis 命令失败: {result.stderr}")
            return None
    except subprocess.CalledProcessError as e:
        # 处理 subprocess 执行错误
        print(f"命令执行失败: {e}")
        return None
    except Exception as e:
        # 捕获其他类型的错误
        print(f"获取信息失败: {e}")
        return None

def update_follower_count_and_userid(connection, name, fans_num, user_id):
    """
    更新数据库中对应博主的粉丝数和 platform_id(即 userID)
    :param connection: 数据库连接
    :param name: 博主的用户名
    :param fans_num: 博主的粉丝数
    :param user_id: 博主的 userID
    """
    try:
        cursor = connection.cursor()
        sql_update = """
        UPDATE kol_base_info
        SET fans_num = %s, platform_id = %s
        WHERE name = %s
        """
        # 参数与占位符匹配
        cursor.execute(sql_update, (fans_num, user_id, name))
        connection.commit()
        print(f"成功更新博主 {name} 的粉丝数为 {fans_num},platform_id 为 {user_id}")
    except Error as e:
        print(f"更新粉丝数和 platform_id 失败: {e}")
    finally:
        cursor.close()

def main():
    try:
        # 连接数据库
        connection = mysql.connector.connect(**DB_CONFIG)
        if connection.is_connected():
            print("成功连接到数据库")

            # 从数据库获取需要更新的 Instagram 博主用户名
            instagram_usernames = get_instagram_usernames_to_update(connection)
            print(f"找到 {len(instagram_usernames)} 个需要更新的 Instagram 用户名")

            # 遍历所有博主
            for username in instagram_usernames:
                print(f"正在查询 {username} 的信息...")

                # 获取 userID 和粉丝数
                user_info = get_user_info(username)

                # 如果成功获取到信息,则更新数据库
                if user_info:
                    user_id = user_info.get("userID")
                    fans_num = user_info.get("followers")

                    if user_id is not None and fans_num is not None:
                        update_follower_count_and_userid(connection, username, fans_num, user_id)
                    else:
                        print(f"未能获取 {username} 的完整信息:{user_info}")
                else:
                    print(f"未能获取 {username} 的信息,跳过更新。")

    except Error as e:
        print(f"数据库连接失败: {e}")
    finally:
        if 'connection' in locals() and connection.is_connected():
            connection.close()
            print("数据库连接已关闭")


if __name__ == "__main__":
    main()

 回头把这三个代码写到一块,做一个定时任务,就完成啦。

标签:粉丝,Instagram,数据库,Toutatis,connection,user,博主,print,id
From: https://blog.csdn.net/dnuiking/article/details/144668216

相关文章

  • 【java毕设 python毕设 大数据毕设】基于springboot的物业管理系统的设计与实现 【附
    ✍✍计算机毕设编程指导师**⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流!⚡⚡Java、Python、小程序、大数据实战项目集⚡⚡文末获取......
  • ssm基于电子元件仓库管理8jeqj(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、研究背景随着电子产业的快速发展,电子元件的种类和数量日益增多,给仓库管理带来了巨大挑战。传统的人工管理方式存在效率低、易出错等问题,已无法......
  • 基于ssm的学生事务管理系统xyg3q(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、研究背景随着信息化技术的不断发展,传统的学生事务管理方式已经无法满足现代高校的管理需求。为了提高管理效率,降低管理成本,开发一款基于SSM框......
  • mysql的事务控制和数据库的备份和恢复
    事务控制语句行锁和死锁行锁两个客户端同时对同一索引行进行操作客户端1正常运行客户端2想修改,被锁行除非将事务提交才能继续运行死锁客户端1删除第5行客户端2设置第1行为排他锁客户端1删除行1被锁客户端2更新行5被锁如何避免死锁mysql的备份和还原......
  • 数据库
    1、什么是数据库?定义:数据库是存放数据的电子仓库。2、是以某种方式存储百万条,上亿条数据,提供多个用户访问共享。3、每个数据有一个或多个api用于创建,访问,管理和复制所保存的数据。4、系统中很多动态数据都存储在数据库中,需要通过访问数据库才能显示;1、关系型数据库定义:数据......
  • Go语言,查询MySQL数据库
    在Go语言中,查询MySQL数据库的一个常用库是database/sql标准库首先,确保你已经安装了MySQL驱动:goget-ugithub.com/go-sql-driver/mysql示例代码main.gopackagemainimport("database/sql""fmt""log"_"github.com/go-sql-driver/mysql&qu......
  • 数据库系统------连接操作
    什么是连接连接就是把一个或多个来自不同表的元组通过相同的属性字段合并成一个大的元组如上图,把属性ID相同的两个元组(来自不同表)合并成一个大的元组连接属性是否有索引(快速定位),是否有序(是否要全表扫描),还有内存访问和磁盘访问的速度都会影响连接操作的成本theta连接......
  • 【金仓产品知多少】一文带您了解金仓数据库迁移工具KDTS
    产品简介KDTS是一款操作简单、高效稳定的数据库迁移工具,基于智能翻译技术和并行任务调度架构实现数据库对象的智能转换和数据的高效迁移,“一键操作”将各种国内外的数据库对象和数据迁移到KingbaseES数据库,帮助用户轻松完成数据库迁移的工作。产品优势灵活的迁移策略支持......
  • 【金仓产品知多少】一文带您了解金仓数据库开发工具KStudio
    产品简介KStudio是一款功能强大的数据库开发和管理工具,可为数据库开发人员、DBA提供数据库开发、调试、维护等各项功能,完美支持金仓数据库。KStudio在界面及功能设计上,以服务数据库管理全过程为目标,遵循极简主义,力求提供用户极致的使用体验。产品优势多平台支持支持多种C......
  • ssm基于项目驱动的课程管理系统1u51b程序+源码+数据库+调试部署+开发环境
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容项目名称:基于项目驱动的课程管理系统一、项目背景随着教育信息化的不断发展,传统的教学管理模式已难以满足现代教育的需求。课程管理作为教育管理......