从用户页面获取作品列表

2023-11-12

最近web端更新比较频繁,所以搞了很多方案来应对更新问题。

本文内容是其中一种方案,从用户主页的HTML响应内容中抽取user信息和作品列表数据。


下图中出现的内容都是在html名为RENDER_DATA的script标签中,以urlencode编码。

比如昵称、粉丝、获赞、地区、第一页的作品列表等。

在这里插入图片描述

取出来格式化后可转换成Json格式查阅。用户信息在user中,作品列表在data中。
在这里插入图片描述

接下来就是如何获取用户主页HTML文本。


分析测试

根据笔者的分析和测试,目前请求 /user/sec_user_id 需要提前准备好的参数有cookie中的 __ac_nonce、__ac_signature、ttwid。

现在ttwid作为了游客ID,权重甚至超过了校验参数 s_v_web_id。

__ac_nonce和ttwid是服务端返回的,但是如果直接从用户主页去获取ttwid,则需要有 s_v_web_id作为注册前提,所以可以从index页面去注册ttwid。

__ac_signature的生成在之前的文章中有过讲解,《DY__ac_signature》,所以本文不再复述了。


请求流程

直接把流程贴出来吧。__ac_signature的生成可参考之前的文章《DY__ac_signature》

请求这块经常更新,如果更新了大家自己照着官网流程改改。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import json
import re
from urllib import parse
import execjs
import requests
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.ssl_ import create_urllib3_context

class CipherAdapter(HTTPAdapter):
    def init_poolmanager(self, *args, **kwargs):
        context = create_urllib3_context(ciphers='DEFAULT:@SECLEVEL=2')
        kwargs['ssl_context'] = context
        return super(CipherAdapter, self).init_poolmanager(*args, **kwargs)

    def proxy_manager_for(self, *args, **kwargs):
        context = create_urllib3_context(ciphers='DEFAULT:@SECLEVEL=2')
        kwargs['ssl_context'] = context
        return super(CipherAdapter, self).proxy_manager_for(*args, **kwargs)


def get_ac_sign(ac_nonce):
    with open('_ac_signature.js', 'r', encoding='utf-8') as f:
        b = f.read()
    c = execjs.compile(b)
    d = c.call('get_ac_signature',ac_nonce)
    return d


def run(sec_user_id):
    sess = requests.session()
    sess.proxies = proxies

    headers_base = {
        "accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
        "accept-language":"zh-CN,zh;q=0.9",
        "cache-control":"no-cache",
        "pragma":"no-cache",
        "sec-ch-ua":"\"Google Chrome\";v=\"111\", \"Not(A:Brand\";v=\"8\", \"Chromium\";v=\"111\"",
        "sec-ch-ua-mobile":"?0",
        "sec-ch-ua-platform":"\"Windows\"",
        "sec-fetch-dest":"document",
        "sec-fetch-mode":"navigate",
        "sec-fetch-site":"none",
        "sec-fetch-user":"?1",
        "upgrade-insecure-requests":"1",
        "user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36"
    }
    sess.headers = headers_base
    url = 'https://www.douyin.com'
    sess.mount(url, CipherAdapter())
    __ac_nonce = sess.get(url,headers=headers_base).cookies.get('__ac_nonce')

    print(__ac_nonce)

    __ac_signature = get_ac_sign(__ac_nonce)

    headers = {
        'authority': 'www.douyin.com',
        'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
        'accept-language': 'zh-CN,zh;q=0.9,en-XA;q=0.8,en;q=0.7,zh-TW;q=0.6',
        'cache-control': 'max-age=0',
        'dnt': '1',
        'sec-ch-ua': '".Not/A)Brand";v="99", "Google Chrome";v="103", "Chromium";v="103"',
        'sec-ch-ua-mobile': '?0',
        'sec-ch-ua-platform': '"Windows"',
        'cookie': f'douyin.com; __ac_nonce={__ac_nonce}; __ac_signature={__ac_signature}; __ac_referer={url};',
        'sec-fetch-dest': 'document',
        'sec-fetch-mode': 'navigate',
        'referer': f'https://www.douyin.com',
        'sec-fetch-site': 'same-origin',
        'sec-fetch-user': '?1',
        'upgrade-insecure-requests': '1',
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36'
    }
    response = sess.get(url,headers=headers)
    ttwid = response.cookies.get('ttwid')
    print(ttwid)

    headers = {
        'authority': 'www.douyin.com',
        'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
        'accept-language': 'zh-CN,zh;q=0.9,en-XA;q=0.8,en;q=0.7,zh-TW;q=0.6',
        'cache-control': 'max-age=0',
        'dnt': '1',
        'sec-ch-ua': '".Not/A)Brand";v="99", "Google Chrome";v="103", "Chromium";v="103"',
        'sec-ch-ua-mobile': '?0',
        'sec-ch-ua-platform': '"Windows"',
        'cookie': f'douyin.com; __ac_nonce={__ac_nonce}; __ac_signature={__ac_signature}; ttwid={ttwid}; douyin.com; home_can_add_dy_2_desktop=%220%22; strategyABtestKey=%221685349310.836%22; passport_csrf_token=lxisgood7f517e5b9315589c38256f13; passport_csrf_token_default=lxisgood7f517e5b9315589c38256f13; s_v_web_id=verify_lxisgood_tskRru8j_t7Rk_4R4X_84w7_JNOTPvaLip42;',
        'sec-fetch-dest': 'document',
        'sec-fetch-mode': 'navigate',
        'referer': f'https://www.douyin.com',
        'sec-fetch-site': 'same-origin',
        'sec-fetch-user': '?1',
        'upgrade-insecure-requests': '1',
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36'
    }
    user_url = f"https://www.douyin.com/user/MS4wLjABAAAA1_iC_Juo6ByvfBeN75UXmhP9zjqi7wsIchjuzv7tOsc?"
    response = sess.get(user_url, headers=headers)

    doc =re.findall('<script id="RENDER_DATA" type="application/json">(.*?)</script>', response.text, re.S)[0]
    data = json.loads(parse.unquote(doc))
    return data


if __name__ == '__main__':
    proxies= {}
    sec_user_id = "MS4wLjABAAAACV5Em110SiusElwKlIpUd-MRSi8rBYyg0NfpPrqZmykHY8wLPQ8O4pv3wPL6A-oz"
    data = run(sec_user_id)
    print(data)
    # data['*']['user']: IP地址、年龄、粉丝信息等
    # data['*']['post']: 作品列表、bitRateList

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从用户页面获取作品列表 的相关文章

随机推荐

  • 我们用4行代码节省了100万 相见恨晚的PCDN

    我们公司主要做视频在线点播 还有少量视频下载 比较关心网络加速 首先就是价格 其次是首播时间 流畅率这几个核心性能指标 目前使用阿里云PCDN也有几个月了 整体结果是超预期 值得安利的 写这篇文章 希望能通过选型对比 接入过程 效果实现几个
  • torchserve使用-注册模型设置参数(二)

    目录 1 自定义处理程序 2 托管多个模型 3 模型接口 3 1 添加注册新模型 3 2 查看是否注册成功 3 3 查看注册模型基本信息 3 4 设置注册模型参数 3 5 使用以下代码注销模型 3 6 模型版本控制 4 记录和指标 1 自定
  • xxl-job-admin多数据库支持

    记录一下改造过程 针对 xxl job 2 3版本 什么是xxl job 你的系统中有很多定时任务 如果你想统一管理 你需要一个调度系统 XXL JOB是一个分布式任务调度平台 其核心设计目标是开发迅速 学习简单 轻量级 易扩展 githu
  • 机器学习初实践——恶意域名检测

    这次恶意域名检测实践是第一次自己做机器学习而非单纯复现 参考了第一次鸢尾花的代码和GitHub的UrlDetect中的特征提取参数的代码 一 数据处理 首先要实现自动化处理数据 在这里我没有使用urlparser而是直接写脚本提取域名 提取
  • 【南邮操作系统实验】页面置换算法 (FIFO、LRU、OPTP)

    写在前面 操作系统内存管理的页面置换算法 因为懒得看老师给的代码 太长了而且据说好像还有错误 就自己写了一个python版本的 因为比较菜 所以写的一般般 仅供大伙参考一下Orz python版本的 代码如下 import random 生
  • mysql视图基本操作

    mysql视图介绍及如何创建视图请看 一个案例理解mysql视图 本章主要记录视图的修改 删除以及展示视图语法 目录 一 创建视图 二 修改视图 三 删除视图 四 更新视图 五 展示视图 一 创建视图 请看 一个案例理解mysql视图 二
  • Docker 使用网络

    文章目录 外部访问容器 端口绑定 映射所有接口地址 映射到指定地址的指定端口 查看当前端口配置 多个端口绑定 容器互联 配置 DNS 外部访问容器 1 使用 P 标记时 Docker 会随机映射一个 490000 49900 的端口到内部容
  • 应用Cryptopp库实现AES加密【转】

    crypto 自身的wiki上就有一些例子 可以参考 http www cryptopp com wiki Category Sample 本文来源 http ste xidian edu cn bbs a a asp B 5 ID 224
  • DirectX11学习笔记(不定期更新)

    目录 1 DX与HLSL的矩阵 2 创建常量缓冲区的尺寸需要按照16字节对齐 1 DX与HLSL的矩阵 DX的矩阵 DirectX XMMATRIX 按照行主元优先存储 而HLSL的矩阵默认按照列主元优先存储 解决这个问题的方法有两种 1
  • 【STM32 x ESP8266】连接 MQTT 服务器(报文,附部分源码解析)

    MQTT 协议作为物联网非常重要的传输协议 如何使用它十分重要 如果有不理解的同学可以点击这里学习 这里只是简单介绍一下 同时这里附上MQTT 3 1 1协议中文版 pdf 的链接 对协议底层感兴趣的同学可以下载学习一下 同时下面的实现函数
  • Qt Q_UNUSED使用

    以前经常在程序里定义很多局部变量 如果没有使用 Qt Creator就会报 未引用的局部变量 警告 因为不影响程序 一开始也没管 但随着程序代码变多 警告变动还是有点烦 到今天才知道这个Qt的有个消除这个警告的宏 Q UNUSED int
  • Flink系统架构

    Flink 的运行时架构中 最重要的就是两大组件 作业管理器 JobManger 和任务管理器 TaskManager 对于一个提交执行的作业 JobManager 是真正意义上的 管理者 Master 负责管理调度 所以在不考虑高可用的情
  • 如何将java项目部署到Linux服务器上

    博主之前并没有操作过服务器 以及部署项目 记第一次操作心得 仅供参考 在服务器上已经有了mysql的五个rpm安装包 jdk的rpm tomcat的tar gz 博主找了其他的博文说是需要配置java环境但是博主并没有操作到这一步 安装包是
  • ThinkPad开机停留在boot menu界面、进不了系统的解决方法

    方法一 1 开机点击F1进入到bios界面 2 进入Security Secure Boot Disabled 如果不修改Secure boot选项为Disabled 在光驱引导时可能会出现报错 3 进入Startup UEFI Legac
  • C++57个入门知识点_37 虚函数的直接调用与间接调用(函数的调用分为直接调用和间接调用,间接调用是虚函数所具有的的性质;间接调用:运行期通过查找对象的虚表下标来调用函数的方法)

    前面两篇C 57个入门知识点 35 函数覆盖的概念1 函数覆盖条件 父子类继承关系 函数名 参数列表 返回值 调用约定必须相同 有virtual关键字 函数覆盖 类虚表中成员函数从继承自父类变为自己的 C 57个入门知识点 36 函数覆盖的
  • Android中的Loaders机制

    转自 http blog csdn net guoshaobei article details 17451647 Loaders机制在Android 3 0版本后引入 Loaders机制使一个Activity或者一个Fragment更加容
  • 职工管理系统(C++)

    职工管理系统有以下8个功能 增加职工信息 实现批量添加职工功能 将信息录入到文件中 职工信息为 职工编号 姓名 部门编号 显示职工信息 显示公司内部所有职工的信息 删除离职职工 按照编号删除指定的职工 修改职工信息 按照编号修改职工个人信息
  • python笔记-排序函数

    List排序 sort val list 1 7 3 9 5 6 val list sort sort 没有返回值 在原列表上排序 val list sort reverse True 逆序 print val list 使用sort 方法
  • IDEA启动tomcat控制台中文乱码问题

    IntelliJ IDEA是很多程序员必备且在业界被公认为最好的Java开发工具 有很多小伙伴在安装完IDEA并且tomcat之后 启动tomcat会出现控制台中文乱码问题 如下图所示 具体解决步骤 一 修改当前 Web 项目 Tomcat
  • 从用户页面获取作品列表

    最近web端更新比较频繁 所以搞了很多方案来应对更新问题 本文内容是其中一种方案 从用户主页的HTML响应内容中抽取user信息和作品列表数据 下图中出现的内容都是在html名为RENDER DATA的script标签中 以urlencod