python下载某短视频平台音视频、评论、点赞数(详细教程,文末附完整代码

前言

整理一下python在抖音网页版的应用
以抓取一个视频及评论为例进行讲解

获取视频 url

随便找一个视频,点击进入详情,页面中地址栏里就是该视频的 url 。在这里插入图片描述
手机端复制链接后,先粘到浏览器地址栏访问,url 会自动转换,这时候复制地址栏的 url 即可。

发送请求

接下来就是简单的发送请求,唯一需要注意的一点就是 headers 中除了要配置 UA 外,还要配置 cookie 信息,否则拿不到想要的数据,cookie 位置在下图在这里插入图片描述
配置好 headers 之后,发送 get 请求,拿到页面源码数据

data = requests.get(url=url, headers=headers)
data.encoding = 'utf-8'
data = data.text

数据解析

在页面源码数据中有很长一串数据是经过 url 编码的,而我们需要的数据都在这串数据中,因此我们需要拿到这串数据。通过正则表达式定位并取出这串数据,然后调用 requests 模块下的工具包 utils 里的 unquote 方法解码这串数据(得到的是 string 类型的数据),代码如下:

data_en = re.findall('<script id="RENDER_DATA" type="application/json">(.*?)</script></head><body >',data)[0]
data_all = requests.utils.unquote(data_en)

后面就是经典的资源定位了,我们先来说视频下载,先在数据中找到视频的链接,会发现有两个在这里插入图片描述
经过我的测试,第一个链接的视频带有水印,而第二个没有,这个根据自己的需要选择就行,只是改个索引的问题,我这里选择第二个无水印的,编写正则表达式将其取出

video_url = 'https:' + re.findall('"playAddr":\[{"src":".*?{"src":"(.*?)"}]',data_all)[0]

评论数据及标题类似,只是位置不同

comments = re.findall("\"comments\":\[(.*?)],\"consumerTime\":",data_all)
title = re.findall('"desc":"(.*?)","authorUserId"',data_all)[0].replace(' ','')

再后面的话就是持久化存储了,这个没什么好说的,就不再赘述了,我直接贴一下存视频的代码,评论也是类似的

if not os.path.exists('./video'):
    os.mkdir('./video')
video_content = requests.get(url=video_url,headers=headers).content
with open(f'./video/{title}.mp4','wb+') as f:
    f.write(video_content)

结尾

到这我们就基本完成了,批量的话只是稍微调一下的问题,主要问题还是在数据的解析上。
如果有问题的话,可以评论区留言,也可以私信我,欢迎大家一起讨论

完整代码

import requests, re, json, os

url = ""
headers = {
    'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36',
    'cookie' : ''
}

data = requests.get(url=url, headers=headers)
data.encoding = 'utf-8'
data = data.text
data_en = re.findall('<script id="RENDER_DATA" type="application/json">(.*?)</script></head><body >',data)[0]
data_all = requests.utils.unquote(data_en)

# 解析视频url:正则
video_url = 'https:' + re.findall('"playAddr":\[{"src":".*?{"src":"(.*?)"}]',data_all)[0]
# print(video_url)

# 正则
comments = re.findall("\"comments\":\[(.*?)],\"consumerTime\":",data_all)
# print(comments)

# title
title = re.findall('"desc":"(.*?)","authorUserId"',data_all)[0].replace(' ','')

#保存
if not os.path.exists('./video'):
    os.mkdir('./video')
video_content = requests.get(url=video_url, headers=headers).content
with open(f'./video/{title}.mp4', 'wb+') as f:
    f.write(video_content)

自己配置上 url 和 cookie 就能直接运行


2022.06.14更新

今天看评论说会报错,我运行了一下,还真是,估计是官方有所更新。所有又改了一下,逻辑没什么变化,主要是正则有所改变

import requests, re, json, os

url = ""
headers = {
    'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:100.0) Gecko/20100101 Firefox/100.0',
    'cookie' : ''
}

data = requests.get(url=url, headers=headers)
data.encoding = 'utf-8'
data = data.text
# print(data)
data_en = re.findall('<script id="RENDER_DATA" type="application/json">(.*?)</script>',data)[0]
data_all = requests.utils.unquote(data_en)

# 解析视频url:正则
video_url = 'https:' + re.findall('"playAddr":\[{"src":".*?{"src":"(.*?)"}]',data_all)[0]
print(video_url)

# 正则
comments = re.findall("\"comments\":\[(.*?)],\"consumerTime\":",data_all)
print(comments)

# title
title = re.findall(']}},"desc":"(.*?)","authorUserId"',data_all)[0].replace(' ','')
print('-----------------------------------------------------------------------------------------')
print(title)

#保存
if not os.path.exists('./video'):
    os.mkdir('./video')
video_content = requests.get(url=video_url, headers=headers).content
# 由于直接将文案作为保存视频的文件名,所以在文案过长的时候会报错,把这两行注释然后打开最后两行的注释就行,一个简单的切片,也可以用自己的方法替换
with open(f'./video/{title}.mp4', 'wb+') as f:
    f.write(video_content)

# with open(f'./video/{title[0:10]}.mp4', 'wb+') as f:
#     f.write(video_content)

还有就是有时候会报Latin-1编码异常,这个问题大概率是由于请求头里含有…引起的,打开原始按钮重复复制就解决了。其他问题的话都可以留言讨论。
在这里插入图片描述

  • 13
    点赞
  • 68
    收藏
  • 打赏
    打赏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

co松柏

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值