赞
踩
阅读文本大概需要 12 分钟。
一 爬虫万能公式
最近痴海接到一些新的需求,要抓取微信小程序上的内容。写过爬虫的同学都知道,无论什么爬虫大体的思路都是相的,都是要分析网络请求地址,模拟发送请求,然后解析返回的数据,最后保存相应的信息。
这里就可以给大家总结一个爬虫万能公式:
爬虫程序 = 网络请求 + 解析数据 + 保存数据
所有的爬虫都离不开这三个核心点,有些复杂的爬虫无非是在每个部分添加些别的内容。比如在网络请求部分,你需要添加请求头,伪装下自己的请求,让它看起来像一个正常人发送的请求。还有些网站需要破解验证码等等。而在解析数据中你需要熟悉至少一种解析方式,比如 Xpath、正则、JQuery、BS4 等。保存数据就需要你选择保存到哪里是 Mysql 还是 MongoDB 等等,甚至你要需要写些去重的策略等等。
每个部分细分开还有非常多的内容,但爬虫万变不离其宗,总的框架就是这三部分。细分的内容以后在慢慢写文章都教给大家。
今天我们就通过上面核心公式,通过如何抓取微信小程序,来讲解手机平台如何进行抓包。
二 微信小程序抓取
现在随着移动互联网的崛起,很多产品只有手机端,不会再花过多的时间和精力去搭建网页端的平台。所以做爬虫也一定要懂得如何在手机端上进行数据抓取。
手机端跟网页端的抓取大同小异,只不过手机端的请求路径,你是不能直观的看到。这里就需要借助一些代理软件来辅助分析手机端上的网络请求。
2.1 常用代理软件
手机上抓包原理其实很简单,就是在你手机上搭建一个代理,所有的请求都会走你搭建的代理,这样你就可以分析对应的请求。
而最经常用的代理软件有两个:1 Charles、2 Fiddler。
1 Charles
官网:
https://www.charlesproxy.com/
适用平台:Windows、Mac
Charles 俗称的花瓶,是在 PC 端常用的网络封包截取工具,在做移动开发时,我们为了调试与服务器端的网络通讯协议,常常需要截取网络封包来分析。
具体的使用教程可以看下面的链接,非常的详细的介绍了 Charles 各方面的功能。
https://juejin.im/post/5b8350b96fb9a019d9246c4c
2 Fiddler
官网:
https://www.telerik.com/fiddler
适用平台:Windows
Fiddler 是一个 http 调试代理,以代理服务器的方式,监听系统的 Http 网络数据流动, Fiddler 也可以让你检查所有的 http 通讯,设置断点,以及 Fiddle 所有的“进出”的数据。
这两款软件我都有使用过,都大同小异。我个人推荐大家使用 Charles,一是它两个平台都可适用,二是它把请求结构化,看起来非常清晰。
具体的使用教程可以看下面的链接
http://www.hangge.com/blog/cache/detail_1697.html
这里要提醒大家 2 个比较坑的点:
1 确保你的手机是否和电脑处于同一个局域网
2 确保你安装了相应的证书
具体的设置方法在上面的链接都有讲到,如果你安装了相应的软件之后无法抓包,就在这两个地方检查下是否设置正确。
手机端为分为 ios 和安卓端的,由于我手上没有 ios 手机,今天这篇文章也就不重点介绍,如果你想在 ios 手机上抓包推荐使用 Thor 这款软件。
2.2 安卓 7.0 以上新特性
Android 7.0 之后,系统默认不再信任用户自己安装的证书。也就是说如果你现在使用的安卓版本是 7.0 以上的,你自己安装的证书,系统默认不再信任的。
而手机上的网络请求都是 https 加密过的,没有信任的证书,你就无非抓到包。
而要解决这个问题有以下五种办法。
1 降低你的安卓版本
首先第一种办法就是降低你的安卓版本到 7.0 以下,那就不会用到新的特性。但这样的做法并不推荐。
2 使用 HttpCanary 软件
HttpCanary 是 Android 平台下功能最强大的抓包和注入工具,支持 HTTP、HTTPS、HTTP2 和 WebSocket 等多种协议。
GitHub 地址:
https://github.com/MegatronKing/HttpCanary
下载地址:
https://github.com/MegatronKing/HttpCanary/wiki/Downloads
使用教程:
https://github.com/MegatronKing/HttpCanary/tree/master/docs/v1/zh-CN
这个软件在使用教程里,提供了安卓 7.0 之后的抓包解决方案。
3 Xposed + JustTrustMe
Xposed 框架(Xposed framework)是一套开放源代码的、在 Android 高权限模式下运行的框架服务,可以在不修改 APK 文件的情况下修改程序的运行(修改系统),基于它可以制作出许多功能强大的模块,且在功能不冲突的情况下同时运作。
JustTrustMe 是 Github 上的一个开源工程,他是一个 Xposed 模块,用来禁止SS L证书验证。以下是其简介。
JustTrustMe:An xposed module that disables SSL certificate checking. This is useful for auditing an appplication which does certificate pinning.
具体的教程可以看这里
https://www.jianshu.com/p/310d930dd62f
Xposed 框架对 Android 7.0 及以上不太友好,容易导致变砖头机,所以使用此方法的建议配合模拟器使用。
4 VirtualXposed
上面介绍了 Xposed 框架,最麻烦在于必须 Root 设备,承担手机变砖和系统安全性方面的风险,对很多用户来说上手难度门槛较高。不过,随着黑科技般的 VirtualXposed 出现,大家终于可以免 Root 权限直接使用 Xposed 框架了。
具体的使用可以看这篇文章:
https://www.iplaysoft.com/virtualxposed.html
安装来 VirtualXposed 之后,相当于给手机安装了一个虚拟环境,你在这个虚拟环境中安装需要抓取的 APP,之后配合 Charles 就可以进行抓包分析了。
5 把 Charles 证书设置为系统证书
前面说过安卓 7.0 之后第三方安装的证书,系统是不会给予信任的。那么我们反过来想,只要把第三方证书设置成系统证书就好。
需要注意这个方法也需要 root 权限,但属于一劳永逸的做法。
把普通证书安装到系统证书的方法可以看下面的链接
https://github.com/XndroidDev/Xndroid/issues/9#issuecomment-350525543
三 实战练习
上面一共介绍了五种在安卓 7.0 之后抓取方式,每种方法都有自己的优缺点。大家尽量以易用的原则去选取,接下来我就使用 HttpCanary 这款软件来给大家实战抓取一个小程序。
抓取目标:MOTI商城一款产品详细信息
小程序搜索「MOTI商城」即可找到。
接下来我们就用开头说到的爬虫核心公式来一步步的拆解:
爬虫程序 = 网络请求 + 解析数据 + 保存数据
1 分析小程序网络请求
首先根据上面的 HttpCanary 教程安装相应的软件,然后我们开始进行抓包分析。
这是我们点击进入小程序首页看到的一些请求,我们在点击小程序里任意一个商品,在看看都有哪些新的请求。
注意到这里多了一个 detail 的请求,我们点开详情具体查看。
总揽页信息
通过总揽页我们知道了数据的请求地址:
https://motiapi.modubus.com/api/goods/detail
这个请求还是一个 POST 的请求。
请求页信息
通过请求页信息我们知道了请求头的构造都有哪些:
并且还知道请求的参数,我们在请求页点击底部的 Text 就可以看到。
所以我们在发送请求的时候,还需要把 token、for_wx_examine 和 goods_id 这三个参数一起带上。
响应页信息
通过响应页信息我们知道,请求返回的数据是 json 格式。
这样我们整个请求就分析完毕了,整个抓取就非常的清晰了。通过分析我们可以知道要发送一个 POST 的请求,请求的地址是
https://motiapi.modubus.com/api/goods/detail
这个 POST 的请求是需要带上三个参数的即:token 、for_wx_examine 和 goods_id
在程序中我们只需要把请求头信息带上,发送一个 POST 的请求就可以拿到数据了。
2 解析小程序数据
此次的小程序数据是 json 格式的,所以我们在第一步发送了请求之后,只需要调用 response.json() 函数就可以得到具体的数据了。
3 保存小程序数据
数据比较简单,结构也非常清晰,所以我就以 json 的格式保存到本地文件中即可。
关键的代码(这里面的 token 有可能会失效,还是以你们自己抓到的为主):
def get_sale(goods_id):
headers_v2 = {
'charset': 'utf-8',
'Accept-Encoding': 'gzip',
'referer': 'ttps://servicewechat.com/wx79a7f4da1fc3bdd6/39/page-frame.html',
'content-type': 'application/x-www-form-urlencoded',
'User-Agent': 'Mozilla/5.0 (Linux; Android 8.0.0; MIX 2 Build/OPR1.170623.027; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/71.0.3578.99 Mobile Safari/537.36 MicroMessenger/7.0.4.1420(0x27000439) Process/appbrand2 NetType/WIFI Language/zh_CN',
'Content-Length': '65',
'Host': 'motiapi.modubus.com',
'Connection': 'Keep-Alive'
}
url_v2 = "https://motiapi.modubus.com/api/goods/detail"
params_v2 = {
'token': 'e5f5c910d74190f5672805f3eadc8a',
'for_wx_examine': 0,
'goods_id': 93
}
response = requests.post(url_v2, data=params_v2, headers=headers_v2)
with open("moti_{}.json".format(time.strftime("%Y-%m-%d")), 'a') as f:
f.write(json.dumps(response.json(), ensure_ascii=False, indent=2) + "\n")
data = response.json()
data['name'] = 'moti'
col.insert_one(data)
print(response.json())
到此整个教程就结束了,觉得教程不错的同学不妨点个在看,就是给痴海最大的支持。
人必有痴,而后有成
点击无 bug ?
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。