前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一个价值百万的思路,如何下载去水印视频

一个价值百万的思路,如何下载去水印视频

作者头像
龙哥
发布2020-09-24 16:47:34
1.5K0
发布2020-09-24 16:47:34
举报
文章被收录于专栏:Python绿色通道Python绿色通道

今天跟大家聊一个价值百万的思路

短视频如今非常火热,无论是微博、Twitter、还是知乎、微信,这些网站都在往短视频方向倾斜,抖音、快手就更不用说了。

来看一个网站

这是一个下载Twitter视频的工具。

你知道它的流量有多恐怖吗?月PV是900万,靠Adsense广告收入每月几千美刀。

采集twitter视频对一个做爬虫的程序员来说,技术难度几乎为零。缺的是对用户痛点的把握。

今天分享个类似的思路

我们下载的抖音短视频默认都是带水印的。

Google搜索“抖音去水印”一共有500多万条记录和相关搜索内容

这已经不是一个小众需求,对搬运工来说是刚需!因为他们都喜欢将没有水印的视频搬到另一个地方去。

那么如何下载去水印视频呢?网上有不少教程,不过很多早就过时无法用了。今天教大家找到一个通用的方法来获取抖音去水印短视频。

我们从抖音APP复制某个视频的链接后,在浏览器打开后,就会看到视频请求的接口。

仔细观察就会发现里面包含有一个视频播放的URL

将该链接复制出来

https://aweme.snssdk.com/aweme/v1/playwm/?video_id=v0200fe70000br155v26tgq06h08e0lg&ratio=720p&line=0%E2%80%8B

浏览器打开发现其实这是个带有水印的视频

有人说,把链接里面的playwm替换成play就是去水印的版本,因为wm表示water mask,表示水印的意思。

如果你按照该操作打开链接的话,发现是一篇空白。

其实这里还少个步骤,你要把浏览器切换成手机模式,就是说user-agent切换成移动设备。

切换后就会重定向到新的链接,这个链接就是去水印的地址

思路通了之后,剩下的就是用代码来实现了

思考2小时,代码半小时

部分核心代码:

import re
from urllib.parse import urlparse

import requests

from toolhub import utils


class DY(object):

    def __init__(self, app=None):
        self.app = app
        if app is not None:
            self.init_app(app)

        self.headers = {
            'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
            'accept-encoding': 'gzip, deflate, br',
            'accept-language': 'zh-CN,zh;q=0.9',
            'cache-control': 'max-age=0',
            'upgrade-insecure-requests': '1',
            'user-agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1'
        }

        self.domain = ['www.douyin.com',
                       'v.douyin.com',
                       'www.snssdk.com',
                       'www.amemv.com',
                       'www.iesdouyin.com',
                       'aweme.snssdk.com']

    def init_app(self, app):
        self.app = app

    def parse(self, url):
        share_url = self.get_share_url(url)
        share_url_parse = urlparse(share_url)
        if share_url_parse.netloc not in self.domain:
            raise Exception("无效的链接")
        dytk = None
        vid = re.findall(r'\/share\/video\/(\d*)', share_url_parse.path)[0]
        match = re.search(r'\/share\/video\/(\d*)', share_url_parse.path)
        if match:
            vid = match.group(1)
        response = requests.get(share_url, headers=self.headers, allow_redirects=False)
        match = re.search('dytk: "(.*?)"', response.text)
        if match:
            dytk = match.group(1)

        if vid and dytk:
            return self.get_data(vid, dytk)
        else:
            raise Exception("解析失败")

    def get_share_url(self, url):
        response = requests.get(url,
                                headers=self.headers,
                                allow_redirects=False)
        if 'location' in response.headers.keys():
            return response.headers['location']
        else:
            raise Exception("解析失败")

    def get_data(self, vid, dytk):
        url = f"https://www.iesdouyin.com/web/api/v2/aweme/iteminfo/?item_ids={vid}&dytk={dytk}"
        response = requests.get(url, headers=self.headers, )
        result = response.json()
        if not response.status_code == 200:
            raise Exception("解析失败")
        item = result.get("item_list")[0]
        author = item.get("author").get("nickname")
        mp4 = item.get("video").get("play_addr").get("url_list")[0]
        cover = item.get("video").get("cover").get("url_list")[0]
        mp4 = mp4.replace("playwm", "play")
        res = requests.get(mp4, headers=self.headers, allow_redirects=True)
        mp4 = res.url
        desc = item.get("desc")
        mp3 = item.get("music").get("play_url").get("url_list")[0]

        data = dict()
        data['mp3'] = mp3
        data['mp4'] = mp4
        data['cover'] = cover
        data['nickname'] = author
        data['desc'] = desc
        data['duration'] = utils.format_duration(item.get("duration"))
        return data


dy = DY()

if __name__ == '__main__':
    dy = DY()
    data = dy.parse("https://v.douyin.com/oXbjfe/")
    import pprint
    pprint.pprint(data)

最后来看看效果:

完整代码可以直接在github下载:https://github.com/lzjun567/python_scripts/blob/master/douyin.py

这个思路值一百万吗?当然还不行。

你要把它最终变成一个工具,让小白点点按钮就能获取去水印的链接才能发挥出它真正的价值。

剩下的事情你只要把它包装成一个网站或者小程序,抑或是可供下载的软件,然后就可以躺着挣钱了。

最后,就看你的执行力了!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-09-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python绿色通道 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云开发 CloudBase
云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档