使用Python定制mitmproxy 开发APP数据爬虫

鳄鱼君

发表文章数:642

Vieu四代商业主题

高扩展、安全、稳定、响应式布局多功能模板。

¥69 现在购买
首页 » Python » 使用Python定制mitmproxy 开发APP数据爬虫

mitmproxy的强大之处在于它带一个mitmdump命令。这个命令可用来运行符合一定规则的Python脚本,不完全的是Python的语法,并在Python脚本里面直接操作HTTP和HTTPS的请求,和返回的数据包。

这篇文章就来介绍如何在Python脚本中获得请求和返回的数据包,那么首先你需要在Python中安装mitmproxy。

Python中安装Mitmproxy

在Pycharm的terminal终端安装,非常简单,输入:

pip install --default-timeout=5000 mitmproxy

考虑到国内安装速度非常慢,通常会报错超时异常,所以设置了时间。检测是否安装成功,其实最后是有提示的,不成功它一直卡着,成功了就也卡着,需要手动关掉。我们可以使用import mitmproxy 来测试时候报错,从而知道是否成功。

在Python定制Mitmproxy

mitmproxy官网有关于Python定制的例子,你可以去看一下,如果打不开,可以在这里进行学习!

在pycharm中运行Python代码,你需要在当前文件夹下打开Terminal终端,然后 mitmdump -s 脚本名字 。这是一种固定的用法。那么在下面的代码中我不会在说明如何运行脚本,和脚本的名字,你已经知道该如何做了。

请求数据包

我们从简单的请求数据开时,我们在pycharm里面敲如下代码:

def request(flow):
    print(flow.request.headers)

以上代码会显示APP请求头部信息,我们按照上面讲的方式运行代码,然后就可以终端看到以下输出:

使用Python定制mitmproxy 开发APP数据爬虫

出了显示请求头信息以外,还可以查看请求的Cookies或者body,只需要修改代码:

def request(flow):
    response=flow.request
    print('请求的url:',response.url)
    print('当前响应的请求方式:',response.method)
    print('当前Cookies:',response.cookies)
    print('请求的body:',response.text)

返回的结果不在演示,他会是我们预料的内容。

返回数据包

对于网站返回的数据,我们通常叫做response,那么我们定义一个response()函数:

import json
def response(flow):
    response=flow.response
    print('返回的头部信息:',response.headers)
    print('返回的body信息:',json.loads(response.content))

需要注意的是,代码采用json来处理返回的数据,意味着必须是json数据才可以,如果不是Python的json数格式的字符串就会报错。

Mitmproxy的使用场景

网站返回的Headers汇总经常有我们呢需要的Cookies,我们呢可以获取并存储到数据库中,但是mitmdump脚本对于第三方库的支持有缺陷,很多第三方库都不能运行,包括Python自带的写入文件的功能都不能运行,那么我们来看一下具体该如何解决呢。

定义一个response函数来打印cookies:

import json
def response(flow):
    response=flow.request
    cookies=response.headers.get('Cookie')
    if cookies:
        print(f'>>{cookies}<<')

从新创建一个py文件,敲如下代码:

import re
import sys
for line in sys.stdin:
    cookie=re.search('>>(.*?)<<',line)
    if cookie:
        print('取到cookie:{}'.format(cookie.group(1)))

如果直接通过运行Python代码的方式运行它,就会发现它会一直卡着,等待我们呢输入,不会自动结束。如果输入不同的内容,他什么也不会打印,直到输入的格式为 >> cookies << 的时候才会返回。你可以自己尝试一下。现在我们呢需要把两个py文件结合在一起,一个打印cookies,另一个取cookies:

mitmdump -s 文件1.py | python3 文件2.py

文件名字按照自己定义的,我们在手机上打开一个浏览器,就会看到返回的群补都是cookie信息,这个命令会一直运行下去。取cookie的方式就是通过Python脚本,在这个脚本里面我们呢就可以进行存储到数据库的操作,只需要添加相关代码就可以了,这里不再演示。那么打印cookie的文件需要通过mitmdump来实现,两者结合就可以获得cookie了!

当然不仅仅是cookie,我们呢还可以提取到Headers里面的所有数据、请求发送Body里面所有数据都可以使用这种方式截取下来。

Mitmproxy的一些案例

def reqeusts(flow):
    flow.request.headers['User-Agent']='MitmProxy'  #所有请求头替换为Mitmproxy
    print(flow.request.headers) #打印请求头
from mitmproxy import ctx

def request(flow):
    flow.reqeust.headers['User-Agent']='MitmProxy'
    #用三种不同的形式,打印信息
    ctx.log.info(str(flow.reqeust.headers)) #信息
    ctx.log.warn(str(flow.reqeust.headers)) #警告
    ctx.log.error(str(flow.reqeust.headers)) #出错
from mitmproxy import ctx
def request(flow):
	request=flow.request
	info=ctx.log.info

	info(request.url) #请求的url
	info(str(request.headers)) #请求头
	info(str(request.cookies)) #请求的cookies
	info(request.host) #主机号
	info(str(request.port)) #端口
from mitmproxy import ctx
def response(flow):
	response=flow.response
	info=ctx.log.info

	info(str(response.status_code)) #响应的状态码
	info(str(response.headers)) #响应头
	info(str(response.cookies)) #响应的cookies
	info(str(response.text)) #响应的文本
import json
def response(flow):
	url='https://36kr.com'
	if flow.reqeust.url.startswith(url): #判断请求的url是否以开头
		#处理json数据
		data_list=json.loads(flow.response.text)['data']['items']
		for data in data_list:
			title=data['title']
			content=data['description']
			print(title)
			print(content)
import json
def response(flow):
	url='https://36kr.com'
	if flow.reqeust.url.startswith(url): #判断请求的url是否以开头
		#处理json数据
		text=flow.response.textdata=json.loads(text)

未经允许不得转载:作者:鳄鱼君, 转载或复制请以 超链接形式 并注明出处 鳄鱼君
原文地址:《使用Python定制mitmproxy 开发APP数据爬虫》 发布于2020-03-27

分享到:
赞(2) 赏杯咖啡

评论 抢沙发

3 + 6 =


文章对你有帮助可赏作者一杯咖啡

支付宝扫一扫打赏

微信扫一扫打赏

Vieu4.6主题
专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板。
切换注册

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

Q Q 登 录
微 博 登 录
切换登录

注册