分享

怎么样抓取微信小程序

 鹰兔牛熊眼 2019-05-05

阅读文本大概需要 12 分钟。

一 爬虫万能公式

最近痴海接到一些新的需求,要抓取微信小程序上的内容。写过爬虫的同学都知道,无论什么爬虫大体的思路都是相的,都是要分析网络请求地址,模拟发送请求,然后解析返回的数据,最后保存相应的信息。

这里就可以给大家总结一个爬虫万能公式:

爬虫程序 = 网络请求 + 解析数据 + 保存数据

所有的爬虫都离不开这三个核心点,有些复杂的爬虫无非是在每个部分添加些别的内容。比如在网络请求部分,你需要添加请求头,伪装下自己的请求,让它看起来像一个正常人发送的请求。还有些网站需要破解验证码等等。而在解析数据中你需要熟悉至少一种解析方式,比如 Xpath、正则、JQuery、BS4 等。保存数据就需要你选择保存到哪里是 Mysql 还是 MongoDB 等等,甚至你要需要写些去重的策略等等。

每个部分细分开还有非常多的内容,但爬虫万变不离其宗,总的框架就是这三部分。细分的内容以后在慢慢写文章都教给大家。

今天我们就通过上面核心公式,通过如何抓取微信小程序,来讲解手机平台如何进行抓包。

二 微信小程序抓取

现在随着移动互联网的崛起,很多产品只有手机端,不会再花过多的时间和精力去搭建网页端的平台。所以做爬虫也一定要懂得如何在手机端上进行数据抓取。

手机端跟网页端的抓取大同小异,只不过手机端的请求路径,你是不能直观的看到。这里就需要借助一些代理软件来辅助分析手机端上的网络请求。

2.1 常用代理软件

手机上抓包原理其实很简单,就是在你手机上搭建一个代理,所有的请求都会走你搭建的代理,这样你就可以分析对应的请求。

而最经常用的代理软件有两个:1 Charles、2 Fiddler。

1 Charles

官网:

https://www./

适用平台:Windows、Mac

Charles 俗称的花瓶,是在 PC 端常用的网络封包截取工具,在做移动开发时,我们为了调试与服务器端的网络通讯协议,常常需要截取网络封包来分析。 

具体的使用教程可以看下面的链接,非常的详细的介绍了 Charles 各方面的功能。

https:///post/5b8350b96fb9a019d9246c4c

2 Fiddler

官网:

https://www./fiddler

适用平台:Windows

Fiddler 是一个 http 调试代理,以代理服务器的方式,监听系统的 Http 网络数据流动, Fiddler 也可以让你检查所有的 http 通讯,设置断点,以及 Fiddle 所有的“进出”的数据。

这两款软件我都有使用过,都大同小异。我个人推荐大家使用 Charles,一是它两个平台都可适用,二是它把请求结构化,看起来非常清晰。

具体的使用教程可以看下面的链接

http://www./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 及以上不太友好,容易导致变砖头机,所以使用此方法的建议配合模拟器使用。

VirtualXposed

上面介绍了 Xposed 框架,最麻烦在于必须 Root 设备,承担手机变砖和系统安全性方面的风险,对很多用户来说上手难度门槛较高。不过,随着黑科技般的 VirtualXposed 出现,大家终于可以免 Root 权限直接使用 Xposed 框架了。

具体的使用可以看这篇文章:

https://www./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./api/goods/detail

这个请求还是一个 POST 的请求。

请求页信息

通过请求页信息我们知道了请求头的构造都有哪些:

并且还知道请求的参数,我们在请求页点击底部的 Text 就可以看到。

所以我们在发送请求的时候,还需要把 token、for_wx_examine 和 goods_id 这三个参数一起带上。

响应页信息

通过响应页信息我们知道,请求返回的数据是 json 格式。

这样我们整个请求就分析完毕了,整个抓取就非常的清晰了。通过分析我们可以知道要发送一个 POST 的请求,请求的地址是

https://motiapi./api/goods/detail

这个 POST 的请求是需要带上三个参数的即:token 、for_wx_examine 和 goods_id

在程序中我们只需要把请求头信息带上,发送一个 POST 的请求就可以拿到数据了。

解析小程序数据

此次的小程序数据是 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.',
        'Connection''Keep-Alive'
    }

    url_v2 = 'https://motiapi./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 👇

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多