一、前言:
小红书的爬虫次要是从搜寻动手,爬取某个关键词下的所有笔记,通过调研发现有有两个渠道,第一个是 App,第二个小程序。先说小程序端,通过抓包发现,每篇文章对应着一个 auth-sign
,这个参数应该有小程序外部生成,无奈获取到,有种思路就是能够通过按键精灵或者 Mitmproxy 获取到每篇笔记的 auth-sign
,而后就能够通过接口去爬,这两头还须要一个自动化管制手机工具;再来说 App
端,须要有好几个加密参数 sign\token\shield
,之前 git 下面还有大神保护着一个服务器能够破解签名,当初曾经生效了,App 逆向临时还没学(已提上日程),所以还是用手机端的自动化测试工具来爬,次要软件有 Appium 和 Airtest,Appium 坑比拟大,不仅装置麻烦而且调试时极不不便,再者获取不到小红书笔记的详情页的页面构造,本文次要讲下应用 Airtest + Mitmproxy 进行手机端的爬虫,这两者加起来,能够解决 90% 的 App 爬虫吧,除了淘宝 … 但能够用 Pypeteer。
二、Airtest
Airtest 是一个跨平台的、基于图像识别 的 UI
自动化测试框架,实用于游戏和App
,反对平台有 Windows、Android 和 IOS,次要编写语言为 python。官网 -> 点我,官网文档 ->[[点我]](http://airtest.netease.com/do…,根本应用能够看下青南大佬的 blog ->[ [点我]](https://www.kingname.info/201…
Airtest 与 Appium 相比最大的长处是能够实时的看到页面的动静,而且反对图像识别进行点击等操作
三、应用 Airtest 自动化管制 App
后期的应用能够在 Airtest 自带的 IDE 中调试,毕竟边操作边看到界面是十分不便地,等成熟之后搬到 pycharm 中执行再思考作定时工作等
四、Airtest 根本 [Api] 应用:
-
获取元素:
ls = poco(name="com.xingin.xhs:id/aj8") 通过 name 获取
ls = poco(text=item.get_text()) 通过 text
poco("android.widget.LinearLayout").offspring("com.xingin.xhs:id/ak6") 通过目录树
- 点击元素:
x.click()
- 获取文本:
x.get_text()
- 滑动屏幕:
swipe([0.5, 0.8], [0.5, 0.7]) 从一个点到另一个点
- 是否存在:
x.exist()
- 安卓 ADB 操作:
from airtest.core.android.adb import ADB
adb = ADB(serialno='OF9SBMY59D69756L')
# 原始 adb shell 命令为 adb shell input keyevent 26
adb.start_shell('input keyevent 26') # 唤醒屏幕
# 启动 app app 包名
adb.start_shell('am start -n com.xingin.xhs/.activity.SplashActivity')
# 获取 app 包名
aapt dump badging C:\Users\xx\Desktop\xiaohongshu.apk
# launchable-activity: name='com.xingin.xhs.activity.SplashActivity'
其余 API
踩的一些坑
- 官网的问题示例 能解决大部分问题 [[点我]](http://airtest.netease.com/do…
- Airtest 与 pycharm 中执行脚本互斥 不能同时开
- 点击时可能会有两种 BUG 呈现,第一是点击无反馈,只能作容错解决;第二是点击内容在屏幕之外,这时须要上滑屏幕,而后再做点击
五、Mitmproxy
mitmproxy 是一个反对 HTTP 和 HTTPS 的抓包程序,相似 Fiddler、Charles 的性能,只不过它通过控制台的模式操作;应用 mitmproxy 最次要是应用它的一个组件 mitmdump,它能够通过 python 脚本解决响应内容,相似于 Fiddler 的界面抓包,然而咱们能够更加不便地拿到响应数据
- 装置 -> 点我
- 应用:
mitmdump -s mitm.py # 手机连贯电脑 ip:8080
# 拦挡某个链接
if flow.request.url.startswith(detail_url):
text = flow.response.text # 获取链接的响应
- 需注意每个链接都会通过这个办法
六、小红书
次要逻辑:
-
进入 App:
- 唤醒屏幕
adb.start_shell('input keyevent 26')
- 解锁
- 启动 APP
adb.start_shell('am start -n com.xingin.xhs/.activity.SplashActivity')
- 唤醒屏幕
- 启动 mitmproxy
mitmdump -s mitm.py
-
模仿操作:
- 获取以后界面列表页的所有商品,点击进入,mitm 会捕捉指标链接,在 mitm.py 解决数据
-
点击返回有三种办法:
- 通过页面返回按钮,实测按钮会点击无反馈;
- 通过 Airtest 的 touch 图像识别办法,需将图片放入同一门路下;
- 点击手机返回键,举荐!
adb.start_shell('input keyevent 4')
- 入库
- 退出程序,锁屏
- 补充:代码不多,次要是模仿人操作,而后加上容错判断,比方
if poco(name="com.xingin.xhs:id/aon").exists()
poco.wait_for_any(poco(name="com.xingin.xhs:id/al0"))
TiToData:业余的短视频、直播数据接口服务平台,网址:TiToData
笼罩支流平台:抖音,快手,小红书,TikTok,YouTube