查看原文
其他

爬取app内的数据!mitmproxy入门教程!python爬虫入门实战(五)

lamyoung 白玉无冰 2022-06-10

如何获取手机app内数据源信息?接下来以taptap手机app为例,获取单机排行榜数据。


   配置环境

首先在电脑上安装好 mitmproxy ,安装方法可以参考官网,以下是以macOS为例。

brew install mitmproxy

python3 和 requests 库,  openpyxl 库,国内可以用镜像安装,参考如下。

pip3 install openpyxl -i http://pypi.douban.com/simple --trusted-host=pypi.douban.compip3 install requests -i http://pypi.douban.com/simple --trusted-host=pypi.douban.com

还要引入一些系统库

import requestsfrom openpyxl import Workbookfrom openpyxl.drawing.image import Imageimport osimport randomimport time

将手机和电脑连入同一个 wifi , 并在手机上设置网络代理(一般在设置>>WLAN>>当前详情 内)。设置代理服务器主机名为电脑的地址,服务端口为8080。

手机上用浏览器打开网页,安装证书。



   数据获取

安装好 mitmproxy  之, 直接在电脑命令终端执行 mitmproxy 。

然后在手机上打开TapTap应用,选择发现->单机。可以在电脑终端看到许多http请求。

逐个点击进去后,选择 Response ,可以找到我们需要的数据的链接。

点击 Request 可以看到请求链接和参数,这些就是获取数据源的链接和参数。

在手机上多翻几页,多点几个链接详情,可以发现 from 参数是翻页参数。那么在 python3 中如何获取呢?参考如下

headers = { 'Accept': 'application/json' }def scrapy(index): params = { 'X-UA': 'V=1&PN=TapTap&VN_CODE=536&LOC=CN&LANG=zh_CN&CH=tencent',#'V%3D1%26PN%3DTapTap%26VN_CODE%3D536%26LOC%3DCN%26LANG%3Dzh_CN%26CH%3Dtencent', 'tag': '单机',#'%E5%8D%95%E6%9C%BA', 'sort': 'hits', 'from': f'{index*10}', 'limit': '10', } requests_url = 'https://api.taptapdada.com/app-tag/v1/by-tag' requests_page=requests.get(requests_url,headers=headers,params=params); if requests_page.status_code == 200: decode(requests_page.json())

使用 requests 的 get 方法可以传入 hearders 和 参数。因为返回的是 json 可以直接调用 json() 方法解析结构。


   数据分析

通过查看返回 json 里的内容和手机应用内的显示数据,大致可以找出对应数据的字段。

一起看下在 python 中如何处理的吧。

data_list=content['data']['list']for data in data_list: data_id = data['id'] data_title = data['title'] data_stat = data['stat'] link = f'https://www.taptap.com/app/{data_id}/' tags = ','.join([tag['value'] for tag in data['tags']]) icon_url = data['icon']['url'] score = data_stat['rating']['score'] fans_count = data_stat['fans_count'] #关注 hits_total = data_stat['hits_total'] #下载


   数据存储

这次我们用 Excel 保存数据,用到 openpyxl 库的处理。另外,我们还可以插入 icon 图标,可以先把图片下载到 icon 文件夹中,再读取数据时把图片插入表中。


先初始化表格第一行的内容,新建一个 icon 文件夹。

ICON_TEMP='icon'if os.path.isdir(ICON_TEMP)==False: os.mkdir(ICON_TEMP)
TITLE_LIST=['排名','id','游戏名称','地址','评分','关注','下载量','icon']wb = Workbook()dest_filename = 'taptap_rank.xlsx'ws1 = wb.activefor col in range(0, len(TITLE_LIST)):    _ = ws1.cell(column=col+1, row=1, value="{0}".format(TITLE_LIST[col]))row_count = 1

接着在读取每一条数据时,下载 icon 图片,将对应数据插入表中。

row_count = row_count+1 icon_path = os.path.join('.',ICON_TEMP, f'{data_id}.png')if os.path.isfile(icon_path)==False: time.sleep(random.random()*2) icon_r = requests.get(icon_url); with open(icon_path, 'wb') as fd: fd.write(icon_r.content)_ = ws1.cell(column=1, row=row_count, value="{0}".format(row_count-1))_ = ws1.cell(column=2, row=row_count, value="{0}".format(data_id))_ = ws1.cell(column=3, row=row_count, value="{0}".format(data_title))_ = ws1.cell(column=4, row=row_count, value="{0}".format(link))_ = ws1.cell(column=5, row=row_count, value="{0}".format(score))_ = ws1.cell(column=6, row=row_count, value="{0}".format(fans_count))_ = ws1.cell(column=7, row=row_count, value="{0}".format(hits_total))img = Image(icon_path)img.width=img.height=50ws1.add_image(img, f'H{row_count}')


结果预览:


   小结

首先通过 mitmproxy 代理获取数据链接和参数,接着对用手机的数据查找我们需要的参数,编写对应的处理代码,保存在 excel 表中。


以上就是我最新学到的东西,如果有错误或新想法欢迎留言指出!如果我学到新的东西,会第一时间分享给大家哦!




用 python 实现切割视频,加入水印,压缩并转成 gif !

python爬虫入门实战(四)动态爬取!

python爬虫入门实战(三)xpath!

python爬虫入门实战(二)多线程爬虫!

python爬虫入门实战!爬取博客文章标题和链接!

蚂蚁庄园运动会星星球!3D项目入门实战!


本文使用图片素材来自网络!版权归原作者所有,如有侵权还请联系!

本文仅供个人交流学习使用,请勿用于其他用途。

点击“阅读原文”查看完整代码



您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存