思路分析

  1. 使用 playwright 模拟浏览器打开分享链接
  2. 获取 播放页面 html 信息
  3. 解析 播放页面的 video标签,video标签的src属性就是视频的地址
    1. 这种模式会触发抖音的风控机制
  4. 解析页面 获取相关cookie
  5. 使用cookie请求页面文档
  6. 解析文档内容其中就有播放地址

playwright 入门使用介绍

简单使用如下。这种模式会触发抖音的风控机制,出现验证码中间页。

# 抖音分享链接
share_url = 'https://v.douyin.com/SGGxvfM/' # 创建浏览器打开分享地址
# 因为可能会触发抖音的风控机制,所以这里先设置为有头模式,当触发验证码中间页时,手动处理下
browser = sync_playwright().start().chromium.launch(headless=False)
context = browser.new_context()
page = context.new_page()
page.goto(share_url) # 获取标签及视频播放地址
page.wait_for_load_state()
video = page.wait_for_selector('video')
print(video)
source = video.query_selector_all('source')
video_src = source[0].get_attribute("src")
video_src = 'https:' + video_src
print(video_src) file_name = 'result.mp4'
print('开始下载视频...')
response = requests.get(video_src, stream=True)
with open(file_name, "wb") as file:
file.write(response.content) print('下载完成')

另辟出路

因为会触发中间验证页,虽然也可以使用 playwright 处理验证码,但是速度慢,同时验证方式更改就得更改总之不好。

背景信息

分享短链地址 :https://v.douyin.com/SGGxvfM/

重定向后的实际地址:https://www.douyin.com/video/7210719593298464003

流程:抖音的短链经过重定向后才会得到实际地址

中间过程就会拿到服务器写回的cookie信息

实际地址的请求是个document类型的内容,重点来了:document里的script标签的ID是RENDER_DATA,type是application/json,把标签里内容解码一下果然是我们想要的内容。

截图如下





处理逻辑

有了上面的背景信息,那处理逻辑也很简单了。

  1. 使用 playwright 进行打开分享地址
  2. 获取cookie信息
  3. 请求实际地址内容
  4. 获取script标签内容
  5. 解析script标签内容里json信息并获取相关字段
import json
import re import requests
from playwright.sync_api import sync_playwright
from bs4 import BeautifulSoup
from urllib.parse import unquote share_url = 'https://v.douyin.com/SGGxvfM/' browser = sync_playwright().start().chromium.launch(headless=True)
context = browser.new_context()
page = context.new_page()
page.goto(share_url)
cookies = page.context.cookies()
result_cookie = ''
for item in cookies:
if item['name'] == '__ac_nonce':
# document_header['__ac_nonce'] = item['value']
result_cookie = result_cookie + '__ac_nonce=' + item['value'] + ';'
if item['name'] == '__ac_signature':
result_cookie = result_cookie + '__ac_signature=' + item['value'] + ';' document_header = {
'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36',
'sec-fetch-dest': 'document',
'sec-fetch-mode': 'navigate',
'sec-fetch-site': 'same-origin',
'sec-ch-ua-platform': 'macOS',
'sec-ch-ua': '"Google Chrome";v="111", "Not(A:Brand";v="8", "Chromium";v="111"',
'sec-ch-ua-mobile': '?0',
'upgrade-insecure-requests': '1',
'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',
'cookie': result_cookie
} # print(page.url)
url = page.url
# url = 'https://www.iesdouyin.com/share/video/7210719593298464003/?region=CN&mid=7210720503894805308&u_code=33j73e481hda&did=MS4wLjABAAAAyWxE53gU-qg10uh4jIbo0XpO2_I8z5fpPlI_pBAlio7gocacNdKp0p4KSAydSgC_&iid=MS4wLjABAAAALt7iss0DroHh-NMLV6ZFi-4uYP-lTU-NqsBOH3GQxng6bxW6xVoJ7AHXunv0YjHv&with_sec_did=1&titleType=title&from_ssr=1&timestamp=1678941771&utm_campaign=client_share&app=aweme&utm_medium=ios&tt_from=copy&utm_source=copy'
search_result = re.search('https://www.iesdouyin.com/share/video/(.+?)/', url)
video_id = search_result.group(1)
video_url = 'https://www.douyin.com/video/' + video_id + '?previous_page=app_code_link'
video_detail_response = requests.get(video_url, headers=document_header) soup = BeautifulSoup(video_detail_response.text)
encode_data = soup.find('script', {'id': 'RENDER_DATA'}).get_text()
decode_data = unquote(encode_data)
decode_data = json.loads(decode_data)
video_url = decode_data['44']['aweme']['detail']['video']['playAddr'][0]['src'] video_src = 'https:' + video_url
print(video_src) file_name = 'result.mp4'
print('开始下载视频...')
response = requests.get(video_src, stream=True)
with open(file_name, "wb") as file:
file.write(response.content) print('下载完成')

额外其他

另外包装了一个微信小程序,可以试用看看,个人带宽服务器流量有限谨慎使用。使用过程中有问题还请多多包涵反馈。

分析document文档中script标签获取抖音无水印视频的更多相关文章

  1. Table对象代表一个HTML表格,在文档中<table>标签每出现一次,一个table对象就会被创建。

    1.对象集合 cells[] 返回包含表格中所有单元格的一个数组 rows[] 返回包含表格中所有行的一个数组 tBodies[] 返回包含表格中所有tbody的一个数组(主包含ty和td) 2.对象 ...

  2. 使用Python中的HTMLParser、cookielib抓取和解析网页、从HTML文档中提取链接、图像、文本、Cookies(二)(转)

    对搜索引擎.文件索引.文档转换.数据检索.站点备份或迁移等应用程序来说,经常用到对网页(即HTML文件)的解析处理.事实上,通过 Python语言提供的各种模块,我们无需借助Web服务器或者Web浏览 ...

  3. 【python】使用HTMLParser、cookielib抓取和解析网页、从HTML文档中提取链接、图像、文本、Cookies

    一.从HTML文档中提取链接 模块HTMLParser,该模块使我们能够根据HTML文档中的标签来简洁.高效地解析HTML文档. 处理HTML文档的时候,我们常常需要从其中提取出所有的链接.使用HTM ...

  4. Python中的HTMLParser、cookielib抓取和解析网页、从HTML文档中提取链接、图像、文本、Cookies(二)

    对搜索引擎.文件索引.文档转换.数据检索.站点备份或迁移等应用程序来说,经常用到对网页(即HTML文件)的解析处理.事实上,通过 Python语言提供的各种模块,我们无需借助Web服务器或者Web浏览 ...

  5. [译]我们应该在HTML文档中何处放script标签

    本文翻译youtube上的up主kudvenkat的javascript tutorial播放单 源地址在此: https://www.youtube.com/watch?v=PMsVM7rjupU& ...

  6. jquery获取元素在文档中的位置信息以及滚动条位置(转)

    jquery获取元素在文档中的位置信息以及滚动条位置 http://blog.csdn.net/qq_34095777/article/details/78750886     原文链接 原创 201 ...

  7. javaScript获取文档中所有元素节点的个数

    HTML+JS 代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...

  8. Java解析word,获取文档中图片位置

    前言(背景介绍): Apache POI是Apache基金会下一个开源的项目,用来处理office系列的文档,能够创建和解析word.excel.ppt格式的文档. 其中对word文档的处理有两个技术 ...

  9. html中如何获取元素在文档中的位置

    html中如何获取元素在文档中的位置 一.总结 一句话总结: $("#elem").offset().top $("#elem").offset().left ...

  10. HTML span标签:用来组合文档中的行内元素

    在DIV+CSS切图布局重构技术中,除了常常使用div标签外也常常使用span标签布局,通常也可以通过对span标签对象设置不同样式实现我们要的美化效果.这里主机吧主要讲的是span标签的定义和用法. ...

随机推荐

  1. Flink监控信息写入到PushGateway出现 java.io.IOException: Response code from http xx was 200问题

    最近在将Flink的Metrics存储由InfluxDB迁移到Prometheus的时候,由于使用的版本问题,导致一直出现下面的WARN日志 2020-05-16 12:36:57.794 [Flin ...

  2. python菜鸟学习: 3.浅copy使用场景

    # -*- coding: utf-8 -*-import copy# 浅copy# 使用场景,比如A,B夫妻共有一个银行账户,存取马宁的数据username = ["name", ...

  3. redis分布式锁实现,setnx,nodejs版本

    const redis = require('ioredis'); const clienId = Math.random() * 100; //模拟客户端Id const lockKey = 'te ...

  4. 关于JDK1.8 java HashMap的tableSizeFor的解析:一个数最近2的幂次数方法

    简介 一个数的最近2的幂次数,是java hashmap初始化方法指定容量里面对容量进行处理采用的方法 1.位运算符号介绍 符号 描述 运算规则 & 与 两个位都为1时,结果才为1 | 或 两 ...

  5. 解决word表格中文字无法居中的一个方法

    情况:试过许多方法,如表格属性->单元格居中:表格布局中的居中对齐都无效:虽然利用段落中的单倍行距可以实现居中效果,但我不想单倍行距. 原因:有时候我们表格上下行距比较大,而使用居中的按钮只能让 ...

  6. 项目实训 DAY 10

    今天,我写了一些前端代码规范,并按规范修改了一下代码.规范写到了README.md上

  7. 上分之路 VP Codeforces Round #744 (Div. 3) ABDE

    VP情况 4 / 8 AC: A,B,D,E1 60 minutes WA: C 4 127   +00:02 +00:28 -7 +00:58 +00:39       手速还在线 D pair排个 ...

  8. 微信小程序ECharts通过调用api接口实现图表的数据可视化

    小程序ECharts使用接口调入数据 首先附上js文件链接:axios.js 提取码:AxIo 将此放到小程序目录下的utils文件夹下 在已经完成图表的js文件中完成以下修改: ①引用axios.j ...

  9. <canvas>标签画登陆页鼠标滑过效果

    canvas 标签画登陆页鼠标滑过效果 如需js请留言.JS在个人博客日记中. <!DOCTYPE html> <html lang="en"> <h ...

  10. uniapp中使用AntV F6 + table表格插件使用

    首先看页面效果: AntV官网下载F6文件到项目中与uViewUI插件 <template> <view class="page"> <!-- 导航栏 ...