本教程是在Win7上操作的。
第一部分: 讲各个软件的安装。Fiddler很简单,不提。Pycharm的安装比较早,印象中安装不麻烦,但是破解麻烦,不提。在此详述Appium的安装:

首先要安装必备的软件。由appium-doctor可以知道一部分(当然在appium安装完毕之前,无法在cmd中输入appium-doctor),由下图可知,至少需要安装Android
SDK,jdk:
其次要安装Appium本身。

再次,若想使用Appium的高级功能,则必然要编程,在Appium中编程可以用Python,也可以用Java,也可以用Ruby,装一个即可,我选择的是Python(编译器选择:PyCharm)。
最后, PyCharm中使用Appium,必须安装Appium-python-client。
接下来,按软件一条条详述:

*
安装了nodejs,发现node.js会自动注册下面两个path:System System Path: C:\Program Files\node.js
User System Path: C:\Users<username>\AppData\Roaming\npm。

*
安装android,由于Android Studio过于庞大,所以仅下载Android SDK即可。Android
SDK安装下载不难,但是安装之后,注意只下载自己需要的SDK版本即可(关于需要下载哪些东西,参考此文档-
https://www.cnblogs.com/tsingke/p/9054044.html),不然下载时间过长,比如我下载了整整两天两夜。由于Android
<https://www.cnblogs.com/tsingke/p/9054044.html%EF%BC%89%EF%BC%8C%E4%B8%8D%E7%84%B6%E4%B8%8B%E8%BD%BD%E6%97%B6%E9%97%B4%E8%BF%87%E9%95%BF%EF%BC%8C%E6%AF%94%E5%A6%82%E6%88%91%E4%B8%8B%E8%BD%BD%E4%BA%86%E6%95%B4%E6%95%B4%E4%B8%A4%E5%A4%A9%E4%B8%A4%E5%A4%9C%E3%80%82%E7%94%B1%E4%BA%8EAndroid>
Studio过于庞大,所以仅下载Android SDK即可。Android
SDK安装下载不难,但是安装之后,注意只下载自己需要的SDK版本即可(关于需要下载哪些东西,参考此文档-
https://www.cnblogs.com/tsingke/p/9054044.html),不然下载时间过长,比如我下载了整整两天两夜。
<https://www.cnblogs.com/tsingke/p/9054044.html%EF%BC%89%EF%BC%8C%E4%B8%8D%E7%84%B6%E4%B8%8B%E8%BD%BD%E6%97%B6%E9%97%B4%E8%BF%87%E9%95%BF%EF%BC%8C%E6%AF%94%E5%A6%82%E6%88%91%E4%B8%8B%E8%BD%BD%E4%BA%86%E6%95%B4%E6%95%B4%E4%B8%A4%E5%A4%A9%E4%B8%A4%E5%A4%9C%E3%80%82>
安装Android SDK时的坑:
一定要更改SDK Path!我就安装错路径了。
下载并安装了Intel x86 Emulator Accelerator(HAXM
installer)(D:software/haxm-windows_v7_3_2.zip),但AVD Manager中仍然显示Not Compatible
with Windows.至于这有没有关系,目前还不知道,因为没有用过。
Android SDK安装之后,注意只下载自己需要的SDK版本即可(关于需要下载哪些东西,参考此文档-
https://www.cnblogs.com/tsingke/p/9054044.html),不然下载时间过长,比如我下载了整整两天两夜。
<https://www.cnblogs.com/tsingke/p/9054044.html%EF%BC%89%EF%BC%8C%E4%B8%8D%E7%84%B6%E4%B8%8B%E8%BD%BD%E6%97%B6%E9%97%B4%E8%BF%87%E9%95%BF%EF%BC%8C%E6%AF%94%E5%A6%82%E6%88%91%E4%B8%8B%E8%BD%BD%E4%BA%86%E6%95%B4%E6%95%B4%E4%B8%A4%E5%A4%A9%E4%B8%A4%E5%A4%9C%E3%80%82>

*
Java安装(jdk)。注意jdk安装时会两次要求填写安装路径,一次是jdk的,另一次是jre的:JAVA_HOME和path环境变量:
JAVA_HOME:C:\Program Files (x86)\Java\jdk-9.0.1
Path:;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin
其中%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin; 的意思:
设置Java环境变量。%JAVA_HOME%代表的是自定义的JAVA_HOME变量值。前者代表JDK所在目录,后者代表JRE命令目录。
Java安装的坑:

使用的Java版本是jdk-9.0.1。但是发现没有lib\dt.jar和lib\tools.jar。查询发现新版本就是没有,因此不需要配置CLASSPATH环境变量。因此只设置了JAVA_HOME和path环境变量:
JAVA_HOME:C:\Program Files (x86)\Java\jdk-9.0.1
Path:;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin

*
可以安装Appium_desktop,也可以安装Appium_Server,二者功能相同而后者长期不更新,所以只下载appium_desktop即可。

*

若想使用Appium的高级功能,则必然要编程,在Appium中编程可以用Python,也可以用Java,也可以用Ruby(使用较少)。如果用java开发,需要安装编译器(例如IntelliJ
IDEA),还要安装一个特殊的玩意–Maven,据说这货是管理第三方库的。用python的话要简单一些,因为编译器(例如Pycharm)我已经安装了,而且不需要什么第三方库管理器。所以我选择PyCharm。

*

PyCharm中使用Appium,必须安装Appium-python-client。如果没有Appium-python-client,则PyCharm无法调用Appium的相关API:



pip安装Appium-python-client(注:appium像是一个服务,而appium-python-client是让python连接appium服务的一个驱动,也就是一个python语言封装和appium
api通讯的一个库(python,java,js等):
pycharm中找不到appium,需要在File-Settings安装:


第二部分: 讲各个软件的使用。
1.Fiddler的使用方法:

首先配置手机,将4G网络设置成代理:需要注意的是长按,对于我来说,就是长按名字是“4G”的那个网络,并修改网络,设置如图片中所示。将ip地址配置成跟电脑一样的:



在手机浏览器中输入如下ip,并且点击"FiddlerRoot
certificate"进行安装,我的荣耀4x在点击后几秒就显示安装完毕,但是页面没有变化,我开始还以为没装好,实际操作时发现已经装好。

手机配置好之后,电脑上的Fiddler软件也要做一些设置,网上有很多教程,在此不详述。开始抓包,如此教程所说(
https://www.cnblogs.com/stevenshushu/p/9635097.html),将其中的代码插入Fiddler
<https://www.cnblogs.com/stevenshushu/p/9635097.html%EF%BC%89%EF%BC%8C%E5%B0%86%E5%85%B6%E4%B8%AD%E7%9A%84%E4%BB%A3%E7%A0%81%E6%8F%92%E5%85%A5Fiddler>
Script Editor,插入之后保存即可,不需要编译等就可以直接使用(我将他的代码中url保存的路径与名字修改了):

果真得到了不少URL:

2.Appium_Desktop的使用方法:
首先双击紫色图标:
其次,不要更改默认设置,直接点击Start Server v1.10.0:

最后,成功打开抖音的配置(注意,由于我只连接了一台真机,且没有开虚拟机,所以deviceName可以随便写):

2.1 Appium确定坐标:
本来打算用Android
SDK带的UIAutomaterViewer,但是打不开,网上说是Java版本不对。因此使用Appium-Desktop。用它打开New
Session后,可以看到如下界面:

如果界面的内容跟手机上的不一样,则点击刷新按钮,即可跟手机一致:
如果想查看某部分的位置,就点击:

并在界面上的定位,然后在右边找到bounds,它显示的是左上角和右下角的坐标。

Appium使用中的坑:
连接真机时,出现adb devices的问题:

解决方法: 添加了ANDROID_SDK_HOME这个环境变量,path中也添加了。并且拔下USB,重插之后,输入adb
devices时,手机界面上会显示“是否允许调试”之类,确定之后,解决上面 unauthorized的问题。
grep不是内部命令也不是外部命令的问题:

解决方法:加双引号

Appium寻找appPackage和appActivity的问题:
寻找这两个量有多种方法:
https://blog.csdn.net/mtbaby/article/details/78676477
<https://blog.csdn.net/mtbaby/article/details/78676477>
但是各个方法找到的值可以不一样,至于哪个是正确的,现在没有好的判断方法,只能自己去试验。
比如,方法一得到的结果:

方法三得到的结果(如果你安装了Appium,进入设置页,选择APK
路径,下面就会显示包名和Activity名称.appPackage即图片中的Package,而appActivity即图片中的Launch
Activity.):

方法五得到的结果:

最后实践发现,方法一是对的,方法三和五是错的:

从上图可以看出,如果Appium仅仅连接了一台机器(包括虚拟机在内),则deviceName可以随便写。
Appium报的错误:

网上说要加noReset,加上了,运行时间确实长了点,但还是报错:


解决方法:应该是appActivity后面多写了一个空格。

第三部分: 实战-获取URL并下载。
首先,使用Fiddler获取url,在此教程代码的基础上做了修改(
https://www.cnblogs.com/stevenshushu/p/9635097.html):
<https://www.cnblogs.com/stevenshushu/p/9635097.html%EF%BC%89%EF%BC%9A>
from appium import webdriver from time import sleep ##以下代码可以操控手机app 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 self.start_x =
500 self.start_y = 900 self.end_x = 500 self.end_y = 300 #self.distance = 600
def comments(self): #sleep(3) sleep(30) # app开启之后点击一次屏幕,确保页面的展示
#self.driver.tap([(500, 1200)], 500) self.driver.tap([(360, 648)], 500) def
scroll(self): # 无限滑动 while True: # 模拟滑动 #self.driver.swipe(self.start_x,
self.start_y, self.start_x, self.start_y - self.distance)
self.driver.swipe(self.start_x, self.start_y,self.end_x,self.end_y) # 设置延时等待
sleep(1) def main(self): self.comments() self.scroll() if __name__ ==
'__main__': action = Action() action.main()
果真获得了很多URL:

然后使用如下代码,分析URL并下载视频(https://www.cnblogs.com/stevenshushu/p/9635097.html
<https://www.cnblogs.com/stevenshushu/p/9635097.html>).注意代码中做了一处修改:
#############修改了原作者的代码: “% %” 改成了"%%"###############. 此程序会无限运行:
# _*_ coding: utf-8 _*_ import requests import sys headers =
{"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML,
like Gecko) Chrome/42.0.2311.90 Safari/537.36" } ##去重方法 def distinct_data():
##读取txt中文档的url列表 datalist_blank=[] pathtxt='D:/douyin.txt' with open(pathtxt)
as f: f_data_list=f.readlines()#d得到的是一个list类型 for a in f_data_list:
datalist_blank.append(a.strip())#去掉\n strip去掉头尾默认空格或换行符 # print(datalist)
data_dict={} for data in datalist_blank: #print(type(data),data,'\n')
#print(data.split('/'),'\n',data.split('/').index('m'),'\n') #url中以/为切分,在以m为切分
##把m后面的值放进字典key的位置,利用字典特性去重 if int(data.split('/').index('m'))==4 :#此处为v6开头的url
#print(data,44,data.split('/')[5]) data_key1=data.split("/")[5]
data_dict[data_key1]=data elif int(data.split('/').index('m'))==6:
#此处为v1或者v3或者v9开头的url
#print(data,66,data.split('/')[7],type(data.split('/')[7]))
data_key2=data.split("/")[7] data_dict[data_key2] =data
#print(len(data_dict),data_dict) data_new=[] for x,y in data_dict.items():
data_new.append(y) return data_new def responsedouyin():
data_url=distinct_data() # 使用request获取视频url的内容 #
stream=True作用是推迟下载响应体直到访问Response.content属性 # 将视频写入文件夹 num = 1 for url in
data_url: res = requests.get(url,stream=True,headers=headers) #res =
requests.get(url=url, stream=True, headers=headers) #定义视频存放的路径 pathinfo =
'D:/douyin-video/%d.mp4' % num #%d 用于整数输出 %s用于字符串输出 # 实现下载进度条显示,这一步需要得到总视频大小
total_size = int(res.headers['Content-Length']) #print('这是视频的总大小:',total_size)
#设置流的起始值为0 temp_size = 0 if res.status_code == 200: with open(pathinfo, 'wb')
as file: #file.write(res.content) #print(pathinfo + '下载完成啦啦啦啦啦') num += 1
#当流下载时,下面是优先推荐的获取内容方式,iter_content()函数就是得到文件的内容,指定chunk_size=1024,大小可以自己设置哟,设置的意思就是下载一点流写一点流到磁盘中
for chunk in res.iter_content(chunk_size=1024): if chunk: temp_size +=
len(chunk) file.write(chunk) file.flush() #刷新缓存
#############下载进度条部分start############### done = int(50 * temp_size /
total_size) #print('百分比:',done) #############修改了原作者的代码: "% %"
改成了"%%"############### sys.stdout.write("\r[%s%s] %d %%" % ('█' * done, ' ' *
(50 - done), 100 * temp_size / total_size)+" 下载信息:"+pathinfo + "下载完成啦啦啦啦啦")
sys.stdout.flush()#刷新缓存 #############下载进度条部分end###############
print('\n')#每一条打印在屏幕上换行输出 if __name__ == '__main__': responsedouyin()
Pycharm中的那些坑:
在运行Fiddler自动获取url的程序时报错,我怀疑跟下面有关系:

网上说很可能是VPN导致的,因此退出了我的VPN。
报错:adb.exe已停止工作,因此关闭了appium,fiddler等,又重启了appium,fiddler,用appium连接华为,结果出了这个问题:

查询发现好像是adb
devices有问题,结果一查果然是unauthorized的状态,于是拔掉usb线,然后再插上,提醒是否要usb调试,确定之后,appium就可以连接了。

一起薅马云爸爸的羊毛:

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:637538335
关注微信