《目录》
原理
手机app一般以 json 传输,和网页一样。
只是网页的 url 地址在搜索栏中获取即可,但 app 完全看不到其 url 在哪里!
因此,爬取 app 最难的就是获取ta的url。
我们可以找一个工具帮我们拦截 手机app 与 服务器 之间的通信的数据,其中就包含了 url 地址。
我推荐 Charles,您可以把 ta 想成一个代理 ip。
因为手机不会显示 url ,因此我们并没有获取 url 的方式了。
所以,我们可以通过 Charles 获取需要的 url。
下载工具
请先下载好一个工具:Charles,破解后不要在线升级。
Mac:
4.2.8原版,https://pan.baidu.com/s/1XucDjCXJaMFZeZkddfdkzQ,5uuf;破解:[help] -> [Register Charles] 中随意输入账号和激活码完成注册,OS X 10.7或更高。
4.2.7中文版,https://pan.baidu.com/s/1yYqnoZp1pEg8UMxC92cbEg,s6xd;破解:见图,
java程序:https://sdifen.pipipan.com/fs/1855249-315430471
Windows:
4.2.5原版:https://pan.baidu.com/s/1WdG_QcU9YCqWGO38DU0R2Q,qfnk;破解见图,
启动 Charles 后,第一次 Charles 会请求给它设置系统代理理的权限,点击 [Grant Privileges] 允许按钮,输入登录密码授予 Charles 该权限。
Charles 的配置
中文版界面如图,
结构(Structure)视图:将网络请求按访问的域名分类。
序列(Sequence)视图:将网络请求按访问的时间排序。
过滤(Filter)功能:可输入关键字,快速筛选出 URL 中带指定关键字的网络请求。
截取⼿机设备上的网络封包
首先,手机和电脑连同一个 WIFI,或者手机开热点电脑连接。
电脑端 Charles 配置:在 Charles 的菜单栏上选择 “代理(Proxy)”->”代理设置(Proxy Settings)”,填⼊代理端口 8888,并且勾上 “启用透明 HTTP 代理(Enable transparent HTTP proxying)”。
手机移动端配置:点击 Charles 的 “帮助(Help)” -> ”本机IP地址(Local IP Address)”,可获取 Charles 运⾏所在电脑的 IP 地址;
iPhone:在 iPhone 的 “ 设置 “->” ⽆线局域网 “ 中,可看到当前连接的 wifi 名,通过点击右边的详情键, 在其最底部有HTTP 代理—>配置代理,我们将其切换成手动,而后填上 Charles 运行所在 的电脑的 IP,以及端⼝号 8888。

Android:不同手机可能会有一点点不同,划屏下来点击 “wifi 的图标”,看到许多 WIFI,以及当前连接的 wifi 名。
摁住当前连接的 wifi(请确保手机与电脑连接的wifi相同) 2 秒的样子,会出现 “修改网络”,点进去。
将 “显示高级选项” 打勾,代理 调成 “手动”,服务器主机名填 "本机IP地址",获取方式看上面,服务器端口填 8888。
设置后,打开 手机 上的任意需要网络通讯的程序,就可以看到 Charles 弹出 手机 请求连接 的确认菜单,点击 “Allow” 即可完成设置。
p.s.这时候可以点一些喜欢的app,看一下 Charles 会不会有反应。如果app是联网的会有反应,但里面但内容可能是乱码。
截取 Https 通讯信息
Https 协议属于加密协议,要想截取分析 Https 协议相关的内容,需要安装 Charles 的 CA 证书,否则会乱码。
1. 代理(Proxy) –> SSL代理设置(SSL Proxying Setting) –> 启用SSL代理(Enable SSL Proxying) 点击 添加(Add),编辑Location, 输入主机(Host): * , Port: 443(因为443是 HTTPS 的端口号),点击 OK。
2. PC 端证书安装: 帮助(Help) –> SSL代理(SSL Proxying) –> 安装Charles Root证书(Install Charles Root Certificate) ,选择 Charles 的证书,并信任此证书,接着输入密码即可。
3. 移动端证书安装: 帮助(Help) –> SSL代理(SSL Proxying) –> 在移动设备上安装Charles Root证书(Install Charles Root Certificate on a Mobile Device) , 安装弹出的对话框要求,⼿机配置好端⼝为 8888 的代理之后,在⼿机浏览器 访问 http://chls.pro/ssl 就可以下载证书并安装了,这个证书是 1.84K。
⼿机浏览器:iPhone 需要 Safari ,安卓 (应该) 需要 手机自带浏览器,不行的话多试一下,还是不行改成默认浏览器和常用浏览器。比如,我的是华为麦芒6,用华为浏览器即可,下载内容会自动弹出来。
4. 安卓⼿机安装证书 帮助(Help) –> SSL 代理(SSL Proxying) –>保存 Charkes 根证书(Save Charles Root Certificate)... ,选择 要保存的文件⽬录,点击 Save, 将保存的⽂件传到⼿机(可以使用QQ\微信\蓝牙\...),点击手机的 设置 -> WLAN -> 高级设置 -> 安装证书 ,找到⽂件保存目录(安卓手机用MT文件管理器会很容易找到),安装完成,这个证书是 1.86K。
对于 iOS 10.3 以上的⼿机需要设置证书信任:点击 通用 -> 关于本机 -> 证书信任设置 -> 选择 Charles 的证书打开,安卓不需要。
配置好了,重启电脑即可。
手机点击app,看源代码分析,可得到访问的url。
如在手机打开keep,可以看到charles跳出很多的请求,就像我们在浏览器器中分析是一样的,我们拿到请求的url等接⼝信息,就可以在代码中使用了。
爬虫过程如同《爬虫探索时》,因为俩者都是 json 传输,不过需要手动添加许多参数以及软件的url需要自己对比app内容找出来。
爬app keep ,一个健身软件。
import requests, json
# keep首页
url = 'https://api.gotokeep.com/search/v2/spotlight'
# headers 的参数需要自己手动添加
headers = {
'Host':'api.gotokeep.com',
'x-model-raw':'iPhone8,1',
'x-screen-width':'375',
'Cookie':'authorization=Bearer%20eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJfaWQiOiI1YTg0ZDU5NjFjZjNkMTNhZDdiZjI0NmIiLCJ1c2VybmFtZSI6Iui2heWHoS13IiwiYXZhdGFyIjoiaHR0cDovL3N0YXRpYzEuZ290b2tlZXAuY29tL2F2YXRhci8yMDE4LzAyLzE1LzA4LzM4ODk5ODlhMGNkZjkwY2QzMWU1ZDBjMzM2ZDg3NDQ3OWJjYzI0YmUuanBnIiwiZ2VuZGVyIjoiTSIsImRldmljZUlkIjoiOWFkMTg3NTU5NDBjNGUwNTkyZTIyMzhiYmMzMTM3OTc2Y2UwMWYyZCIsImlzcyI6Imh0dHA6Ly93d3cuZ290b2tlZXAuY29tLyIsImV4cCI6MTU2MDIxODMxOCwiaWF0IjoxNTUxNTc4MzE4fQ.Tpeu2lz4BnFdc2DyU2C1btMb1GJVxfIM-o66dBcVTgw; x-abtest-tags=400013A%2C620011D%2C630001B%2C800013B; x-app-platform=keepapp; x-channel=Apple%20Store; x-device-id=9ad18755940c4e0592e2238bbc3137976ce01f2d; x-is-new-device=false; x-keep-timezone=Asia%2FShanghai; x-locale=zh-Hans-CN; x-manufacturer=Apple; x-model=iPhone%206S; x-model-raw=iPhone8%2C1; x-os=iOS; x-os-version=12.1.4; x-request-id=4744524153f847dc37cb95726eba3f67; x-screen-height=667; x-screen-width=375; x-user-id=5a84d5961cf3d13ad7bf246b; x-version-code=16946; x-version-name=6.12.0; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%225a84d5961cf3d13ad7bf246b%22%2C%22props%22%3A%7B%22%24latest_referrer%22%3A%22%22%2C%22%24latest_referrer_host%22%3A%22%22%2C%22%24latest_traffic_source_type%22%3A%22%E7%9B%B4%E6%8E%A5%E6%B5%81%E9%87%8F%22%2C%22%24latest_search_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC_%E7%9B%B4%E6%8E%A5%E6%89%93%E5%BC%80%22%7D%2C%22%24device_id%22%3A%22163583423c053b-061f74c9a0d862-f50654d-250125-163583423c12ba%22%7D',
'User-Agent':'Keep/6.13.0 (iPhone; iOS 12.1.4; Scale/2.00)',
'x-is-new-device':'false',
'x-timestamp':'1555057985737',
'x-bundleId':'com.gotokeep.keep',
'x-os':'iOS',
'x-abtest-tags':'650002C,300013B,600027C,660001B,620012B,610018B,200015A',
'x-keep-timezone':'Asia/Shanghai',
'x-device-id':'9ad18755940c4e0592e2238bbc3137976ce01f2d',
'x-os-version':'12.1.4',
'x-channel':'Apple Store',
'x-model':'iPhone 6S',
'Connection':'keep-alive',
'x-locale':'zh-Hans-CN',
'x-version-code':'17381',
'Authorization':'Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJfaWQiOiI1YTg0ZDU5NjFjZjNkMTNhZDdiZjI0NmIiLCJ1c2VybmFtZSI6Iui2heWHoS13IiwiYXZhdGFyIjoiaHR0cDovL3N0YXRpYzEuZ290b2tlZXAuY29tL2F2YXRhci8yMDE4LzAyLzE1LzA4LzM4ODk5ODlhMGNkZjkwY2QzMWU1ZDBjMzM2ZDg3NDQ3OWJjYzI0YmUuanBnIiwiZ2VuZGVyIjoiTSIsImRldmljZUlkIjoiOWFkMTg3NTU5NDBjNGUwNTkyZTIyMzhiYmMzMTM3OTc2Y2UwMWYyZCIsImlzcyI6Imh0dHA6Ly93d3cuZ290b2tlZXAuY29tLyIsImV4cCI6MTU2MzY5NjY3MiwiaWF0IjoxNTU1MDU2NjcyfQ.VWDsydTXkJWDLWYgjhubbyUK2Npv33sE-As5txZmYI8',
'x-version-name':'6.13.0',
'Accept-Language':'zh-Hans-CN;q=1, zh-Hant-CN;q=0.9, en-CN;q=0.8, zh-Hant-HK;q=0.7, zh-HK;q=0.6',
'x-user-id':'5a84d5961cf3d13ad7bf246b',
'Accept':'*/*',
'Accept-Encoding':'br, gzip, deflate',
'x-screen-height':'667',
'x-manufacturer':'Apple',
'x-app-platform':'keepapp',
}
res = requests.get(url, headers=headers).text
# 将返回的json数据转成字典格式
res_dict = json.loads(res)
data = res_dict['data']
with open('keep.txt', 'a') as f:
for i in data:
f.write(str(i)+'\n')
爬app 喜马拉雅,一个听书软件。
import requests, json
# 喜马拉雅----》经典必听页面
url = 'http://140.207.215.238/discovery-category/aggregateRankList/concreteRankList?rankingListId=69&pageId=1&pageSize=20'
headers = {
'GET':'/discovery-category/aggregateRankList/concreteRankList?rankingListId=69&pageId=1&pageSize=20 HTTP/1.1',
'Host':'mobile.ximalaya.com',
'xi-re':'true',
'Accept':'*/*',
'Cookie':'domain=.ximalaya.com; path=/; channel=ios-b1; 1&_device=iPhone&7AAB32DC-AD25-413F-BC8E-2CC616A6E3B1&6.5.63; impl=com.gemd.iting; NSUP=42E8B08C%2C421FE7FB%2C1555060246592; XUM=7AAB32DC-AD25-413F-BC8E-2CC616A6E3B1; c-oper=%E7%A7%BB%E5%8A%A8; net-mode=WIFI; res=750%2C1334; 1&_token=58050662&4CA510CB1B274NdVEB1AA6C379F454E71B7078EE41BAECA1537A0699475B4FC06E3B554A74F4A919; idfa=7AAB32DC-AD25-413F-BC8E-2CC616A6E3B1; x_xmly_ts=1555060301818; x_xmly_resource=xm_source%3Asquare%26xm_medium%3Ahomepage%26xm_item%3Aiting; x_xmly_tid=1257793468; device_model=iPhone6s; x-mulehorse-bucketIds=,; XD=skPyWgeNCE+zMjxediYIhYrNnk6TO0PYdHYTW8fuc6Av0XCdyjAyUgp7Ux9I6f5olGi797AGCuYmRHxXY1vugA==; x-abtest-bucketIds=100017,100030,100122,100034,100090,100088,100112,100082,100125,100168,100193,100183,100251,100186,100337,100363,100437,100448,100461,100457',
'User-Agent':'ting_v6.5.63_c5(CFNetwork, iOS 12.1.4, iPhone8,1)',
'Accept-Language':'zh-Hans-CN;q=1, zh-Hant-CN;q=0.9, en-CN;q=0.8, zh-Hant-HK;q=0.7, zh-HK;q=0.6',
'Accept-Encoding':'gzip, deflate',
'Connection':'keep-alive'
}
res = requests.get(url,headers=headers).text
res_dict = json.loads(res)
voice_list = res_dict['list']
with open('ximalaya.txt','a') as f:
for voice in voice_list:
print(voice)
# 标签
tags = voice['tags']
# 标题
title = voice['title']
# 简介
intro = voice['intro']
f.write(title+'\n')
如果还有问题,参见《Charles的点点滴滴》。