编程工具:pycharm
应用抓包工具:mitmproxy
应用自动化工具:appium
运行环境:windows10
思路:
假设已经配置好我们所需要的工具
如图1所示,使用mitmproxy对手机应用抓包获取我们想要的内容
2,利用appium自动化测试工具,驱动应用程序模拟人的动作(滑动,点击等)
3,将1和2相结合达到自动化爬虫的效果
一,mitmproxy / mitmdump抓包
确保已经安装好了mitmproxy,并且手机和PC处于同一个局域网下,同时也配置好了mitmproxy的CA证书,网上有很多相关的配置教程,这里我就略过了。
因为mitmproxy不支持视窗系统,所以这里用的是它的组件之一mitmdump,它是mitmproxy的命令行接口,可以利用它对接我们的Python的脚本,用Python的实现监听后的处理。
在配置好mitmproxy之后,在控制台上输入mitmdump并在手机上打开抖音的应用程序,mitmdump会呈现手机上的所有请求,如下图
可以在抖音应用一直往下滑,看mitmdump所展示的请求,会发现前缀分别为
http://v1-dy.ixigua.com/;http://v3-dy.ixigua.com/;http://v9-dy.ixigua.com/
这3个类型前缀的网址正是我们的目标抖音视频网址。
那接下来就要编写python脚本将视频下载下来,需要使用mitmdump -s scripts.py(此处为python文件名)来执行脚本。
- 导入 请求
- #文件路径
- path = 'D:/ video /'
- NUM = 1788
- def 反应(流程):
- 全球 NUM
- #经测试发现视频网址前缀主要是3个
- target_urls = 'http://v1-dy.ixigua.com/' , 'http://v9-dy.ixigua.com/' ,
- 'http://v3-dy.ixigua.com/' ]
- 对于 URL 在 target_urls:
- #过滤掉不需要的网址
- 如果 flow.request.url.startswith(url):
- #设置视频名
- filename = path + str(num)+ '.mp4'
- #使用请求获取视频网址的内容
- #stream = True作用是推迟下载响应体直到访问Response.content属性
- res = requests.get(flow.request.url,stream = True )
- #将视频写入文件夹
- 与开放(文件名, 'ab' )为f:
- f.write(res.content)
- f.flush()
- print (文件名+ '下载完成' )
- num + = 1
代码写得比较粗糙,不过基本的逻辑还是比较清晰的,这样我们就可以把抖音的视频下载下来,不过这个方法有个缺陷,就是获取视频需要人来不断地滑动抖音的下一个视频,这时候我们可以用一个强大的appium自动化测试工具来解决。
二,Appium对手机进行模拟操作
确保已经配置好appium所依赖的环境的Android SDK和,网上也有许多教程,这里我就不说了。
appium的用法很简单,首先我们先打开appium,启动界面如下
点击Start Server按钮即可启动appium服务
将Android的手机通过数据线与PC相连,同时打开USE调试功能,可以输入ADB命令(具体可以去网上查找)测试连接情况,若出现以下结果,则说明连接成功
模型是设备名,后面配置需要用到。之后点击下图箭头所指的按钮就会出现一个配置页面
在右下角的JSON表示配置启动app的Desired Capabilities参数,分别是paltformName,deviceName,appPackage,appActivity。
platformName:平台名称,一般是安卓或iOS版。
设备名称:设备名称,手机的具体类型
appPackage:应用程序包名
appActivity:入口活动名,通常以开头。
platformName和DEVICENAME比较容易获得,而appPackage和appActivity这两个可以通过以下方法获取到。
在控制台上输入adb logcat> D:\ log.log命令,并且在手机打开抖音app,然后在D盘中打开log.log文件,查找显示关键字
由上图可以知道显示后面的com.ss.android.ugc.aweme对应的是appPackage,.main.MainActivity对应的是appActivity,最后我们的配置结果如下:
{ “platformName”:“Android”, “deviceName”:“Mi_Note_3”, “appPackage”:“com.ss.android.ugc.aweme”, “appActivity”:“.main.MainActivity” }
再点击开始会话即可启动Android手机上的抖音应用程序并进入到启动页面,同时PC上会弹出一个调试窗口,从这个窗口可以预览当前手机页面,还可以对手机模拟各种操作,在本文不是重点,所以略过。
在下面我们将使用Python的脚本来驱动的应用程序,直接在pycharm运行即可
- 从 appium 导入 webdriver
- 从 时间 导入 睡眠
- 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服务器
- 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 评论(个体):
- 睡觉(2 )
- #app开启之后点击一次屏幕,确保页面的展示
- 自.driver.tap([(500 , 1200 )], 500 )
- def scroll(self ):
- #无限滑动
- 而真:
- #模拟滑动
- self .driver.swipe(self .start_x, self .start_y, self .start_x,
- self .start_y- self .distance)
- #设置延时等待
- 睡觉(2 )
- def main(self ):
- self .comments()
- self .scroll()
- 如果 __name__ == ' __main__ ' :
- action = Action()
- action.main()
下面是爬虫的过程.PS:偶尔会爬取到重复的视频