python获取抖音号发布数据

抖音视频数据获取流程如下

每个抖音账号都有自己的主页地址,且这个地址不用登录。

人民日报的抖音账号主页地址如下

https://www.douyin.com/user/MS4wLjABAAAA8U_l6rBzmy7bcy6xOJel4v0RzoR_wfAubGPeJimN__4

但是在视频列表地址加载的时候会有随机且唯一的key跟在url后面,浏览器F12和postApi都不好使。

只有使用selenium通过chromedriver直接打开浏览器操作了

python 复制代码
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
from selenium.webdriver import ActionChains
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from datetime import datetime
import logging
import json
import pymysql

# 创建一个logger
logger = logging.getLogger('my_logger')
logger.setLevel(logging.DEBUG)  # 设置日志级别

# 创建一个handler,用于写入日志文件
fh = logging.FileHandler('dy.log', encoding='utf-8')  # 日志文件名

# 定义handler的输出格式
formatter = logging.Formatter(
    '%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter)

# 给logger添加handler
logger.addHandler(fh)

chrome_option = Options()

chrome_option.add_argument("--headless")#无头模式不打开Chrome浏览器
chrome_option.set_capability("goog:loggingPrefs", {"performance": "ALL"})

driver = webdriver.Chrome(options=chrome_option)

#!!!数据库链接需要调整
mydatabase = pymysql.connect(host='localhost',
                             user='root',
                             password='123456',
                             database='ry',
                             charset='utf8mb4')
cursor = mydatabase.cursor()

cursor.execute(
    'SELECT id,base_media_name,dy_url FROM `media_account_manager2` where `type_id` = 483 AND `status` = 3 and dy_url is not null LIMIT 3'
)
result = cursor.fetchall()
try:
    for row in result:
        m_id = row[0]
        dy_name = row[1]
        dy_url = row[2]
        print('***************************************')
        driver.get(dy_url)  #抖音用户
        time.sleep(15)
        logs = driver.get_log("performance")
        for item in logs:
            StrMsg = item['message']
            data = json.loads(StrMsg)
            method = data['message']['method']
            if method == 'Network.responseReceived':
                tokenUrl = data['message']['params']['response']['url']
                if 'post' in tokenUrl:
                    request_id = data['message']['params']['requestId']
                    print(request_id)
                    response = driver.execute_cdp_cmd('Network.getResponseBody',{'requestId': request_id})
                    if response['body']:
                        json_data = json.loads(response['body'])
                        jsonList = json_data['aweme_list']
                        for jsonObj in jsonList:
                            create_time = jsonObj['create_time']
                            dt_object = datetime.fromtimestamp(create_time)
                            # 将datetime对象格式化为YYYYMMDD格式
                            formatted_date = dt_object.strftime('%Y-%m-%d')
                            create_time_str = dt_object.strftime("%Y-%m-%d %H:%M:%S")
                            print('***************************************')
                            print(jsonObj['desc'])
                            print(formatted_date)
                            title = jsonObj['desc']
                            link = jsonObj['share_info']['share_url']
                            text = ''

                            now = datetime.now()
                            now_formatted_date = now.strftime("%Y-%m-%d")

                            if formatted_date == now_formatted_date:
                                #print(jsonObj)
                                print('数据库插入操作**********************************')
                                print(jsonObj['desc'])
                                logger.info(jsonObj['desc'])#标题
                                logger.info(formatted_date)#创建时间
                                logger.info(jsonObj['share_info']['share_url'])#视频地址share_url
                                # insert_query = "INSERT INTO `ry`.`media_content`(`title`, `pub_date`, `url`, `content`, `media_id`, `media_name`,`type_id`,`platform`) VALUES (%s,%s,%s,%s,%s,%s,%s,%s)"
                                # # 执行插入操作
                                # cursor.execute(
                                #     insert_query,
                                #     (title, create_time_str, link, text, m_id, dy_name, '483', '抖音自动抓取'))
                                # # 提交事务
                                # mydatabase.commit()
except Exception as e:
    logger.info('******抖音获取发生错误********')
    logger.info(e)
    logger.info(json_data)
    logger.info('******抖音账号:' + dy_name + ',数据获取异常******')
else:
    logger.info('******抖音数据结束********')
finally:
    mydatabase.close()
相关推荐
叶 落6 小时前
Mac 通过 Miniconda 安装 Python
python·macos·conda·miniconda
会编程的土豆7 小时前
GoWeb 处理请求详解:请求行、请求头、请求参数与给客户端响应
开发语言·http·golang
就改了12 小时前
Java8 日期处理(详细版)
java·python·算法
威联通安全存储15 小时前
TS-h1887XU-RP在汽车发动机热试与NVH在线质检网中的部署
python·汽车
name好难取诶15 小时前
PHP 静态分析工具实战 PHPStan 和 Psalm 完全指南
android·开发语言·php
湿滑路面16 小时前
Rouyan:使用WPF/C#构建的基于LLM的快捷翻译小工具
开发语言·c#·wpf
qq_3164110316 小时前
腹腔镜模拟手术训练数字化管理平台构建
人工智能·python·深度学习·机器学习
卷无止境17 小时前
PageIndex:把RAG的检索逻辑从"找相似"改成了"讲道理"
后端·python
卷无止境17 小时前
什么是VoxCPM2?一场TTS架构的彻底重构
后端·python
Lee_jerome17 小时前
《C/C++编译全家桶:g++四阶段、.a与.so区别、CMake构建、ARM交叉编译,这篇全讲透了》
c语言·开发语言·arm开发·c++·编译·cmake·cmakelists