作 者:煌金的咸鱼

来 源:咸鱼学Python

广而告之:由于此订阅号换了个皮肤,系统自动取消了读者的公众号置顶。导致用户接受文章不及时。您可以打开订阅号,选择置顶(标星)公众号。重磅干货,第一时间送达!

前言

上周看到一个有趣的项目是使用Python+ADB做一个Python 抖音机器人 Douyin-Bot,自动翻页+颜值识别,自动点赞加关注,效果如下图,可以说是非常秀了。

源码地址:

而我们今天实现的就是批量下载抖音视频,结合上面的机器人可以说是机器人届的蒂花之秀。

今天我们实现的抖音爬虫主要有下面四点功能:

  • 根据抖音号下载用户发布的全部视频

  • 根据链接自动下载用户点赞的视频

  • 根据链接自动下载某个主题下的全部视频

  • 根据链接自动下载某个音乐下的全部视频

废话说多了,先上一波爬取的结果:

下载视频截图

输出日志截图

实战

引入类库

import requests
import json
import datetime
import re
import sys
import os
from urllib.parse import urlencode
from contextlib import closing
from requests.packages import urllib3
import random

本次代码的主要功能模块如下:

这次的项目主要是根据用户分享的链接自动下载,首先我们通过分享得到下面的链接:

# 这是用户主页的分享链接
https://www.douyin.com/share/user/61806758871/?share_type=link&from=singlemessage
# 这是音乐界面的分享链接
https://www.iesdouyin.com/share/music/6562721743650491139?timestamp=1528546868&utm_source=weixin&utm_campaign=client_share&utm_medium=android&app=aweme&iid=33943329942
# 这是主题界面的分享链接
https://www.iesdouyin.com/share/challenge/1602334725005380?timestamp=1528546923&utm_source=weixin&utm_campaign=client_share&utm_medium=android&app=aweme&iid=33943329942

根据上面的链接我们可以得到以下代码,并且获得唯一的ID标识

# 解析文件里面读取出来的链接
def parse_url(urls):    musics_id = [] challenges_id = [] users_id = []  for i in range(len(urls)):  url = urls[i]  if url: # 分析链接是音乐链接 if re.search('share/music',url):  music_id = re.findall('share/music/(.*)\?', url) # if len(musics_id):    musics_id.append(music_id[0])   for music in musics_id: print(music)    if music not in os.listdir():   os.mkdir(music) download_music_media(music) # 分析链接是主题链接 if re.search('share/challenge', url): challenge_id = re.findall('share/challenge/(.*)\?',url)  challenges_id.append(challenge_id[0])   for challenge in challenges_id: if challenge not in os.listdir():   os.mkdir(challenge) # print(challenge)  download_challenge_media(challenge) # 分析链接是用户主页,请求下载的是用户喜欢的视频   if re.search('share/user', url):  user_id = re.findall('share/user/(.*)/\?',url)   users_id.append(user_id[0]) for u_id in users_id:   if u_id not in os.listdir():    os.mkdir(u_id)  # print(challenge)  download_ulike_media(u_id)

我们通过浏览器打开上面的链接可以获得以下的Headers信息:

headers = {  'user-agent':random.choice(hds),  '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'
}

我们以第二个获取点赞视频为例,打开我们分享的链接,将开发者模式调整成手机版,点击「喜欢」可以看到请求的链接,如下图:

查看请求链接

获得请求参数

可以看到请求的参数中有一个很奇怪的参数_signature,且每次请求这个参数都不同,通过查阅gayhub上相关项目资料,发现这个参数是链接中的ID号加密获得,所以接下来可以通过调用加密JS对ID加密,就可以构建一个完整的请求。代码如下:

# 构建请求参数
def download_ulike_media(u_id): p = os.popen('node fuck-byted-acrawler.js %s' % u_id)    signature = p.readlines()[0]   params = { 'user_id': str(u_id), 'count': '21',  'max_cursor': '0',  'aid': '1128',  '_signature': signature   }

可以看到上面调用了node.js来执行加密js,所以我们需要安装NODE.JS。

我们通过查看返回的数据,可以发现正确视频的链接形式如下:

https://www.amemv.com/share/video/xxxxxxxxxxx

在这里我们可以获得视频的id就可以构建完整的视频链接。代码如下:

 # 拼接视频信息   def get_ulike_url(max_cursor=None, video_count=0):    video_names = []   video_urls = []    url = 'https://www.amemv.com/share/video/'   if max_cursor:  params['max_cursor'] = str(max_cursor)   ulike_url = 'https://www.douyin.com/aweme/v1/aweme/favorite/?' + urlencode(params)  # print(ulike_url)  res = requests.get(ulike_url, headers=headers, verify=False) ulike_ms = json.loads(res.content.decode('utf-8'))   favorite_list = str(ulike_ms['aweme_list'])  v_id = re.findall('https://www.amemv.com/share/video/(.*?)\'',favorite_list)    for l in v_id:  share_desc = l + '.mp4' s_url = url + l   video_names.append(share_desc)  video_urls.append(s_url)    parse_media_url(video_names, video_urls, u_id)  if ulike_ms.get('has_more') == 1:   return get_ulike_url(ulike_ms.get('max_cursor'), video_count) video_count = get_ulike_url()  if video_count == 0:  print('这个用户没有喜欢的视频')

我们点击我们上面构建的视频链接,看下页面的具体情况是什么样的。

查看网页返回的信息

我们打开上图红框中的链接,可以看到是视频的资源地址。

打开源视频地址

按照上述的思路,我们可以构建以下的代码:

# 下载模块
def _download_video(video_url, path):   video_content = get_video_url(video_url)   # print(video_content)  rec = re.compile(r'class="video-player" src="(.*?)"')  pattern = re.compile(r'playwm')  downloadwm_url = rec.search(video_content).group(1)    # 构建无水印下载链接 download_url = re.sub(pattern, 'play', downloadwm_url)   print('正在下载:',download_url, path)  with closing(requests.get(download_url, headers=headers, stream=True, verify=False)) as response:    chunk_size = 1024  if response.status_code == 200:   with open(path, 'wb') as f:   for data in response.iter_content(chunk_size=chunk_size):  f.write(data)   # flush() 方法是用来刷新缓冲区的,即将缓冲区中的数据立刻写入文件,同时清空缓冲区,不需要是被动的等待输出缓冲区写入。    f.flush()

以上就是下载用户点赞视频的代码,相比于其他功能稍微复杂了点,其他功能通过手机抓包就可以获得请求接口,且没有加密参数。本次的项目代码基本类似,这里就以下载音乐视频的代码为例,讲下抓包部分:10行代码实现自动参与抽奖助手抽奖配置好Charles后,打开抖音,通过刷新手机页面,可以看到左边栏的请求链接中有两处链接高亮,Charles截图如下:

Charles截图

点击开响应的数据可以看到每一个链接,我们只要解析每个链接中share_url中包含的videoid,再带入到API中就可以得到真实的视频地址了。

解析图中红框中链接包含的videoid

在测试API时强烈建议可以使用Postman来测试链接的可用性,以减少我们请求的参数数量和测试的复杂度。

测试接口时的部分截图

全部代码较多,就不占用文章篇幅,有需要测试的朋友后台回复「抖音」获取代码文件。「代码测试于2018.6.9」

本文首发自:咸鱼学Python,欢迎点击下方链接关注获取更多干货呦~

1.

2. 

3.

4.

抖音小姐姐属于你的四种姿势相关推荐

  1. 用 Python 全自动下载抖音小姐姐视频(附源码)

    作者:法纳斯特 为什么写这篇文章,主要也是因为看了一篇文章. 「用Python在抖音扒了这些高颜值女神后,突然成了人生赢家」,文中简述了一名工程师利用Python+ADB+鹅厂的AI,一晚上关注了一千 ...

  2. python爬取无水印抖音小姐姐视频(2018最新,含Pyqt客户端)

    各位小伙伴,之前一段时间迷上了抖音小姐姐视频,但是下载的视频都有水印,于是自己用Python 写了个爬取小姐姐视频的工具,大家可以直接拷贝到自己编译器上运行.此外,我还利用pyqt5写了个操作界面,这 ...

  3. 快手老司机与抖音小姐姐 ,终有一战?

    点击"开发者技术前线",选择"星标?" 在看|星标|留言,  真爱 来源:网易科技(ID:tech_163) | 彭丽慧  编辑 | 章剑锋  出品 | 网易科 ...

  4. 用Google Brain的机器学习项目:Magenta,教神经网络学抖音小姐姐作曲。

    先上我们要学习的小姐姐 的美照.. 一.配置环境 1.自己配置环境:python,tensorflow,bazel(编译),java.然后下载magenta(https://github.com/te ...

  5. 骚操作!用Python自动下载抖音小姐姐

    阅读文本大概需要 15 分钟. 1 目 标 场 景 相信大家平时刷抖音短视频的时候,看到颜值高的小姐姐,都有随手点赞关注的习惯. 如果一条条去刷确实很耗时间,如果 Python 能帮忙筛选出颜值高的小 ...

  6. 用 Python 全自动下载抖音小姐姐视频

    (给Python开发者加星标,提升Python技能) 作者:法纳斯特(本文来自作者投稿,简介见末尾) 为什么写这篇文章,主要也是因为看了一篇文章. 「用Python在抖音扒了这些高颜值女神后,突然成了 ...

  7. 学好Python,为你喜欢的抖音小姐姐疯狂打call

    什么是抖音 抖音是2016年9月上线的一款音乐创意短视频社交软件,是一个专注年轻人的15秒音乐短视频社区.用户可以通过这款软件选择歌曲,拍摄15秒的音乐短视频,形成自己的作品. 效果 抖音经常能刷到很 ...

  8. pyqt5练手项目-抖音小姐姐短视频下载

    pyqt5=Python+ qt,这块的资料现在慢慢多起来了,这里给大家送一个小的demo用来练手. 里面技术点: 1)控件 Pushbutton的使用: 2)pyqt5线程的用法; 3)界面和逻辑分 ...

  9. 21年抓取抖音小姐姐最新版教程!最关键的是无水印下载。这还学不会?

    概叙 我想很多人一开始接触爬虫,想学的目的就是抓取某些小姐姐的视频啊,图片啊 或者抓取小说之类的!这个应该是大家想学爬虫的一个动力吧!今天就给大家整一期爬小姐姐视频,本来爬正经视频的,但是想了想,还是 ...

最新文章

  1. Unity三维游戏开发C#编程大师班 Masterclass In C# Programing Unity 3D Game Development FPS
  2. 十大问题诠释冯国华缘何入主金蝶
  3. python递归详解+汉诺塔小案例_汉诺塔,python递归实现解法步骤
  4. 算法杂货铺——分类算法之贝叶斯网络(Bayesian networks)
  5. Linux目录、文件的创建与删除
  6. 包含Iphlpapi.h 编译错误 error C2065: 'HRASCONN'
  7. 如何使用代码给product创建distribution chain
  8. 剑桥大学的下午茶,为何能喝出六十位诺贝尔奖获得者?
  9. 中国象棋程序的设计与实现(六)--N皇后问题的算法设计与实现(源码+注释+截图)...
  10. 李楠:《流浪地球》抄的经典套路 但这不是贬低
  11. SAP自学指南:案例公司的概括
  12. sql主键可以有多个_干货 | 新手请速戳!30个精选SQL面试问题Qamp;A集锦
  13. Codeforces 758F Geometrical Progression
  14. Extjs4.0 视频教程
  15. 旭荣管理软件怎么修改小票内容_水果门店管理系统怎么管理水果门店的
  16. Kubernetes监控体系(1)-cAdvisor介绍
  17. c语言整形数组存放字符串,用一维字符数组存放字符串
  18. 查征信 查婚姻状况 查公开的个人信息 学信网学历学位查询 中国执行信息公开网执行人查询 民办院校学位学历查询 国外学历学位查询方法 征信中心 中国裁判文书查询 查询全国的莆田系医院 企查查 天眼查
  19. 使用Echarts.js自定义X轴Y轴刻度画网格
  20. 通过Socket实现群聊的思路

热门文章

  1. 如何开发辅助决策系统?
  2. TimingGen绘波形图导入Viso步骤
  3. 【路径规划】基于遗传算法求解多车多类型车辆的车辆路径优化问题附matlab代码
  4. pdf 卖肯锡_麦肯锡工作法
  5. jinja2-过滤器
  6. 计算机零基础自学网站推荐(高质量)
  7. 全文检索Lucene(一)--Document操作与文本域加权
  8. Python基础知识③:改进案例小游戏
  9. 小米2S最新Android版本,小米2/2s如何刷Android 5.0?小米2s升级安卓5.0步骤
  10. mupdf PDF查看器使用教程