详解使用python爬取抖音app视频(appium可以操控手机)


Posted in Python onJanuary 26, 2021

记录一下如何用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视频(appium可以操控手机)

可以在抖音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视频(appium可以操控手机)

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

详解使用python爬取抖音app视频(appium可以操控手机)

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

详解使用python爬取抖音app视频(appium可以操控手机)

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

详解使用python爬取抖音app视频(appium可以操控手机)

详解使用python爬取抖音app视频(appium可以操控手机)

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

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

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

appPackage:App程序包名

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

详解使用python爬取抖音app视频(appium可以操控手机)

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

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

详解使用python爬取抖音app视频(appium可以操控手机)

由上图可以知道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视频(appium可以操控手机)

在下面我们将使用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视频(appium可以操控手机)

详解使用python爬取抖音app视频(appium可以操控手机)

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

Python 相关文章推荐
shelve  用来持久化任意的Python对象实例代码
Oct 12 Python
Python实现的FTP通信客户端与服务器端功能示例
Mar 28 Python
CentOS 7下安装Python3.6 及遇到的问题小结
Nov 08 Python
Python判断两个文件是否相同与两个文本进行相同项筛选的方法
Mar 01 Python
20行python代码的入门级小游戏的详解
May 05 Python
使用Python脚本zabbix自定义key监控oracle连接状态
Aug 28 Python
pycharm 设置项目的根目录教程
Feb 12 Python
Python Selenium安装及环境配置的实现
Mar 17 Python
pyinstaller打包单文件时--uac-admin选项不起作用怎么办
Apr 15 Python
如何打包Python Web项目实现免安装一键启动的方法
May 21 Python
pycharm 快速解决python代码冲突的问题
Jan 15 Python
pytorch __init__、forward与__call__的用法小结
Feb 27 Python
python Matplotlib基础--如何添加文本和标注
Jan 26 #Python
python如何用matplotlib创建三维图表
Jan 26 #Python
python软件测试Jmeter性能测试JDBC Request(结合数据库)的使用详解
Jan 26 #Python
Python数据模型与Python对象模型的相关总结
Jan 26 #Python
使用豆瓣源来安装python中的第三方库方法
Jan 26 #Python
详解用selenium来下载小姐姐图片并保存
Jan 26 #Python
selenium与xpath之获取指定位置的元素的实现
Jan 26 #Python
You might like
点评山进PR-D3L三波段收音机
2021/03/02 无线电
PHP实现RSA签名生成订单功能【支付宝示例】
2017/06/06 PHP
PHP钩子实现方法解析
2019/05/21 PHP
基于jquery的15款幻灯片插件
2011/04/10 Javascript
JavaScript分析、压缩工具JavaScript Analyser
2014/12/31 Javascript
jQuery实现图片左右滚动特效
2020/04/20 Javascript
js简单判断移动端系统的方法
2016/02/25 Javascript
jQuery根据name属性进行查找的用法分析
2016/06/23 Javascript
JS实现仿UC浏览器前进后退效果的实例代码
2017/07/17 Javascript
解决ant design vue 表格a-table二次封装,slots渲染的问题
2020/10/28 Javascript
[00:35]DOTA2上海特级锦标赛 VP战队宣传片
2016/03/04 DOTA
Python实现豆瓣图片下载的方法
2015/05/25 Python
python常用知识梳理(必看篇)
2017/03/23 Python
分析python切片原理和方法
2017/12/19 Python
Python通过Pygame绘制移动的矩形实例代码
2018/01/03 Python
python利用百度AI实现文字识别功能
2018/11/27 Python
python使用MQTT给硬件传输图片的实现方法
2019/05/05 Python
Python正则表达式匹配数字和小数的方法
2019/07/03 Python
Django分页功能的实现代码详解
2019/07/29 Python
python GUI库图形界面开发之PyQt5树形结构控件QTreeWidget详细使用方法与实例
2020/03/02 Python
Python如何根据时间序列数据作图
2020/05/12 Python
tensorflow 2.0模式下训练的模型转成 tf1.x 版本的pb模型实例
2020/06/22 Python
Android Q之气泡弹窗的实现示例
2020/06/23 Python
NFL欧洲商店(德国):NFL Europe Shop DE
2018/11/03 全球购物
数学与统计学院学生个人职业生涯规划书
2014/02/10 职场文书
物理系毕业生自荐书范文
2014/02/22 职场文书
学习实践科学发展观心得体会
2014/09/10 职场文书
交通事故赔偿协议书怎么写
2014/10/04 职场文书
机动车登记业务委托书
2014/10/08 职场文书
离婚协议书包括哪些内容
2014/10/16 职场文书
钳工实训报告总结
2014/11/04 职场文书
2014年银行信贷员工作总结
2014/12/08 职场文书
2015年政风行风工作总结
2015/04/21 职场文书
2015年卫生监督工作总结
2015/05/21 职场文书
标准版个人借条怎么写?以及什么是借条?
2019/08/28 职场文书
CSS SandBox应用场景及常见问题
2022/06/25 HTML / CSS