怎么样抓取微信小程序

640?wx_fmt=png

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


一 爬虫万能公式


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


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


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


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


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


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


二 微信小程序抓取


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


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


2.1 常用代理软件


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


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


1 Charles


640?wx_fmt=png


官网:


https://www.charlesproxy.com/


适用平台:Windows、Mac


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


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


https://juejin.im/post/5b8350b96fb9a019d9246c4c


2 Fiddler


640?wx_fmt=png


官网:


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 这款软件。


640?wx_fmt=png


2.2 安卓 7.0 以上新特性


Android 7.0 之后,系统默认不再信任用户自己安装的证书。也就是说如果你现在使用的安卓版本是 7.0 以上的,你自己安装的证书,系统默认不再信任的。


而手机上的网络请求都是 https 加密过的,没有信任的证书,你就无非抓到包。


而要解决这个问题有以下五种办法。


1 降低你的安卓版本


首先第一种办法就是降低你的安卓版本到 7.0 以下,那就不会用到新的特性。但这样的做法并不推荐。


2 使用 HttpCanary 软件


640?wx_fmt=jpeg


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 之后的抓包解决方案。


640?wx_fmt=png

640?wx_fmt=png

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商城一款产品详细信息


640?wx_fmt=png


小程序搜索「MOTI商城」即可找到。


640?wx_fmt=png

接下来我们就用开头说到的爬虫核心公式来一步步的拆解:


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


1 分析小程序网络请求

        

首先根据上面的 HttpCanary 教程安装相应的软件,然后我们开始进行抓包分析。


640?wx_fmt=jpeg


这是我们点击进入小程序首页看到的一些请求,我们在点击小程序里任意一个商品,在看看都有哪些新的请求。


640?wx_fmt=png


注意到这里多了一个 detail 的请求,我们点开详情具体查看。


总揽页信息


640?wx_fmt=png



通过总揽页我们知道了数据的请求地址:


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


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


请求页信息


640?wx_fmt=png

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


640?wx_fmt=png


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


640?wx_fmt=jpeg


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



响应页信息


640?wx_fmt=png


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


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


https://motiapi.modubus.com/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.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())



到此整个教程就结束了,觉得教程不错的同学不妨点个在看,就是给痴海最大的支持。


人必有痴,而后有成

640?wx_fmt=jpeg

点击无 bug 👇

  • 7
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值