记录如何使用python爬取app数据。本文以爬取抖音视频应用为例。编程工具:pycharmapp抓包工具:mitmproxyapp自动化工具:appium运行环境:windows10假设我们需要的工具已经配置好使用mitmproxy抓取手机app抓包获取我们想要的内容使用appium自动化测试工具驱动app模拟人为动作(滑动、点击等)结合1和2实现自动爬虫的效果1.mitmproxy/mitmdump抓包确保mitmproxy已经安装,手机和PC在同一个局域网,以及还配置了mitmproxy。CA证书,网上有很多相关的配置教程,这里略过。由于mitmproxy不支持windows系统,这里使用了它的组件之一mitmdump。它是mitmproxy的命令行界面。可以用来连接我们的Python脚本,使用Python实现监控后处理。配置mitmproxy后,在控制台输入mitmdump,打开手机端的抖音app,mitmdump会显示手机端所有的请求,如下图:查看mitmdump显示的请求,会发现前缀是:http://v1-dy.ixigua.com/;http://v3-dy.ixigua.com/;http://v9-dy.ixigua.com/这三类前缀的url正是我们的目标抖音视频url。下一步是编写一个python脚本来下载视频。您需要使用mitmdump-sscripts.py(这里是python文件名)来执行脚本。importrequests#文件路径path='D:/video/'num=1788defresponse(flow):globalnum#测试后发现视频url前缀主要是3个target_urls=['http://v1-dy.ixigua.com/','http://v9-dy.ixigua.com/','http://v3-dy.ixigua.com/']forurlintarget_urls:#filteroutunnecessaryurlifflow.request.url.startswith(url):#设置视频名称filename=path+str(num)+'.mp4'#使用request获取视频url的内容#stream=True是延迟responsebody的下载,直到Response.content属性被访问res=requests.get(flow.request.url,stream=True)#将视频写入文件夹withopen(filename,'ab')asf:f.write(res.content)f.flush()print(filename+'下载完成')num+=1代码写的比较粗糙,但是基本逻辑还是比较清晰的,这样我们就可以下载抖音的视频了,但是这个方法有一个缺陷,就是要获取视频中,人们需要不断滑动抖音的下一个视频。有时我们可以使用强大的appium自动化测试工具来解决。2.appium模拟手机,保证appium依赖的环境Android和SDK已经配置好。网上也有很多教程,这里就不说了。appium的使用非常简单。首先,我们打开appium。启动界面如下:点击StartServer按钮启动appium服务。安卓手机通过数据线连接电脑,同时打开USB调试功能。可以输入adb命令(网上可以找到)来测试连接。如果出现如下结果,则连接成功。model为设备名称,后面配置时会用到。点击下图中箭头所指的按钮后,会出现配置页面。在右下角的JSONRepresentation中配置启动应用的DesiredCapabilities参数,分别是paltformName、deviceName、appPackage和appActivity。platformName:平台名称,一般为Android或iOS。deviceName:设备名称,具体手机类型appPackage:App包名appActivity:入口Activity名称,一般以.开头。可以通过以下方法获得。在控制台输入adblogcat>D:\log.log命令,并在手机端打开抖音app,然后打开D盘的log.log文件,找到Displayed关键字。从上图中我们可以知道Displayed后面的com.ss.android.ugc.aweme对应的是appPackage,.main.MainActivity对应的是appActivity。最后,我们的配置结果如下:MainActivity"}然后点击StartSession启动Android手机上的抖音app并输入Start页面,PC端会同时弹出调试窗口。在此窗口中,您可以预览当前的手机页面,模拟手机上的各种操作。这不是本文的重点,略过。下面我们将使用python脚本来驱动app,直接在pycharm中运行即可。fromappiumimportwebdriverfromtimeimportsleepclassAction():def__init__(self):#初始化配置,设置DesiredCapabilities参数self.desired_caps={"platformName":"Android","deviceName":"Mi_Note_3","appPackage":"com.ss.android.ugc.awesome","appActivity":".main.MainActivity"}#指定AppiumServerself.server='http://localhost:4723/wd/hub'#新建Sessionself.driver=webdriver.Remote(self.server,self.desired_caps)#设置滑动初始坐标和滑动距离self.start_x=500self.start_y=1500self.distance=1300defcomments(self):sleep(2)#app打开后,点击一次屏幕,确保显示pageself.driver.tap([(500,1200)],500)defscroll(self):#无限滑动whileTrue:#模拟滑动self.driver.swipe(self.start_x,self.start_y,self.start_x,self.start_y-self.distance)#设置延时等待sleep(2)defmain(self):self.comments()self.scroll()if__name__=='__main__':action=Action()action.main()下面是爬虫进程。ps:偶尔会爬取重复的视频。
