Python爬虫:短视频平台无水印下载!这个操作有点东西!

导入:

虽然目前有些软件还没适配,但是,我发了 Blink 后有一写人留言或者私信找我要源码,不过我还在增加适配的软件,所以还没有时间写这篇博客,今天呢,就先把我目前适配了的代码拿出来,后续还会继续适配的!

分平台解释:

皮皮搞笑

皮皮搞笑与皮皮虾很类似,也是先获取分享链接,在电脑端进行分析:

抓包分析


我们可以很容易的在抓包资源 HXR 中找到某一固定的链接: https://h5.ippzone.com/ppapi/share/fetch_content,在该链接中的 video 字段可以看到有两个链接,分别打开尝试一下可以发现: 后缀含有 wm 的链接是含有水印的视频,另一个则是我们的目标链接了,但是我们又发现,在 video 字段下,还有一个全是数字的字符串,我们在当前 json文件中搜索额可以发现:


在上一个标签 img 下,有一个 id 字段,和字符串标签一样。
知道了视频链接的存放位置和获取方式,接下来开始分析请求:

 


在尝试过几次抓包后发现,请求 URL 始终都没有变化,只是下面的 请求负载 有所变化,第三个参数 post 默认不变就好,至于前两个参数,都在分享链接跳转的链接中:

https://h5.ippzone.com/pp/post/350259149175?zy_to=copy_link&share_count=1&m=0cd13da8548a1bc85813d8c60d331e22&app=&type=post&did=d2bddf23159ae495&mid=1270840711117&pid=350259149175

源码及结果

一切准备工作做好后,开始编写代码:

class PPGX():  # 皮皮搞笑
    def __init__(self, url):
        s_url = url
        self.headers = {
            'Host': 'share.ippzone.com',
            'Origin': 'http://share.ippzone.com',
            'Referer': s_url,
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36 Edg/84.0.522.52'
        }
        self.JSON = {
            "pid": int(str(s_url).split('=')[-1]),
            "mid": int(str(s_url).split('&')[-2].split('=')[-1]),
            "type": "post"
        }

    def ppgx_download(self):
        URL = 'http://share.ippzone.com/ppapi/share/fetch_content'
        r = requests.post(URL, proxies=proxy, headers=self.headers, json=self.JSON)
        video_name = r.json()['data']['post']['content'].replace(' ','')
        if video_name == '':
            video_name = int(random.random() * 2 * 1000)
        if len(str(video_name)) > 20:
            video_name = video_name[:20]
        video_url = r.json()['data']['post']['videos'][str(r.json()['data']['post']['imgs'][0]['id'])]['url']
        video = requests.get(video_url, proxies=proxy).content
        with open(path + str(video_name) + '.mp4', 'wb') as f:
            f.write(video)
        print("【皮皮搞笑】: {}.mp4 无水印视频下载完成!".format(video_name))

结果:


抖音 / 抖音极速版

接下来以 抖音 为例(抖音极速版的解析方式和抖音相同):
同样的思路,拿到分享链接到电脑浏览器中抓包分析:


拿到如下信息:
摆摊的第二天……#架子鼓演奏 #架子鼓 #乐器 #听心 https://v.douyin.com/JMKHkqt/ 复制此链接,打开【抖音短视频】,直接观看视频!
所以为了方便,使用正则表达式来提取该内容中的链接:
url = re.findall('(https?://[^\s]+)', s_url)[0] # 正则提取字符串中的链接

抓包分析


我们可以在抓包资源 HXR 中找到某一请求,在该 json 文件中 play_addr 字段下可以找到视频链接,用浏览器打开:


该链接跳转到了视频是没错,不过直接跳转到了又水印的链接上,这就有点卡住了。
不过,按照皮皮搞笑的链接区分来看, wm 是含有水印的视频的话。

https://aweme.snssdk.com/aweme/v1/playwm/?video_id=v0200f750000bsegsdpphaglno4mqd8g&ratio=720p&line=0

当我们删掉链接中的 wm 字段后:


没有加载??????? 而且我们可以发现链接根本都还没有跳转。
但是: 当我们把设备切换为手机时: 链接跳转到了无水印的视频链接:

代码及结果

当一切都分析完后,开始编写代码:
注意: 当我们去掉 wm 字段后,下载视频时,需要带上模拟手机端的请求头!

class DY():  # 抖音
    headers = {  # 模拟手机端
        '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 Edg/84.0.4147.105'
    }

    def __init__(self, s_url):
        self.url = re.findall('(https?://[^\s]+)', s_url)[0]  # 正则提取字符串中的链接

    def dy_download(self):
        rel_url = str(requests.get(self.url, proxies=proxy, headers=self.headers).url)
        if 'video' == rel_url.split('/')[4]:
            URL = 'https://www.iesdouyin.com/web/api/v2/aweme/iteminfo/?item_ids=' + rel_url.split('/')[5] + '&dytk='
            r = requests.get(URL, proxies=proxy, headers=self.headers)
            video_url = r.json()['item_list'][0]['video']['play_addr']['url_list'][0].replace('/playwm/', '/play/')
            video_name = r.json()['item_list'][0]['share_info']['share_title'].split('#')[0].split('@')[0].replace(' ','')
            if video_name == '':
                video_name = int(random.random() * 2 * 1000)
            if len(str(video_name)) > 20:
                video_name = video_name[:20]
            video = requests.get(video_url, proxies=proxy, headers=self.headers).content
            with open(path + str(video_name) + '.mp4', 'wb') as f:
                f.write(video)
            print("【抖音短视频】: {}.mp4 无水印视频下载完成!".format(video_name))成!".format(video_name))

结果:由于抖音和抖音极速版的分享内容是一样的,无法分辨哪个平台,所以统一输出。

但是: 我发现抖音没事就爱搞幺蛾子,有时分享链接是上文所示:
有时又是一段原链接…所以我,做了一点小小的优化:

小优化:

if 'www.iesdouyin.com' in self.s_url:
    print("【抖音短视频】: {}.mp4 无水印视频下载完成!".format(video_name))
if 'v.douyin.com' in self.s_url:
    print("【抖音短视频/抖音极速版】: {}.mp4 无水印视频下载完成!".format(video_name))
1234

 

腾讯微视

套路依旧,获取分享链接:


拿到链接:

上不上班无所谓,主要是想蹦迪>>https://h5.weishi.qq.com/weishi/feed/6XSB277Nr1K5nIKb6/wsfeed?wxplay=1&id=6XSB277Nr1K5nIKb6&spid=8813798054214369280&qua=v1_and_weishi_8.0.6_588_312028000_d&chid=100081014&pkg=3670&attach=cp_reserves3_1000370011

抓包及分析

注意: 这里是一个写爬虫的常用思路:将设备切换为手机,因为相对于电脑端,手机端的健壮性没有电脑端好,所以很多东西都可以通过这种方式来抓取,就如这个例子:

未切换:

已切换:


依次检查请求后发现:链接也就摆放在 json 数据中。
那么,接下来直接分析请求:

 


对于 请求负载 中的参数,我们可以直接在请求链接中截取:

https://h5.weishi.qq.com/weishi/feed/6XSB277Nr1K5nIKb6/wsfeed?wxplay=1&id=6XSB277Nr1K5nIKb6&spid=8813798054214369280&qua=v1_and_weishi_8.0.6_588_312028000_d&chid=100081014&pkg=3670&attach=cp_reserves3_1000370011

其他的参数默认就好,而至于请求链接,同一个视频刷新几次,参数 t 就有多少个值:

https://h5.weishi.qq.com/webapp/json/weishi/WSH5GetPlayPage?t=0.764612279656077&g_tk=
https://h5.weishi.qq.com/webapp/json/weishi/WSH5GetPlayPage?t=0.3168301677339891&g_tk=
https://h5.weishi.qq.com/webapp/json/weishi/WSH5GetPlayPage?t=0.8888910469548954&g_tk=

而且,有时候长度都不一样,这就把我吓到了!什么加密?这么复杂!
既然同一个视频每次刷新都不一样,是不是跟时间戳有关系???但是这明显不是啊!
正在我为这个参数发愁时,我也不知道我当时是怎么想的,无聊,随机修改了参数 t 的几个数字发现,仍然能够获取到视频!!!!!!!
然后我发现:所有的数全是在 0—1 之间变化,我用Python的 random 产生了一组随机数来看:

import random
print(random.random())

#  结果:
#  0.5890812460827893

我都惊呆了!!就是这种数据啊!我用这个随机数去请求时,结果居然是可行的,这…


居然误打误撞的给破解了…

代码及结果

class TXWS():  # 腾讯微视
    headers = {  # 模拟手机端
        '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 Edg/84.0.4147.105'
    }

    def __init__(self, s_url):
        self.url = re.findall('(https?://[^\s]+)', s_url)[0]  # 正则提取字符串中的链接
        self.data = {
            'datalvl': "all",
            'feedid': str(self.url).split('/')[5],
            'recommendtype': '0',
            '_weishi_mapExt': '{}'
        }

    def txws_download(self):  # 参数 t 为随机数
        url = 'https://h5.weishi.qq.com/webapp/json/weishi/WSH5GetPlayPage?t={}&g_tk='.format(random.random())
        r = requests.post(url, proxies=proxy, headers=self.headers, data=self.data)
        video_name = r.json()['data']['feeds'][0]['feed_desc'].replace(' ','')
        if video_name == '':
            video_name = int(random.random() * 2 * 1000)
        if len(str(video_name)) > 20:
            video_name = video_name[:20]
        video_url = r.json()['data']['feeds'][0]['video_url']
        video = requests.get(video_url, proxies=proxy, headers=self.headers).content
        with open(path + str(video_name) + '.mp4', 'wb') as f:
            f.write(video)
        print("【腾讯微视】: {}.mp4 无水印视频下载完成!".format(video_name))

结果:


开眼 Eyepetizer

虽然 开眼 下载的视频,并没有水印,但是下载好的视频只能在软件内观看,但是我还是想让它下载到它该下载的地址:
套路,套路,还是套路:

抓包分析


还是很简单的,没什么反爬机制,很容易就会找到了视频的下载地址,接下来直接分析请求:


请求链接中只有几个数字需要解析,但是我们发现,它就出现在分享链接中:

https://www.eyepetizer.net/detail.html?vid=208234&utm_campaign=routine&utm_medium=share&utm_source=others&uid=0&resourceType=video&udid=c65aab71b05749d584eac4ee7944bb6274e17596&vc=6030061&vn=6.3.6&size=1080X2070&deviceModel=9&first_channel=xiaomi&last_channel=xiaomi&system_version_code=27

代码及结果

class KY_Eyepetizer():  # 开眼
    def __init__(self, url):
        self.vid = str(url).split('=')[1].split('&')[0]
        self.headers = {
            'origin': 'https://www.eyepetizer.net',
            'referer': url,
            'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36 Edg/84.0.522.58'
        }

    def ky_download(self):
        url = 'https://baobab.kaiyanapp.com/api/v1/video/{}?f=web'.format(self.vid)
        r = requests.get(url, proxies=proxy, headers=self.headers)
        video_name = r.json()['title'].replace(' ','')
        if video_name == '':
            video_name = int(random.random() * 2 * 1000)
        if len(str(video_name)) > 20:
            video_name = video_name[:20]
        video_url = r.json()['playUrl']
        video = requests.get(video_url, proxies=proxy, headers=self.headers).content
        with open(path + str(video_name) + '.mp4', 'wb') as f:
            f.write(video)
        print("【开眼 Eyepetizer】: {}.mp4 无水印视频下载完成!".format(video_name))

还有其他的短视频教程就先不上传了   篇幅限制  需要完整的资料就加群:1136192749

 

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值