mitmproxy实战-通过mitmdump爬取京东金榜排行数据

对于APP的数据爬取或需要构建复杂的接口参数数据的爬取可以通过mitmproxy抓包还原流量,解析流量数据包来获取。mitmproxy是一个免费的开源交互式的HTTPS代理工具。它类似于其他抓包工具如WireShark和Fiddler,支持抓取HTTP和HTTPS协议的数据包,并可以通过控制台形式进行操作。mitmproxy具有两个非常有用的组件:mitmdump和mitmweb。mitmdump是mitmproxy的命令行接口,可以直接抓取请求数据。

本文介绍通过通过mitmdump爬取京东金榜数据。

京东金榜只有H5小程序和京东APP才有,用直接http请求来爬取数据很麻烦需要找到相应的接口构建很复杂的参数。通过mitmproxy代理抓包,从流量包中解析需要的数据相对来说要容易得多。

一、准备工作

安装mitmproxy并配置客户端。具体步骤见《mitmproxy安装与配置》
如果需要通过APP爬取,需要安装APP的模拟器,这里推荐用夜神模拟器。
启动模拟器后APP的网络配置一样的要配置通过mitmproxy的代理,因为APP一般都是通过HTTPS访问的,还需要安装证书。

1、模拟器安卓操作系统安装证书

夜神模拟器可以直击访问本地的windows目录和模拟器的安卓目录,我们需要将mitmproxy的安卓证书传输到模拟器的安卓文件夹,点击夜神模拟器的文件助手
夜神模拟器的文件助手

将mitmproxy的安卓证书传到安卓端。
将mitmproxy的安卓证书传到安卓端

安装证书: 安卓模拟器–>设置–>安全–>从SD卡安装
安装证书

选择开始传到安卓文件夹中的证书文件
选择证书文件

输入PIN码
输入PIN码

为证书取个名字如mitmproxy,点击确定就可以了
证书命名

查看证书可以点击“用户凭据”
查看证书

可以看到mitmproxy的CA证书已经安装好了。
确认证书

2、模拟器安卓操作系统配置代理

安装好了CA证书,还要配置模拟器安卓操作系统的网络代理。
点击模拟其中的无线和网络中的WLAN
设置网络

选择默认的无线连接WiredSSID在弹出的菜单中选择“修改网络”
修改网络

设置mitmproxy的服务器主机IP和代理服务器端口,服务器主机IP就是宿主机windows主机的IP,端口就是起mitmproxy服务的端口。
设置代理

mitmproxy和模拟器都准备好以后就可以分析京东金榜的数据了。

二、分析数据

京东金榜H5小程序的地址是 https://h5.m.jd.com/babelDiy/Zeus/32xRoXWmepbBVHfDMoHMw2kGfHdF/index.html
我们可以用浏览器访问这个地址来分析需要爬取数据的接口和相应返回的数据格式。在这里可以到到京东金榜的数据接口是https://api.m.jd.com/client.action,通过POST请求来获取的金榜数据。
分析解耦

通过Preview仔细分析数据接口返回的金榜数据的JSON格式
分析数据

接下来我们就要根据接口和JSON格式的数据来写代码获取并解析相应的数据信息。

三、爬取数据

在这里我们通过response接口获取通过mitmproxy代理后的流量进行解析,实现对京东金榜数据的获取。爬取数据的jdrank_scripts.py具体代码如下:

import jsondef response(flow):url = 'https://api.m.jd.com/client.action'if flow.request.url.startswith(url):text = flow.response.textjson_data = json.loads(text)#print(json_data)#获取金榜排行if ('result' in json_data) and ('tabs' in json_data['result']):getMainGoldRank(json_data)#获取金榜排行商品列表if ('result' in json_data) and ('mainRank' in json_data['result']):getJDProductInfo(json_data)#获取商品信息if flow.request.url.startswith(url):text = flow.response.textjson_data = json.loads(text)if ('floors' in json_data) and len(json_data['floors'])>1:prod_skuId=json_data['floors'][0].get('data').get('extMap').get('skuId')prod_introduceInfo=textprint('-------prod_skuId-------:+++',prod_skuId)print(prod_skuId, prod_introduceInfo)# 获取金榜列表
def getMainGoldRank(json_data):tabs = json_data['result']['tabs']for tab in tabs:tabName = tab['tabName']  # 榜单名称tabData = tab['data']  # 榜单数据print(type(tabData))if type(tabData) is list:for rankdata in tabData:rankId = rankdata['id']rankTitle = rankdata['name']rankType = rankdata['rankType']skuId=Noneprint(tabName, rankId, rankType, rankTitle, skuId)if type(tabData) is dict:relatedAdvIds = tab['relatedAdvIds']if type(relatedAdvIds) is list:for relatedAdvId in relatedAdvIds:rankList = tabData[relatedAdvId]['rankList']for rankdata in rankList:rankId = rankdata['rankId']rankTitle = rankdata['rankType']rankType = rankdata['rankTitle']skuId = rankdata['skuId']print(tabName, rankId, rankType, rankTitle, skuId)#获取JD金榜商品概要信息
def getJDProductInfo(json_data):#if ('result' in json_data) and ('mainRank' in json_data['result']):print(json_data)try:products=json_data['result']['mainRank']['products']prod_main_rank=json_data['result']['mainRank']prod_rankId=prod_main_rank.get('id')#判断如果没有在main_gold_rank表中则添加记录至main_gold_rank表rankTitle=prod_main_rank.get('name')print('', prod_rankId,rankTitle , 13, '')for product in products:prod_skuId = product['product']['skuId']prod_name = product['product']['name']prod_img = product['product']['img']prod_skuSallingPoint = product.get('skuSallingPoint')prod_saleInfoStr = product.get('saleInfoStr')prod_simpleSaleInfoStr = product.get('simpleSaleInfoStr')prod_totalBuyInfoStr = product.get('totalBuyInfoStr')prod_goodCountStr = product.get('goodCountStr')prod_simpleGoodCountStr = product.get('simpleGoodCountStr')prod_totalPopularity = product.get('totalPopularity')prod_popularityStr = product.get('popularityStr')prod_cmttTag = product.get('cmttTag')prod_longTitle = product.get('longTitle')prod_authorityScore = product.get('authorityScore')prod_saleScore = product.get('saleScore')prod_popularityScore = product.get('popularityScore')prod_growthScore = product.get('growthScore')prod_praiseScore = product.get('praiseScore')prod_brandScore = product.get('brandScore')prod_brandStr = product.get('brandStr')prod_growthStr = product.get('growthStr')prod_sortedSaleIfoStr = product.get('sortedSaleIfoStr')prod_rankNum = product.get('rankNum')print(prod_rankId,prod_skuId,prod_name,prod_img,prod_skuSallingPoint,prod_saleInfoStr,prod_simpleSaleInfoStr,prod_totalBuyInfoStr,prod_goodCountStr,prod_simpleGoodCountStr,prod_totalPopularity,prod_popularityStr,prod_cmttTag,prod_longTitle,prod_authorityScore,prod_saleScore,prod_popularityScore,prod_growthScore,prod_praiseScore,prod_brandScore,prod_brandStr,prod_growthStr,prod_sortedSaleIfoStr,prod_rankNum)except Exception as e:print('getJDProductInfo Error:', e)

通过运行 mitmdump -s jdrank_scripts.py
从H5的小程序访问获取京东金榜的排行数据
获取京东金榜排行

获取京东金榜商品信息
获取京东金榜商品信息

从京东APP上访问京东金榜也是同样的效果。

至此,本文从环境准备到数据分析到代码实现,通过mitmdump爬取京东金榜排行数据进行mitmproxy爬取数据的实战。


作者博客:http://xiejava.ishareread.com/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/509093.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Netty学习——基础篇3(AIO编程)

1 概述 NIO 2.0 引入了新的异步通道概念,并提供了异步文件通道和异步套接字通道的实现。异步通道提供以下两种方式获取操作结果。 1、通过java.util.concurrent.Future类来表示异步操作的结果; 2、在执行异步操作的时候传入一个java.nio.channels Comple…

2024年阿里云最便宜云服务器价格:61元、165元、99元、199元

2024阿里云服务器优惠活动政策整理,阿里云99计划ECS云服务器2核2G3M带宽99元一年、2核4G5M优惠价格199元一年,轻量应用服务器2核2G3M服务器61元一年、2核4G4M带宽165元1年,云服务器4核16G10M带宽26元1个月、149元半年,云服务器8核…

【Micropython基础】TCP客户端与服务器

文章目录 前言一、连接Wifi1.1 创建STA接口1.2 激活wifi接口1.3 连接WIFI1.4 判断WIFI是否连接1.5 连接WIFI总体代码 二、创建TCP 客户端2.1 创建套接字2.2 设置TCP服务器的ip地址和端口2.3 连接TCP服务器2.3 发送数据2.4 接收数据2.5 断开连接2.6 示例代码 三、TCP服务器的创建…

深入了解手机App开发:从构思到上线的全过程

引言 在当今数字化时代,手机App已经成为人们日常生活中不可或缺的一部分,深刻地改变了我们的交流、工作、娱乐和购物方式。随着智能手机的普及,手机App的重要性愈发凸显,它们不仅为用户提供了便捷的工具和娱乐方式,还…

Qt/C++音视频开发67-保存裸流加入sps/pps信息/支持264/265裸流/转码保存/拉流推流

一、前言 音视频组件除了支持保存MP4文件外,同时还支持保存裸流即264/265文件,以及解码后最原始的yuv文件。在实际使用过程中,会发现部分视频文件保存的裸流文件,并不能直接用播放器播放,查阅资料得知原来是缺少sps/p…

Unity 脚本-生命周期常用函数

在Unity中,万物皆是由组件构成的。 右键创建C#脚本,拖动脚本到某物体的组件列表。 生命周期相关函数 using System.Collections; using System.Collections.Generic; using UnityEngine;// 必须要继承 MonoBehaviour 才是一个组件 // 类名…

【Redis】Redis 实现分布式Session

Cookie 保存在客户端浏览器中,而 Session 保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上,这就是 Session。客户端浏览器再次访问时只需要从该 Session 中查找该客户的状态就可以了。 在实际工作…

【全志D1-H 哪吒开发板】Debian系统安装调教和点灯指南

全志D1-H开发板【哪吒】使用Deabian系统入门 特别说明: 因为涉及到操作较多,博文可能会导致格式丢失 其中内容,会根据后续使用做优化调整 目录: 参考资料固件烧录启动调教点灯问题 〇、参考资料 官方资料 开发板-D1开发板【…

rtt的io设备框架面向对象学习-io设备管理层

目录 1.设备基类2.rtt基类2.1 rtt基类定义2.2 对象容器定义2.3 rtt基类构造函数 3.io设备管理接口4.总结 这层我的理解就是rtt基类和设备基类所在,所以抽离出来好点,不然每个设备类都要重复它。 诺,rtt基类和设备基类如下对象图,这…

【嵌入式——QT】QTreeWidget

QTreeWidget类是创建和管理目录树结构的类,QTreeWidget每一个节点都是一个QTreeWidgetItem对象,添加一个节点前需先创建。QTreeWidget类是一个便利类,它提供了一个标准的树widget,具有经典的基于item的界面,类似于Qt 3…

如何理解工程管理,与项目管理的区别与联系?

如何理解工程管理,与项目管理的区别与联系? 首先,项目管理并不是工程管理的子集,大家可能混淆了另一个“工程项目管理”的概念。 工程项目管理模板一键安装,进入链接即可查看和使用:https://www.jiandaoyu…

Running job: job_1709516801756_0003

** yarn运行卡在Running job: job_1709516801756_0003问题解决: ** 在运行wordcount时出现错误,一直卡住 运行命令:hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /input /output 出现错误&#xff1a…