• 本节先来初步尝试手机模拟操作,为之后爬取微信朋友圈的实战演练做铺垫。

4.2.1 用Android Studio 连接夜神模拟器

  • 要操控手机App,得先连接到手机。前面安装的夜神模拟器就是用来模拟Android系统手机的,因此,先打开夜神模拟器,然后在如右图所示的搜索栏中搜索微信,并进行安装。

1.打开手机的开发者模式

  • 对于Android 系统手机,还需要打开其开发者模式,之后才能进行模拟操作。单击设置–关于手机–连续单击“版本号”5次–,会使手机进行开发者模式。同时记住显示的版本号,4.2.2节中编写代码时会用到。

2.连接夜神模拟器

  • 在命令行中输入并执行命令“adb connect 127.0.0.1:62001”,如果显示“connected to 127.0.0.1:62001”,便表示连接成功,如下图所示。如果第一次连接失败,可重复输入上述命令进行连接。如果一直连接失败,则注意检查4.1节的各软件是否安装正确。

android模拟手机系统 安卓模拟手机_App

  • “adb connect 127.0.0.1:62001”中的adb 是 Android Studio中用来调试Android App 的应用程序,全称为Android Debug Bridge(Android 系统调试桥)。因为在4.1.4节配置好了Android Studio 的环境变量,所以在这里能直接调用adb。connect是“连接”的意思。
  • 127.0.0.1:62001指要连接的夜神模拟器的地址,127.0.0.1是本机地址,62001是夜神模拟器的默认端口。如果打开了多个夜神模拟器,那么新打开的夜神模拟器的端口便不是62001。4.5 节会讲解如何多开夜神模拟器,并查看不同模拟器的端口。

3. 验证是否连接成功

  • 在命令行窗口中输入并执行命令“adb devices”,如果显示“List of devices attached”(连接的设备列表)及相关地址,则表示连接成功,如下图所示。

android模拟手机系统 安卓模拟手机_android模拟手机系统_02

4.用adb查看App信息

  • adb的操作有很多,不过在手机App爬虫中,我们只需要了解如何用它查看手机App信息(主要是包名和活动名)。在夜神模拟器中打开微信,单击“登录”按钮进入登录页面,建议先手动登录一遍,体验一下在计算机模拟App操作的效果,之后再次登录,进入微信就会看到如下图所示的页面。
  • 然后在之前的命令行窗口中输入并执行命令
  • dumpsys | grep mFocusedActivity”,按enter键,结果如下图所示。
  • android模拟手机系统 安卓模拟手机_android模拟手机系统_03

  • 在命令的执行结果中,‘u0’后的“com.tencent.mm”是微信App的包名(对应之后要讲的Appium中的appPackage);“/”号后的“.plugin.account.ui.LoginPasswordUI”则是对应的活动名(对应之后要讲的Appium中的appActivity,注意不要遗漏开头的“.”号),即登录页面,一个App中不同页面(如登录页、找回密码页等)的活动名也会不同。

4.2.2 用Python连接微信App

  • 获得了包名和活动名之后,注意不要关闭命令行窗口,因为需要通过tab保持Android Studio和夜神模拟器的连接。然后开始进行用Python连接手机App的操作。
  • 打开Appium,然后单击界面右上角的开始按钮启动服务,可以看到该Appium的地址为127.0.0.1(本机地址),对应的端口为4723,如下图所示。后续会用到这两个参数。
  • 然后就可以通过如下Python代码连接夜神模拟器了,连接成功的同时,会在夜神模拟器中自动安装一个名为Appium-Settings的App。
from appium import webdriver #从Appium库导入webdriver功能

desires_caps = {
    'newCommandTimeout':3600, # 设置3600秒无操作则退出Appium
    'platformName':'Android', # Android 平台
    'deviceName':'127.0.0.1:62001', # 模拟器设备名,默认端口62001
    'platformVersion':'2.0.0', # 平台版本号,4.2.1节已获取
    'udid':'127.0.0.1:62001', #设备id,和设备名相同
    'appPackage':'com.tencent.mm', # 包名,4.2.1节已获取
    'appActivity':'.plugin.account.ui.LoginPasswordUI' # 活动名,4.2.1 节已获取
}

browser = webdriver.Remote('http://127.0.0.1:4723/wd/hub',desires_caps) #连接手机,并打开微信

android模拟手机系统 安卓模拟手机_android模拟手机系统_04

  • 为了避免下面获取的是夜神首页的源代码而不是登录页面的源代码,我在jup运行网上述代码后,手动点击“微信”,进入微信登录页面后,在运行获取源代码的代码。
  • 接着通过如下代码获取登录页面的源代码:
data = browser.page_source
data
  • 运行上面代码时需要保持打开登录页面。如果遇到闪退,可以用time库的sleep()函数等待一段时间,手动打开登录页面,或者在jup中分区块运行代码。
  • 打印输出的部分内容如下图所示,可以看到其中有“用短信验证码登录”和“登录”等字样,说明成功地获取了微信App登录页面的源代码。