使用python爬取抖音app视频的实例代码


Posted in Python onDecember 01, 2020

记录一下如何用python爬取app数据,本文以爬取抖音视频app为例。

编程工具:pycharm

app抓包工具:mitmproxy

app自动化工具:appium

运行环境:windows10

思路:

假设已经配置好我们所需要的工具

1、使用mitmproxy对手机app抓包获取我们想要的内容

2、利用appium自动化测试工具,驱动app模拟人的动作(滑动、点击等)

3、将1和2相结合达到自动化爬虫的效果

一、mitmproxy/mitmdump抓包

确保已经安装好了mitmproxy,并且手机和PC处于同一个局域网下,同时也配置好了mitmproxy的CA证书,网上有很多相关的配置教程,这里我就略过了。

因为mitmproxy不支持windows系统,所以这里用的是它的组件之一mitmdump,它是mitmproxy的命令行接口,可以利用它对接我们的Python脚本,用Python实现监听后的处理。

在配置好mitmproxy之后,在控制台上输入mitmdump并在手机上打开抖音app,mitmdump会呈现手机上的所有请求,如下图

使用python爬取抖音app视频的实例代码

可以在抖音app一直往下滑,看mitmdump所展示的请求,会发现前缀分别为

http://v1-dy.ixigua.com/;http://v3-dy.ixigua.com/;http://v9-dy.ixigua.com/

这3个类型前缀的url正是我们的目标抖音视频url。

那接下来就要编写python脚本将视频下载下来,需要使用 mitmdump -s scripts.py(此处为python文件名)来执行脚本。

import requests
# 文件路径
path = 'D:/video/'
num = 1788
 
 
def response(flow):
 global num
 # 经测试发现视频url前缀主要是3个
 target_urls = ['http://v1-dy.ixigua.com/', 'http://v9-dy.ixigua.com/',
     'http://v3-dy.ixigua.com/']
 for url in target_urls:
  # 过滤掉不需要的url
  if flow.request.url.startswith(url):
   # 设置视频名
   filename = path + str(num) + '.mp4'
   # 使用request获取视频url的内容
   # stream=True作用是推迟下载响应体直到访问Response.content属性
   res = requests.get(flow.request.url, stream=True)
   # 将视频写入文件夹
   with open(filename, 'ab') as f:
    f.write(res.content)
    f.flush()
    print(filename + '下载完成')
   num += 1

代码写得比较粗糙,不过基本的逻辑还是比较清晰的,这样我们就可以把抖音的视频下载下来,不过这个方法有个缺陷,就是获取视频需要人来不断地滑动抖音的下一个视频,这时候我们可以用一个强大的appium自动化测试工具来解决。

二、Appium对手机进行模拟操作

确保已经配置好appium所依赖的环境Android和SDK,网上也有许多教程,这里我就不说了。

appium的用法很简单,首先我们先打开appium,启动界面如下

使用python爬取抖音app视频的实例代码

点击Start Server按钮即可启动appium服务

使用python爬取抖音app视频的实例代码

将Android手机通过数据线与PC相连,同时打开USB调试功能,可以输入adb命令(具体可以去网上查找)测试连接情况,若出现以下结果,则说明连接成功

使用python爬取抖音app视频的实例代码

model是设备名,后面配置需要用到。之后点击下图箭头所指的按钮就会出现一个配置页面

使用python爬取抖音app视频的实例代码使用python爬取抖音app视频的实例代码

在右下角的JSON Representation配置启动app的Desired Capabilities参数,分别是paltformName、deviceName、appPackage、appActivity。

platformName:平台名称,一般是Android或iOS.

deviceName:设备名称,手机的具体类型

appPackage:App程序包名

appActivity:入口Activity名,通常以.开头

使用python爬取抖音app视频的实例代码

platformName和deviceName比较容易获得,而appPackage和appActivity这两个可以通过以下方法获取到。

在控制台上输入   adb logcat>D:\log.log  命令,并且在手机打开抖音app,然后在D盘中打开log.log文件,查找Displayed关键字

使用python爬取抖音app视频的实例代码

由上图可以知道Displayed后面的 com.ss.android.ugc.aweme对应的是appPackage,.main.MainActivity对应的是appActivity,最后我们的配置结果如下:

{
 "platformName": "Android",
 "deviceName": "Mi_Note_3",
 "appPackage": "com.ss.android.ugc.aweme",
 "appActivity": ".main.MainActivity"
}

再点击Start Session即可启动Android手机上的抖音app并进入到启动页面,同时PC上会弹出一个调试窗口,从这个窗口可以预览当前手机页面,还可以对手机模拟各种操作,在本文不是重点,所以略过。

使用python爬取抖音app视频的实例代码

在下面我们将使用python脚本来驱动app,直接在pycharm运行即可

from appium import webdriver
from time import sleep
 
 
class Action():
 def __init__(self):
  # 初始化配置,设置Desired Capabilities参数
  self.desired_caps = {
   "platformName": "Android",
   "deviceName": "Mi_Note_3",
   "appPackage": "com.ss.android.ugc.aweme",
   "appActivity": ".main.MainActivity"
  }
  # 指定Appium Server
  self.server = 'http://localhost:4723/wd/hub'
  # 新建一个Session
  self.driver = webdriver.Remote(self.server, self.desired_caps)
  # 设置滑动初始坐标和滑动距离
  self.start_x = 500
  self.start_y = 1500
  self.distance = 1300
 
 def comments(self):
  sleep(2)
  # app开启之后点击一次屏幕,确保页面的展示
  self.driver.tap([(500, 1200)], 500)
 
 def scroll(self):
  # 无限滑动
  while True:
   # 模拟滑动
   self.driver.swipe(self.start_x, self.start_y, self.start_x, 
        self.start_y-self.distance)
   # 设置延时等待
   sleep(2)
 
 def main(self):
  self.comments()
  self.scroll()
 
 
if __name__ == '__main__':
 
 action = Action()
 action.main()

下面是爬虫的过程。ps:偶尔会爬取到重复的视频

使用python爬取抖音app视频的实例代码

使用python爬取抖音app视频的实例代码

到此这篇关于使用python爬取抖音app视频的文章就介绍到这了,更多相关python爬取抖音app视频内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python dict.get()和dict['key']的区别详解
Jun 30 Python
Python定时器实例代码
Nov 01 Python
python 读取DICOM头文件的实例
May 07 Python
python实现基于信息增益的决策树归纳
Dec 18 Python
用Python读取几十万行文本数据
Dec 24 Python
Python计算时间间隔(精确到微妙)的代码实例
Feb 26 Python
Flask教程之重定向与错误处理实例分析
Aug 01 Python
Python代理IP爬虫的新手使用教程
Sep 05 Python
Anaconda 查看、创建、管理和使用python环境的方法
Dec 03 Python
基于python+selenium的二次封装的实现
Jan 06 Python
浅谈keras中的keras.utils.to_categorical用法
Jul 02 Python
scrapy结合selenium解析动态页面的实现
Sep 28 Python
基于Python实现粒子滤波效果
Dec 01 #Python
Django集成MongoDB实现过程解析
Dec 01 #Python
基于Django快速集成Echarts代码示例
Dec 01 #Python
Python更改pip镜像源的方法示例
Dec 01 #Python
Python读取图像并显示灰度图的实现
Dec 01 #Python
Python性能测试工具Locust安装及使用
Dec 01 #Python
python爬虫中抓取指数的实例讲解
Dec 01 #Python
You might like
PHP Header用于页面跳转要注意的几个问题总结
2008/10/03 PHP
Linux下PHP连接Oracle数据库
2014/08/20 PHP
ThinkPHP分组下自定义标签库实例
2014/11/01 PHP
PHP基于PDO实现的SQLite操作类【包含增删改查及事务等操作】
2017/06/21 PHP
PHP根据树的前序遍历和中序遍历构造树并输出后序遍历的方法
2017/11/10 PHP
PHP获取本周所有日期或者最近七天所有日期的方法
2018/06/20 PHP
php中上传文件的的解决方案
2018/09/25 PHP
gearman中任务的优先级和返回状态实例分析
2020/02/27 PHP
一个用javascript写的select支持上下键、首字母筛选以及回车取值的功能
2009/09/09 Javascript
javascript 获取页面的高度及滚动条的位置的代码
2010/05/06 Javascript
用正则表达式替换图片地址img标签
2013/11/22 Javascript
[原创]推荐10款最热门jQuery UI框架
2014/08/19 Javascript
jquery实现具有收缩功能的垂直导航菜单
2016/02/16 Javascript
js 客户端打印html 并且去掉页眉、页脚的实例
2017/11/03 Javascript
Vue Cli3 创建项目的方法步骤
2018/10/15 Javascript
在Vant的基础上实现添加表单验证框架的方法示例
2018/12/05 Javascript
详解vue后台系统登录态管理
2019/04/02 Javascript
Nodejs实现用户注册功能
2019/04/14 NodeJs
浅谈vuex中store的命名空间
2019/11/08 Javascript
[01:21]DOTA2新纪元-7.0新版本即将开启!
2016/12/11 DOTA
[58:57]2018DOTA2亚洲邀请赛3月29日小组赛B组 Effect VS VGJ.T
2018/03/30 DOTA
[00:09]DOTA2全国高校联赛 精彩活动引爆全场
2018/05/30 DOTA
python在命令行下使用google翻译(带语音)
2014/01/16 Python
python中__call__方法示例分析
2014/10/11 Python
Python 依赖库太多了该如何管理
2019/11/08 Python
Pytorch转onnx、torchscript方式
2020/05/25 Python
Python 使用生成器代替线程的方法
2020/08/04 Python
html5版canvas自由拼图实例
2014/10/15 HTML / CSS
Html5移动端div固定到底部实现底部导航条的几种方式
2021/03/09 HTML / CSS
求网格中的黑点分布
2013/11/06 面试题
高级护理专业大学生求职信
2013/10/24 职场文书
英文求职信结束语大全
2013/10/26 职场文书
办公室主任先进事迹
2014/01/18 职场文书
个人承诺书
2014/03/26 职场文书
感谢信的格式
2015/01/21 职场文书
攻略丨滑雪究竟该选哪款对讲机?
2022/02/18 无线电