手机APP爬虫[爬虫专题(19)]

                                                                                      《目录》


原理

          手机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。

苹果的图片是找的,所以不是 192.168.1.68

       

         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的点点滴滴》。

评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值