用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文档。

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

相关推荐
DevilSeagull13 小时前
电脑上安装的服务会自动消失? 推荐项目: localhostSCmanager. 更好管理你的服务!
测试工具·安全·react·vite·localhost·hono·trpc
Python大数据分析@18 小时前
浏览器自动化工具 Selenium,Playwright,Puppeteer 做爬虫有哪些弊病?
爬虫·selenium·自动化
弹简特20 小时前
【精通Postman接口测试】01-基础理论+安装使用+项目实战+接口关联(万字图文,零基础保姆级)
测试工具·postman·接口关联
武帝为此1 天前
【Selenium 屏幕截图】
python·selenium·测试工具
武帝为此2 天前
【Selenium 执行 JavaScript】
javascript·selenium·测试工具
llilian_162 天前
晶体频率测试仪 破解晶振品控核心难题:晶体频率网络测试仪深度解析 晶体网络分析仪
网络·功能测试·单片机·嵌入式硬件·测试工具·51单片机
深念Y2 天前
从 Playwright/Selenium 到指纹浏览器:浏览器自动化技术的进阶之路
selenium·测试工具·自动化·浏览器·账号·无头浏览器·指纹浏览器
Johnstons2 天前
Wireshark ExpertInfo是什么?一文讲透异常分级、适用场景、和传统抓包阅读的区别与排查标准
网络·测试工具·wireshark·es
我的xiaodoujiao2 天前
API 接口自动化测试详细图文教程学习系列16--项目实战演练3
python·学习·测试工具·pytest
我的xiaodoujiao2 天前
API 接口自动化测试详细图文教程学习系列15--项目实战演练2
python·学习·测试工具·pytest