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

记录一下如何用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会呈现手机上的所有请求,如下图

image

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

<pre style="box-sizing: border-box; outline: 0px; padding: 8px; margin: 0px 0px 24px; position: relative; font-family: Consolas; white-space: pre-wrap; word-wrap: break-word; overflow-x: auto; font-size: 12pt; line-height: 22px; color: rgb(0, 0, 0); background-color: rgb(43, 43, 43);">http://v1-dy.ixigua.com/http://v3-dy.ixigua.com/http://v9-dy.ixigua.com/</pre>

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

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

  1. import requests

  2. 文件路径

  3. path = 'D:/video/'

  4. num = 1788

  5. def response(flow):

  6. global num

  7. 经测试发现视频url前缀主要是3个

  8. target_urls = ['http://v1-dy.ixigua.com/', 'http://v9-dy.ixigua.com/',

  9. 'http://v3-dy.ixigua.com/']

  10. for url in target_urls:

  11. 过滤掉不需要的url

  12. if flow.request.url.startswith(url):

  13. 设置视频名

  14. filename = path + str(num) + '.mp4'

  15. 使用request获取视频url的内容

  16. stream=True作用是推迟下载响应体直到访问Response.content属性

  17. res = requests.get(flow.request.url, stream=True)

  18. 将视频写入文件夹

  19. with open(filename, 'ab') as f:

  20. f.write(res.content)

  21. f.flush()

  22. print(filename + '下载完成')

  23. num += 1

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

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

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

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

image

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

image

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

image

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

image
image

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

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

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

appPackage:App程序包名

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

image

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

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

image

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

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

image

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

  1. from appium import webdriver

  2. from time import sleep

  3. class Action():

  4. def init(self):

  5. 初始化配置,设置Desired Capabilities参数

  6. self.desired_caps = {

  7. "platformName": "Android",

  8. "deviceName": "Mi_Note_3",

  9. "appPackage": "com.ss.android.ugc.aweme",

  10. "appActivity": ".main.MainActivity"

  11. }

  12. 指定Appium Server

  13. self.server = 'http://localhost:4723/wd/hub'

  14. 新建一个Session

  15. self.driver = webdriver.Remote(self.server, self.desired_caps)

  16. 设置滑动初始坐标和滑动距离

  17. self.start_x = 500

  18. self.start_y = 1500

  19. self.distance = 1300

  20. def comments(self):

  21. sleep(2)

  22. app开启之后点击一次屏幕,确保页面的展示

  23. self.driver.tap([(500, 1200)], 500)

  24. def scroll(self):

  25. 无限滑动

  26. while True:

  27. 模拟滑动

  28. self.driver.swipe(self.start_x, self.start_y, self.start_x,

  29. self.start_y-self.distance)

  30. 设置延时等待

  31. sleep(2)

  32. def main(self):

  33. self.comments()

  34. self.scroll()

  35. if name == 'main':

  36. action = Action()

  37. action.main()

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

image
image
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,110评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,443评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,474评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,881评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,902评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,698评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,418评论 3 419
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,332评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,796评论 1 316
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,968评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,110评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,792评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,455评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,003评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,130评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,348评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,047评论 2 355