![v2-4ca4339b8ae293a375d4e430f2305fcd_1440w.jpg?source=172ae18b](http://img-03.proxy.5ce.com/view/image?&type=2&guid=fa825485-b12a-eb11-8da9-e4434bdf6706&url=https://pic2.zhimg.com/v2-4ca4339b8ae293a375d4e430f2305fcd_1440w.jpg?source=172ae18b)
昨天小帅b看到一些事情不顺眼
有人偷换概念
忍不住就写了一篇反讽 996 的
看不下去了,我支持996,年轻人就该996!
没想到有些人看不懂
这就算了
还来骂我
早些时候关注我的小伙伴应该知道我第一时间就发过反对 996 的文章
去他妈的996!
python之父就是牛逼
哎~
不过也好
洗掉一些无脑假粉丝
“你个假粉丝,小帅b不是蔡徐坤”
![v2-f80015d6711dc04ce71f7f833f6a801a_b.jpg](http://img-03.proxy.5ce.com/view/image?&type=2&guid=fa825485-b12a-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-f80015d6711dc04ce71f7f833f6a801a_b.jpg)
好了
进入正题
上次
小帅b跟你说了如何安装 Appium 的相关环境
以及让它自动打开了手机上的微信App
python爬虫23 | 手机,这次要让你上来自己动了。这就是 Appium+Python 的牛x之处
相信你已经跃跃欲试
想要来爬取一些手机上的 APP 数据了
那么这次
小帅b就带你爬取微信朋友圈的数据
接下来就是
学习 python 的正确姿势
![v2-fcdbc9d9c7533c06383942625b3fedbd_b.jpg](http://img-01.proxy.5ce.com/view/image?&type=2&guid=fa825485-b12a-eb11-8da9-e4434bdf6706&url=https://pic2.zhimg.com/v2-fcdbc9d9c7533c06383942625b3fedbd_b.jpg)
友情提醒
本篇需要你先安装好 Appium 相关环境才可以哟,如果你还没安装的话快点出门左转,安装完之后再来这里玩耍。
ok
首先我们要知道微信这个 apk 的包名和启动页的 Activity
将你的 Android 鸡连接到电脑
在终端输入 adb devices 确保你已经将你的鸡连接到电脑
![v2-aba205a4e8002074a3c735ce95dd57b3_b.png](http://img-02.proxy.5ce.com/view/image?&type=2&guid=fa825485-b12a-eb11-8da9-e4434bdf6706&url=https://pic4.zhimg.com/v2-aba205a4e8002074a3c735ce95dd57b3_b.png)
如果像上面这样出现设备名称就说明你连接上你的电脑了
如果你插进电脑之后还没发现有任何设备名称显示
那就记得打开 USB 调试,多拔插几次,总会连上的,这是过来人经验
![v2-b1187987fed9e2d6eb55b1d92b3d0acf_b.jpg](http://img-02.proxy.5ce.com/view/image?&type=2&guid=fa825485-b12a-eb11-8da9-e4434bdf6706&url=https://pic4.zhimg.com/v2-b1187987fed9e2d6eb55b1d92b3d0acf_b.jpg)
接着
在你的手机里面打开微信
然后打开你的终端输入
adb shell
然后输入
dumpsys activity | grep mFocusedActivity
![v2-6772d88463e1025af5c3f018a7c510f9_b.jpg](http://img-03.proxy.5ce.com/view/image?&type=2&guid=fa825485-b12a-eb11-8da9-e4434bdf6706&url=https://pic2.zhimg.com/v2-6772d88463e1025af5c3f018a7c510f9_b.jpg)
这时候我们就获取到微信的包名和启动页面的名称了
我们还要知道我们的手机是什么版本的
输入以下命令获取
adb shell getprop ro.build.version.release
那么现在我们就知道了这些必要的信息了
desired_caps = {}
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '5.1'
desired_caps['deviceName'] = '88CKBM622PAM'
desired_caps['appPackage'] = 'com.tencent.mm'
desired_caps['appActivity'] = '.ui.LauncherUI'
![v2-ae40aa3d0b374ef739fda228acb64ce5_b.jpg](http://img-02.proxy.5ce.com/view/image?&type=2&guid=fa825485-b12a-eb11-8da9-e4434bdf6706&url=https://pic2.zhimg.com/v2-ae40aa3d0b374ef739fda228acb64ce5_b.jpg)
接下来
主要思路就是
自动开启微信
模拟登录微信
找到小帅b的朋友圈
把朋友圈的数据抓下来
想要模拟登录
我们就需要获取到微信的登录按钮这个元素
如何获取呢?
在你安装好的 sdkmanager 的 tool 目录下
有一个叫做 uiautomatorviewer 的工具
windows用户直接双击打开
ubuntu的话可以进入相应的目录
用命令 ./uiautomatorviewer 行打开
~/android/tools/bin$ ./uiautomatorviewer
打开之后是这个鸟样
![v2-dd19b84d05d87d48d038e909eff20854_b.jpg](http://img-02.proxy.5ce.com/view/image?&type=2&guid=fa825485-b12a-eb11-8da9-e4434bdf6706&url=https://pic1.zhimg.com/v2-dd19b84d05d87d48d038e909eff20854_b.jpg)
我们点击菜单栏的第二个图标按钮
![v2-d8832d01f1ae133a96b954d676e5ff2c_b.png](http://img-02.proxy.5ce.com/view/image?&type=2&guid=fa825485-b12a-eb11-8da9-e4434bdf6706&url=https://pic1.zhimg.com/v2-d8832d01f1ae133a96b954d676e5ff2c_b.png)
这时候你就会发现
手机的屏幕被抓过来了
用鼠标点一下登录按钮你会看到
相应的资源信息都被定位到了
![v2-95eeeaecc83e800de8a7dd851ab73951_b.jpg](http://img-02.proxy.5ce.com/view/image?&type=2&guid=fa825485-b12a-eb11-8da9-e4434bdf6706&url=https://pic2.zhimg.com/v2-95eeeaecc83e800de8a7dd851ab73951_b.jpg)
那么要让它自动点击登录按钮就简单了
# 获取到登录按钮后点击
login_btn = self.wait.until(EC.element_to_be_clickable((By.ID, "com.tencent.mm:id/e4g")))
login_btn.click()
点击登录之后页面是这样的
![v2-011308e4258bbba928c8131118f48689_b.jpg](http://img-03.proxy.5ce.com/view/image?&type=2&guid=fa825485-b12a-eb11-8da9-e4434bdf6706&url=https://pic2.zhimg.com/v2-011308e4258bbba928c8131118f48689_b.jpg)
我们要切换到用邮箱登录
还是老样子
我们获取到按钮,然后让它点击
# 获取使用微信号登录按钮
change_login_btn = self.wait.until(EC.element_to_be_clickable((By.ID, "com.tencent.mm:id/cou")))
change_login_btn.click()
那么接下来就输入账号密码了
![v2-4bfda33ae2534b95daed1ecda1eeebab_b.jpg](http://img-03.proxy.5ce.com/view/image?&type=2&guid=fa825485-b12a-eb11-8da9-e4434bdf6706&url=https://pic4.zhimg.com/v2-4bfda33ae2534b95daed1ecda1eeebab_b.jpg)
恩
获取到账号和密码的 EditText 和 登录按钮
然后自动输入账号密码
最后点一下登录
# 获取输入账号元素并输入
account = self.wait.until(EC.presence_of_element_located((By.XPATH, '//*[@resource-id="com.tencent.mm:id/cos"]/android.widget.EditText')))
account.send_keys("你的微信账号")
# 获取密码元素并输入
password = self.wait.until(EC.presence_of_element_located((By.XPATH, '//*[@resource-id="com.tencent.mm:id/cot"]/android.widget.EditText')))
password.send_keys("你的微信密码")
# 登录
login = self.wait.until(EC.element_to_be_clickable((By.ID, "com.tencent.mm:id/cov")))
login.click()
登录之后会弹出一个界面
你愿意把你的通讯录授权给我吗?
呵呵
no!
![v2-bd8085e2f11302654ebf9e9cc3ec546a_b.jpg](http://img-03.proxy.5ce.com/view/image?&type=2&guid=fa825485-b12a-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-bd8085e2f11302654ebf9e9cc3ec546a_b.jpg)
# 点击去掉通讯录提示框
no_btn = self.wait.until(EC.element_to_be_clickable((By.ID, "com.tencent.mm:id/az9")))
no_btn.click()
这样
我们就成功登入微信了
![v2-88e1744f9b595e5886df413f9e2c5258_b.jpg](http://img-02.proxy.5ce.com/view/image?&type=2&guid=fa825485-b12a-eb11-8da9-e4434bdf6706&url=https://pic1.zhimg.com/v2-88e1744f9b595e5886df413f9e2c5258_b.jpg)
接下来找到小帅b的微信
![v2-7e66b771676a998d04c839d633bc654a_b.jpg](http://img-01.proxy.5ce.com/view/image?&type=2&guid=fa825485-b12a-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-7e66b771676a998d04c839d633bc654a_b.jpg)
需要点击上方的搜索按钮
# 获取到搜索按钮后点击
search_btn = self.wait.until(EC.element_to_be_clickable((By.ID, "com.tencent.mm:id/iq")))
search_btn.click()
这时候会出现输入框
![v2-12226f1cf9cff609f53b8855c3644494_b.jpg](http://img-01.proxy.5ce.com/view/image?&type=2&guid=fa825485-b12a-eb11-8da9-e4434bdf6706&url=https://pic1.zhimg.com/v2-12226f1cf9cff609f53b8855c3644494_b.jpg)
搜索小帅b本b
# 获取搜索框并输入
search_input = self.wait.until(EC.presence_of_element_located((By.ID, "com.tencent.mm:id/kh")))
search_input.send_keys("wistbean")
这时候会出现一个 item
![v2-9870b57bf43ed12ff20569591b7c9153_b.jpg](http://img-02.proxy.5ce.com/view/image?&type=2&guid=fa825485-b12a-eb11-8da9-e4434bdf6706&url=https://pic4.zhimg.com/v2-9870b57bf43ed12ff20569591b7c9153_b.jpg)
没错
点击头像进去
# 点击头像进入
xiaoshuaib_btn = self.wait.until(EC.element_to_be_clickable((By.ID, "com.tencent.mm:id/py")))
xiaoshuaib_btn.click()
接下来几步都是一个道理
主要是进入小帅b的朋友圈
# 点击右上角...进入
menu_btn = self.wait.until(EC.element_to_be_clickable((By.ID, "com.tencent.mm:id/jy")))
menu_btn.click()
# 再点击头像
icon_btn = self.wait.until(EC.element_to_be_clickable((By.ID, "com.tencent.mm:id/e0c")))
icon_btn.click()
# 点击朋友圈
moment_btn = self.wait.until(EC.element_to_be_clickable((By.ID, "com.tencent.mm:id/d86")))
moment_btn.click()
就这样点进去
![v2-3f6372e46fd5be1499e22510481dcdfa_b.jpg](http://img-02.proxy.5ce.com/view/image?&type=2&guid=fa825485-b12a-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-3f6372e46fd5be1499e22510481dcdfa_b.jpg)
进入朋友圈之后
我们来分析一下
![v2-a13f7744996ef868a3edc2de505dc617_b.jpg](http://img-01.proxy.5ce.com/view/image?&type=2&guid=fa825485-b12a-eb11-8da9-e4434bdf6706&url=https://pic4.zhimg.com/v2-a13f7744996ef868a3edc2de505dc617_b.jpg)
可以看到小帅b的朋友圈是这样的
我们需要滑动获取到更多内容
可以使用 Appium 的 swipe 方法
再来
我们需要循环获取到数据
![v2-5257548af8f8cbc191d70c5a4254bf37_b.jpg](http://img-02.proxy.5ce.com/view/image?&type=2&guid=fa825485-b12a-eb11-8da9-e4434bdf6706&url=https://pic4.zhimg.com/v2-5257548af8f8cbc191d70c5a4254bf37_b.jpg)
可以看到每条朋友圈都被封装到 ListView 这个容器里面
所以我们要从这里面获取所有数据
然后再进行遍历
那么每一个具体的条目呢?
![v2-5841d0d1191441dcd0ff87ad4b4e75fd_b.jpg](http://img-02.proxy.5ce.com/view/image?&type=2&guid=fa825485-b12a-eb11-8da9-e4434bdf6706&url=https://pic2.zhimg.com/v2-5841d0d1191441dcd0ff87ad4b4e75fd_b.jpg)
可以看到
数据被放在了 LinearLayout 的具体容器里面了
所以我们可以根据 id 获取相应的内容
# 获取 FrameLayout
items = self.wait.until(EC.presence_of_all_elements_located((By.ID, 'com.tencent.mm:id/eew')))
# 滑动
self.driver.swipe(self.start_x, self.start_y, self.end_x, self.end_y, 2000)
#遍历获取
for item in items:
moment_text = item.find_element_by_id('com.tencent.mm:id/kt').text
day_text = item.find_element_by_id('com.tencent.mm:id/eke').text
month_text = item.find_element_by_id('com.tencent.mm:id/ekf').text
print('抓取到小帅b朋友圈数据: %s' % moment_text)
print('抓取到小帅b发布时间: %s月%s' % (month_text, day_text))
至此
我们的代码写完了
来运行一下吧
首先打开 Appium
[Appium] Welcome to Appium v1.12.1
[Appium] Appium REST http interface listener started on 0.0.0.0:4723
接着运行爬取朋友圈的代码
截取部分结果
微信启动...
登录成功...
搜索小帅b...
进入朋友圈...
抓取到小帅b朋友圈数据: 那天马云说:我从来没碰过钱,我对钱没兴趣。
最近马云说:能 996 是一种福气,我每天都 1212。
果然,有钱爸爸说话就是好听。
抓取到小帅b发布时间: 4月月12
抓取到小帅b朋友圈数据: 有本事双击我头像
抓取到小帅b发布时间: 4月月10
抓取到小帅b朋友圈数据: 刚点了外卖,小哥有点超时才送到。我倒不觉得有什么,可是小哥将餐物双手递给我后接下来的动作让我惊讶到了:
他对我深深地鞠了一躬……
抓取到小帅b发布时间: 4月月01
抓取到小帅b朋友圈数据: 有人抱怨现在的互联网产品太霸道,微信不能打开淘宝链接,头条不能放微信二维码,百度搜不到知乎高质量问题……
但其实出门看一下,好像也没有哪家麦当劳可以直接开在肯德基里面卖全家桶的。
抓取到小帅b发布时间: 3月月29
抓取到小帅b朋友圈数据: 有人抱怨现在的互联网产品太霸道,微信不能打开淘宝链接,头条不能放微信二维码,百度搜不到知乎高质量问题……
但其实出门看一下,好像也没有哪家麦当劳可以直接开在肯德基里面卖全家桶的。
抓取到小帅b发布时间: 3月月28
抓取到小帅b朋友圈数据: 这两天听到最多的一句话就是:帅b老仙,法力无边。
整的我差点以为自己有法力了……
抓取到小帅b发布时间: 3月月25
抓取到小帅b朋友圈数据: 夸夸群,写几个微信机器人放群里,搞点夸奖人的语句数据库,根据用户的话检索一下,然后返回相应的夸奖语句。
嗯,然后把我自己放进群里,享受一顿夸,觉得不爽还可以继续改那些夸我的话。
抓取到小帅b发布时间: 3月月22
抓取到小帅b朋友圈数据: 突然发现我好久好久没有讲潮汕话了...
抓取到小帅b发布时间: 3月月20
抓取到小帅b朋友圈数据: 夸夸群,写几个微信机器人放群里,搞点夸奖人的语句数据库,根据用户的话检索一下,然后返回相应的夸奖语句。
嗯,然后把我自己放进群里,享受一顿夸,觉得不爽还可以继续改那些夸我的话。
抓取到小帅b发布时间: 3月月15
抓取到小帅b朋友圈数据: 根据监管部门规定以及相关投诉
这条朋友圈无法观看,但你可以点赞
抓取到小帅b发布时间: 3月月10
抓取到小帅b朋友圈数据: 之前想的是再好的产品也抵不过有强大 IP 支撑的破产品。
但现在想想,IP 也是产品的一部分。
抓取到小帅b发布时间: 3月月05
抓取到小帅b朋友圈数据: 之前想的是再好的产品也抵不过有强大 IP 支撑的破产品。
但现在想想,IP 也是产品的一部分。
抓取到小帅b发布时间: 3月月04
抓取到小帅b朋友圈数据: 9102了,还是有那么多 zf 的网站又丑又难用。
抓取到小帅b发布时间: 3月月01
...
ok
拿到数据还可以进一步存储
小帅b就不说了
因为从下一篇开始
小帅b会说说爬取下来的数据存储相关的
这一篇
主要让你知道如何爬取 app 的数据
如果你想去抓包爬取朋友圈的数据
是很难的
微信做了限制
所以用 Appium 相对来说就简单好多啦
本篇涉及到的源代码一样放在了公众号
在后台发送 「朋友圈」获取
下次见
peace
![v2-2eceec9e17ff414236bd2b3dfccded91_b.gif](http://img-01.proxy.5ce.com/view/image?&type=2&guid=fa825485-b12a-eb11-8da9-e4434bdf6706&url=https://pic2.zhimg.com/v2-2eceec9e17ff414236bd2b3dfccded91_b.gif)
帅b老仙
法力无边
![v2-47f08e6411ad8bb62aeffacf5d92bb10_b.jpg](http://img-02.proxy.5ce.com/view/image?&type=2&guid=fa825485-b12a-eb11-8da9-e4434bdf6706&url=https://pic1.zhimg.com/v2-47f08e6411ad8bb62aeffacf5d92bb10_b.jpg)
相关文章
1、对于b站这样的滑动验证码,不好意思,照样自动识别
2、手机,这次要让你上来自己动了。这就是 Appium+Python 的牛x之处
3、上来,自己动 !这就是 selenium 的牛逼之处
点赞
发功+1