【学习小记1】Python mitmproxy 监控浏览器

记录原因:

对于做爬虫练习的时候部分网站获取不到内容,所以想到了使用中间人来获取网站 Response

mitmproxy 是什么?
mitmproxy 简单来说就是一个代理,相当于让你多走了一个转接,而它的作用就是在转接的过程中 记录 / 存储 / 修改 内容。
具体讲解自行百度

我的使用方法:

"""
flow.request.scheme  请求协议
flow.request.host    请求host
flow.request.url     请求URL链接
flow.request.method  请求方法
flow.request.query   请求URL查询参数
flow.request.path    请求URL https://www.baidu.com/
flow.request.path_components  #请求URL不包含域名的元祖 ('project', 'classify', 'list')
flow.request.urlencoded_form  请求POST数据
flow.response.status_code  HTTP响应状态码
flow.response.headers    HTTP响应头信息
flow.response.get_text   HTTP响应内容
"""
import asyncio
import os
import signal

import redis
from mitmproxy import proxy, options
from mitmproxy.tools.dump import DumpMaster
from mitmproxy.http import HTTPFlow
import logging

logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)

TENDIS_HOST = "127.0.0.1"
TENDIS_PORT = 6379

def get_tendis_client():
    return redis.StrictRedis(
        host=TENDIS_HOST,
        port=TENDIS_PORT,
        # password=TENDIS_DATA_PASSWD,
        retry_on_timeout=True
    )


class AddHeader:
    def __init__(self):
        self.asin_sets = set()
        self.redis = get_tendis_client()
        self.redis_quene_name = "【填一个Redis Key】"
        self.logger = logger

    def send_asin_to_redis(self, response):
        self.redis.set(self.redis_quene_name, {"response": response})

    def request(self, flow: HTTPFlow):
        if "【填写请求网址的过滤条件】" in flow.request.url:
            """
            【这里对此类网站的需求】
            """
            pass

if __name__ == "__main__":
    addons = [
        AddHeader()
    ]
    opts = options.Options(listen_host='0.0.0.0', listen_port=8888, mode="upstream:http://127.0.0.1:11111")
    pconf = proxy.config.ProxyConfig(opts)

    m = DumpMaster(opts)
    m.server = proxy.server.ProxyServer(pconf)
    m.addons.add(*addons)

    try:
        loop = asyncio.get_event_loop()
        try:
            loop.add_signal_handler(signal.SIGINT, getattr(m, "prompt_for_exit", m.shutdown))
            loop.add_signal_handler(signal.SIGTERM, m.shutdown)
        except NotImplementedError:
            # Not supported on Windows
            pass
        m.run()
    except (KeyboardInterrupt, RuntimeError):
        pass

这个简单的脚本很好理解,listen_port 是转接你计算机的地址,你需要让它的端口与计算机开放的代理端口一致,如果需要开飞机的话,就需要使用mode 中代理地址了。
流程简化:
计算机提供端口 ----> 中间人监听(再此处操作开飞机) ----->请求目标网站
目标网站返回 -------> 中间人监听(在此处修改 / 存储 ) ------> 结果返回计算机

建议跟我一样的小白们去了解《三次握手四次挥手》,这充分讲解了计算机如何将内容展示给我们的具体过程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值