用mitmproxy替代selenium-wire

做爬虫的人应该都知道selenium-wire,这是一个浏览器流量的抓取工具,这个工具2022年10月15日后已经停止维护了,它的本质是对mitmproxy的封装,由于它采取了内置mitmproxy的方式,不会随着mitmproxy的升级而升级,由于代码陈旧现在基本上已经无法使用了。我曾经改过一版selenium-wire,把内置的mitmproxy改成外置,这样就可以使用最新版mitmproxy了,代码如下:

selenium-wire

由于selenium-wire只是mitmproxy的一个封装,建议直接使用mitmproxy更好。下面是我写的简单封装:

python 复制代码
import os
from selenium.webdriver.common.by import By
# import proxy as webdriver
from selenium import webdriver
# from seleniumwire.utils import decode
import time
import shutil
from selenium.webdriver.common.proxy import Proxy, ProxyType
from selenium.webdriver.common.actions import mouse_button
from model.CrawlerModel.repository import Repository
import subprocess
from multiprocessing import Process, Value
import requests
from mitmproxy import http
from mitmproxy import ctx
import threading
from mitmproxy import options
from mitmproxy.tools import dump
import asyncio
import config
import random

class PServer:
    def __init__(self,profile):
        self.ready = threading.Event()
        self.port = profile.getPort()
    def running(self):
        self.ready.set()

    async def backend(self,host, port):
        self.ready.clear()
        self.options = opts = options.Options(
            # mode=[f"upstream:{proxy}"],
            # upstream_auth=config.proxy[self.addon.retries]['auth'],
            # connection_strategy='lazy',
            # keep_alive_timeout=500,
            # http2_ping_keepalive=0,
            listen_host=host,
            listen_port=port,
            ssl_insecure=True # 如果没有这行,有些网站会出错unsafe legacy renegotiation disabled,比如:https://money.smt.docomo.ne.jp/contents/creditcard-good-to-have
            )
        # opts.add_option("connection_strategy", str, "eager", "Connection strategy (eager|lazy)")
        # opts.update(connection_strategy="lazy")

        self.master = master = dump.DumpMaster(
            opts,
            # with_termlog=True,
            with_termlog=False,
            with_dumper=False,
        )
        master.addons.add(self)
        master.addons.add(self.addon)
        
        await master.run()
        return master
    def run(self):
        asyncio.run(self.backend('127.0.0.1', self.port))

    def start(self,addon):
        self.addon=addon
        self.thread = threading.Thread(name='Proxy Server', target=self.run)
        # t.daemon = not options.get('standalone')
        self.thread.start()
        # 等待proxy工作,如果超过30秒就报错
        if not self.ready.wait(30):
            raise Exception('proxy timeout')
        # asyncio.wait(self.ready)
        # time.sleep(5)

    def stopServer(self):
        ctx.options.update(server=False)

    def shutdown(self):
        ctx.master.event_loop.call_soon_threadsafe(self.stopServer)
        ctx.master.shutdown()
        self.thread.join()

selenium中使用下面代码设置代理:

python 复制代码
        proxyServer=PServer(profile)
        options.add_argument(f'--proxy-server=127.0.0.1:{str(profile.getPort())}')

抓取流量的时候使用下面代码:

python 复制代码
    def response(self,flow: http.HTTPFlow) -> None:
        request=flow.request
        response=flow.response
        self.requests.remove(flow.request)
        。。。

proxyServer.start(self)

profile是自己写的管理端口的类,可以忽略。proxyServer.start(self)的意图是在当前类中寻找response方法。当然还有其他方法,详细参照mitmproxy文档。

由于详细解释比较麻烦,写的粗糙一点。

相关推荐
xy34538 小时前
Wireshark捕获过滤器——语法元素详解
网络·测试工具·渗透测试·wireshark
PhotonixBay15 小时前
共聚焦成像核心原理:针孔、PSF与三维形貌测量技术
人工智能·测试工具·算法
程序员小远15 小时前
接口测试之文件上传
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·接口测试
kft131417 小时前
Playwright + 本地 AI,从录制到自愈闭环的一站式自动化测试平台。
人工智能·测试工具
ClouGence18 小时前
零代码自动化测试工具回演 CueCast 新版本发布:数据变量、多标签页录制与登录准备能力上线
selenium·测试
蒲公英内测分发2 天前
Typeoff:当 AI 开始参与工作,我们可能需要重新思考“输入”这件事
人工智能·测试工具·项目管理·语音输入·ai语音输入
LT10157974442 天前
2026年手机机型兼容性测试选型指南:安卓机型碎片化、APP闪退UI错乱如何解决
android·测试工具·ui·智能手机
Luminbox紫创测控2 天前
GB/T 5137.3 2020标准:汽车安全玻璃耐辐照与耐模拟气候试验方法
人工智能·测试工具·汽车·安全性测试·uv·测试标准