爬虫笔记20——票星球抢票脚本的实现

以下内容仅供交流学习使用!!!

思路分析

前面的爬虫笔记一步一步走过来我们的技术水平也有了较大的提升了,现在我们来进行一下票星球抢票实战项目,实现票星球的自动抢票。

  1. 我们打开票星球的移动端页面,分析每一步操作需要用到的接口。
  2. 先手动操作抢票找到抢票流程的每一个接口后,判断接口请求要求,请求方式,以及是否需要传递什么参数。
  3. 接下来就是每个接口一步一步操作请求响应,测试成功返回200状态码即可。
  4. 实现过程我主要是创建一个类对象,初始化方法配置需要用到的属性,然后把每一步操作的请求封装成每一个函数。
  5. 最后定义一个主函数运行实现逻辑。
  6. 当然,下面是代码的大体内容,主要讲解如何操作,需要全部代码可以找一下我发布的资源下载(目前文件还在审核中,通过后即可直接下载)。

示例代码

首先我们要用到下面三个包,pip下载即可

#pip install requests fake_useragent datetime
#请求
import requests
#随机UA
from fake_useragent import UserAgent
#时间
import datetime

然后我们创建一个类对象,初始化方法里面创建需要用到的属性变量,token属性需要自行登录找到自己的token复制过来即可:

class PXQ:
    def __init__(self):
        # 输入自己的token
        self.token = '这里要打开网页开发者工具找到你自己的token'
        # 演唱会项目id,必填,最简单就是在url上可以看到,下面这个是要操作抢购的演唱会的show_id
        # 或者也是打开网页开发者工具中的网络也是可以找到
        self.show_id = '665708481d06bc0001627d83'
        # 指定场次id,不指定则默认从第一场开始遍历,查找同理
        self.session_id = '665708656a025300012ae72a'
        # 购票数量,自行设置要购买的数量,但一定要看购票须知,不要超过上限
        self.buy_count = 1
        # 指定观演人,观演人序号从0开始,人数需与票数保持一致
        self.audience_idx = [0]
        # audience_idx = [0]
        # 门票类型,不确定则可以不填,让系统自行判断。快递送票:EXPRESS,电子票:E_TICKET/ID_CARD,现场取票:VENUE,电子票或现场取票:VENUE_E,目前只发现这四种,如有新发现可补充
        self.deliver_method = ''
        # 获取想要购买的票价id
        self.seat_plan_id = ''
        self.session_id_exclude = []  # 被排除掉的场次
        self.price: int = 0
        # 抢购的票价名称
        self.seatPlanName = ''
        self.threadsLists = []
        # 判断是否对应价位有票数,默认是无
        self.flag = False
        # 设置抢票开始时间,自行设置开抢时间,分别是年月日时分秒
        self.startTime = datetime.datetime(2024, 7, 3, 2, 0, 0)
        # 随机UA
        self.user_agent = UserAgent()

接下来就是操作流程每个请求接口设置,封装成方法,依次是:

  • 根据项目id获取所有场次和在售状态
    # 根据项目id获取所有场次和在售状态
    def get_sessions(self, useragent):
        headers = {
            'User-Agent': useragent,
            'Content-Type': 'application/json'
        }
        url = "https://m.piaoxingqiu.com/cyy_gatewayapi/show/pub/v3/show/" + self.show_id + "/sessions_dynamic_data"
        response = requests.get(url=url, headers=headers).json()
        if response["statusCode"] == 200:
            # 获取场次的id
            # print(response)
            return response["data"]["sessionVOs"]
        else:
            print("get_sessions异常:" + str(response))
        return None

  • 根据场次id获取座位信息,箭头后面表示函数返回数据类型
    def get_seat_plans(self, useragent) -> list:
        headers = {
            'User-Agent': useragent,
            'Content-Type': 'application/json'
        }
        url = "https://m.piaoxingqiu.com/cyy_gatewayapi/show/pub/v3/show/" + self.show_id + "/show_session/" + self.session_id + "/seat_plans_static_data"
        response = requests.get(url=url, headers=headers).json()
        if response["statusCode"] == 200:
            # 查看票价的id
            # print(response)
            return response["data"]["seatPlans"]
        else:
            raise Exception("get_seat_plans异常:" + str(response))
  • 获取座位余票
# 获取座位余票
    def get_seat_count(self, useragent) -> list:
        headers = {
            'User-Agent': useragent,
            'Content-Type': 'application/json'
        }
        url = "https://m.piaoxingqiu.com/cyy_gatewayapi/show/pub/v3/show/" + self.show_id + "/show_session/" + self.session_id + "/seat_plans_dynamic_data"
        response = requests.get(url=url, headers=headers).json()
        if response["statusCode"] == 200:
            return response["data"]["seatPlans"]
        else:
            raise Exception("get_seat_count异常:" + str(response))
  • 获取门票类型(快递送票EXPRESS,电子票E_TICKET,现场取票VENUE,电子票或现场取票VENUE_E)
# 获取门票类型(快递送票EXPRESS,电子票E_TICKET,现场取票VENUE,电子票或现场取票VENUE_E)
    def get_deliver_method(self, useragent, qty: int) -> str:
        headers = {
            'User-Agent': useragent,
            'Content-Type': 'application/json',
            'access-token': self.token
        }
        data = {
            "items": [
                {
                    "skus": [
                        {
                            "seatPlanId": self.seat_plan_id,  
                            "sessionId": self.session_id,  
                            "showId": self.show_id,  
                            "skuId": self.seat_plan_id,
                            "skuType": "SINGLE",
                            "ticketPrice": self.price, 
                            "qty": qty  #数量
                        }
                    ],
                    "spu": {
                        "id": self.show_id,
                        "spuType": "SINGLE"
                    }
                }
            ]
        }
        url = "https://m.piaoxingqiu.com/cyy_gatewayapi/trade/buyer/order/v3/pre_order"
        response = requests.post(url=url, headers=headers, json=data).json()
        if response["statusCode"] == 200:
            # 这里的print可以去掉
            # print(response["data"]["supportDeliveries"][0])
            return response["data"]["supportDeliveries"][0]["name"]
        else:
            raise Exception("获取门票类型异常:" + str(response))
  • 获取观演人信息
# 获取观演人信息
    # def get_audiences() -> list | None:
    def get_audiences(self, useragent):
        headers = {
            'User-Agent': useragent,
            'Content-Type': 'application/json',
            'access-token': self.token
        }
        url = "https://m.piaoxingqiu.com/cyy_gatewayapi/user/buyer/v3/user_audiences"
        response = requests.get(url=url, headers=headers).json()
        if response["statusCode"] == 200:
            # 可以获取观影人的信息查看是否正确
            return response["data"]
        else:
            print("get_audiences异常:" + str(response))
        return None

  • 提交订单需要做的判断比较多,要判断演出票是什么票型(快递送票EXPRESS,电子票E_TICKET/ID_Card,现场取票VENUE,电子票或现场取票VENUE_E)
# 提交订单(快递送票EXPRESS,电子票E_TICKET/ID_Card,现场取票VENUE,电子票或现场取票VENUE_E)
    def create_order(self, useragent, qty: int, express_fee: int,
                     receiver, cellphone, address_id, detail_address, location_city_id, audience_ids: list):
        headers = {
            'User-Agent': useragent,
            'Content-Type': 'application/json',
            'access-token': self.token
        }
        if self.deliver_method == "EXPRESS":
            data = {
                "priceItemParam": [
                    {
                        "applyTickets": [],
                        "priceItemName": "票款总额",
                        "priceItemVal": self.price * qty,
                        "priceItemType": "TICKET_FEE",
                        "priceItemSpecies": "SEAT_PLAN",
                        "direction": "INCREASE",
                        "priceDisplay": "¥" + str(self.price * qty)
                    },
                    {
                        "applyTickets": [],
                        "priceItemName": "快递费",
                        "priceItemVal": express_fee,
                        "priceItemId": self.show_id,
                        "priceItemSpecies": "SEAT_PLAN",
                        "priceItemType": "EXPRESS_FEE",
                        "direction": "INCREASE",
                        "priceDisplay": "¥" + str(express_fee)
                    }
                ],
                "items": [
                    {
                        "skus": [
                            {
                                "seatPlanId": self.seat_plan_id,
                                "sessionId": self.session_id,
                                "showId": self.show_id,
                                "skuId": self.seat_plan_id,
                                "skuType": "SINGLE",
                                "ticketPrice": self.price,
                                "qty": qty,
                                "deliverMethod": self.deliver_method
                            }
                        ],
                        "spu": {
                            "id": self.show_id,
                            "spuType": "SINGLE"
                        }
                    }
                ],
                "contactParam": {
                    "receiver": receiver,  # 张三
                    "cellphone": cellphone  # 13812345678
                },

                "one2oneAudiences": [{"audienceId": i, "sessionId": self.session_id} for i in audience_ids],
                "addressParam": {
                    "address": detail_address,  # 星巴克咖啡门口
                    "district": location_city_id[4:],
                    "city": location_city_id[2:4],
                    "province": location_city_id[0:2],
                    "addressId": address_id
                }
            }
        elif self.deliver_method == "ID_CARD":
            data = {
                "priceItemParam": [
                    {
                        "applyTickets": [],
                        "priceItemName": "票款总额",
                        "priceItemVal": self.price * qty,
                        "priceItemType": "TICKET_FEE",
                        "priceItemSpecies": "SEAT_PLAN",
                        "direction": "INCREASE",
                        "priceDisplay": "¥" + str(self.price * qty),
                    }
                ],
                "items": [
                    {
                        "skus": [
                            {
                                "seatPlanId": self.seat_plan_id,
                                "sessionId": self.session_id,
                                "showId": self.show_id,
                                "skuId": self.seat_plan_id,
                                "skuType": "SINGLE",
                                "ticketPrice": self.price,
                                "qty": qty,
                                "deliverMethod": self.deliver_method,
                            }
                        ],
                        "spu": {"id": self.show_id, "spuType": "SINGLE"},
                    }
                ],
                "one2oneAudiences": [
                    {"audienceId": i, "sessionId": self.session_id} for i in audience_ids
                ],
                "many2OneAudience": {
                    "audienceId": audience_ids[0],
                    "sessionIds": [self.session_id],
                },
            }
        # 电子票已解决
        elif self.deliver_method == "E_TICKET":
            data = {
                "priceItemParam": [
                    {
                        "applyTickets": [],
                        "priceItemName": "票款总额",
                        "priceItemVal": self.price * qty,
                        "priceItemType": "TICKET_FEE",
                        "priceItemSpecies": "SEAT_PLAN",
                        "direction": "INCREASE",
                        "priceDisplay": "¥" + str(self.price * qty)
                    }
                ],
                "items": [
                    {
                        "skus": [
                            {
                                "seatPlanId": self.seat_plan_id,
                                "sessionId": self.session_id,
                                "showId": self.show_id,
                                "skuId": self.seat_plan_id,
                                "skuType": "SINGLE",
                                "ticketPrice": self.price,
                                "qty": qty,
                                "deliverMethod": self.deliver_method
                            }
                        ],
                        "spu": {
                            "id": self.show_id,
                            "spuType": "SINGLE"
                        }
                    }
                ],
                "many2OneAudience": {
                    "audienceId": audience_ids[0],
                    "sessionIds": [
                        self.session_id
                    ]
                }
            }
        elif self.deliver_method == "VENUE":
            data = {
                "priceItemParam": [
                    {
                        "applyTickets": [],
                        "priceItemName": "票款总额",
                        "priceItemVal": self.price * qty,
                        "priceItemType": "TICKET_FEE",
                        "priceItemSpecies": "SEAT_PLAN",
                        "direction": "INCREASE",
                        "priceDisplay": "¥" + str(self.price * qty)
                    }
                ],
                "items": [
                    {
                        "skus": [
                            {
                                "seatPlanId": self.seat_plan_id,
                                "sessionId": self.session_id,
                                "showId": self.show_id,
                                "skuId": self.seat_plan_id,
                                "skuType": "SINGLE",
                                "ticketPrice": self.price,
                                "qty": qty,
                                "deliverMethod": self.deliver_method
                            }
                        ],
                        "spu": {
                            "id": self.show_id,
                            "spuType": "SINGLE"
                        }
                    }
                ],
                "one2oneAudiences": [{"audienceId": i, "sessionId": self.session_id} for i in audience_ids]
            }
        elif self.deliver_method == "VENUE_E":
            data = {
                "priceItemParam": [
                    {
                        "applyTickets": [],
                        "priceItemName": "票款总额",
                        "priceItemVal": self.price * qty,
                        "priceItemType": "TICKET_FEE",
                        "priceItemSpecies": "SEAT_PLAN",
                        "direction": "INCREASE",
                        "priceDisplay": "¥" + str(self.price * qty)
                    }
                ],
                "items": [
                    {
                        "skus": [
                            {
                                "seatPlanId": self.seat_plan_id,
                                "sessionId": self.session_id,
                                "showId": self.show_id,
                                "skuId": self.seat_plan_id,
                                "skuType": "SINGLE",
                                "ticketPrice": self.price,
                                "qty": qty,
                                "deliverMethod": self.deliver_method
                            }
                        ],
                        "spu": {
                            "id": self.show_id,
                            "spuType": "SINGLE"
                        }
                    }
                ]
            }
        else:
            raise Exception("不支持的deliver_method:" + str(self.deliver_method))

        url = "https://m.piaoxingqiu.com/cyy_gatewayapi/trade/buyer/order/v3/create_order"
        response = requests.post(url=url, headers=headers, json=data).json()
        if response["statusCode"] == 200:
            print("下单成功!请尽快支付!")
        else:
            raise Exception("下单异常:" + str(response))
  • 主函数,前面都是函数定义,主要是在主函数执行操作抢票。
  • 我们前面已经知道哪个演唱会show_id,以及哪个场次session_id,现在要在主函数里面的seat_plan_id进行自行赋值,也可以开头初始化方法里面赋值/默认为空,seat_plan_id可以通过前面get_seat_plans函数里的接口地址获取。
# 主函数
    def main(self):
        # 创建随机的useragent
        useragent = self.user_agent.random
        while True:
            try:
                # 获取座位余票信息,默认从最低价开始
                seat_plans = self.get_seat_plans(useragent)
                # print(seat_plans)
                seat_count = self.get_seat_count(useragent)
                # print(seat_count)

                # 获取想要购买的票价id
                self.seat_plan_id = '667ba34a090ca100015604df'

                # 提取出对应的票价
                for temp in seat_plans:
                    if temp["seatPlanId"] == self.seat_plan_id:
                        self.price = temp["originalPrice"]
                        self.seatPlanName = temp["seatPlanName"]
                        break

                # 判断对应的票价id是否有剩余票数
                for i in seat_count:
                    if i["seatPlanId"] == self.seat_plan_id:
                        if i["canBuyCount"] > 0:
                            self.flag = True
                            # print(f'{self.seatPlanName}该价位剩余数量:可满足您的购买需求')
                            break
                        else:
                            self.flag = False
                            # print(f'{self.seatPlanName}无剩余!')
                            break

                if self.flag:
                    print(f'{self.seatPlanName}该价位剩余数量:可满足您的购买需求')
                    print('正在努力抢购中……')
                else:
                    print(f'{self.seatPlanName}票价无剩余!,将继续为你刷新抢购')
                    continue

                if not self.deliver_method:
                    self.deliver_method = self.get_deliver_method(useragent, self.buy_count)
                print("演唱票类型:" + self.deliver_method)

                if self.deliver_method == "VENUE_E":
                    self.create_order(useragent, self.buy_count, 0, None, None, None, None, None, [])
                else:
                    # 获取观演人信息
                    audiences = self.get_audiences(useragent)
                    if len(self.audience_idx) == 0:
                        self.audience_idx = range(self.buy_count)
                    audience_ids = [audiences[i]["id"] for i in self.audience_idx]

                    if self.deliver_method == "EXPRESS":
                        # 获取默认收货地址
                        address = self.get_address(useragent)
                        address_id = address["addressId"]  # 地址id
                        location_city_id = address["locationId"]  # 460102
                        receiver = address["username"]  # 收件人
                        cellphone = address["cellphone"]  # 电话
                        detail_address = address["detailAddress"]  # 详细地址

                        # 获取快递费用
                        express_fee = self.get_express_fee(useragent, self.buy_count, location_city_id)

                        self.create_order(useragent, self.buy_count, express_fee["priceItemVal"], receiver,
                                          cellphone, address_id, detail_address, location_city_id, audience_ids)
                    elif self.deliver_method == "VENUE" or self.deliver_method == "E_TICKET" or self.deliver_method == "ID_CARD":
                        self.create_order(useragent, self.buy_count, 0, None, None, None, None, None, audience_ids)
                    else:
                        print("不支持的deliver_method:" + self.deliver_method)
                break
            except Exception as e:
                print(e)

以上内容全是定义在一个类中,我们要使用那就要创建一个类对象,现在我们打开一个文件入口进行创建:

if __name__ == '__main__':
    # 创建对象
    pxq = PXQ()
    while True:
        now = datetime.datetime.now()
        # 判断当前时间与设置的开抢时间,并进行倒计时,当当前时间大于开抢时间直接开抢
        if now < pxq.startTime:
            print(f"{int(pxq.startTime.timestamp()-now.timestamp())}秒后开抢", end="\r")
        else:
            pxq.main()
            break

执行前我们配置好show_id,session_id和seat_plan_id,运行起来根据你设置的抢购时间在等待抢购的:
在这里插入图片描述

获取seat_plan_id的流程操作:
在这里插入图片描述
抢票成功会显示:
在这里插入图片描述
在这里插入图片描述

以上是大体的思路流程,详细的代码可以看下我发布的资源,或者找我上传到github上的资源下载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/769992.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

身份证OCR识别的深度解读

引言 随着信息技术的飞速发展&#xff0c;光学字符识别&#xff08;OCR&#xff09;技术在各个领域得到了广泛应用。身份证OCR识别&#xff0c;作为OCR技术的一个重要分支&#xff0c;以其高效、准确的特点&#xff0c;在身份验证、信息录入等方面发挥着重要作用。本文将深入解…

【Linux】Linux用户,用户组,其他人

1.文件拥有者 初次接触Linux的朋友大概会觉得很怪异&#xff0c;怎么“Linux有这么多用户&#xff0c;还分什么用户组&#xff0c;有什用呢&#xff1f;”&#xff0c;这个“用户与用户组”的功能可是相当健全而且好用的一个安全防护措施。 怎么说呢&#xff1f;由于Linux是个…

Chapter10 高级纹理——Shader入门精要学习笔记

Chapter10 高级纹理 一、立方体纹理1.基本概念①组成②采样 2.天空盒子 Sky Box3.环境映射三种方法①特殊布局的纹理创建②手动创建Cubemap——老方法③脚本生成 4.反射5.折射6.菲涅尔反射 二、渲染1.镜子效果2.玻璃效果3.渲染纹理 vs GrabPass 三、程序纹理1.简单程序纹理2.Un…

使用 bend-ingest-kafka 将数据流实时导入到 Databend

作者&#xff1a;韩山杰 Databend Cloud 研发工程师 https://github.com/hantmac Databend是一个开源、高性能、低成本易于扩展的新一代云数据仓库。bend-ingest-kafka 是一个专为 Databend 设计的实时数据导入工具&#xff0c;它允许用户从 Apache Kafka 直接将数据流导入到 D…

MacOS下更新curl

苹果自带的curl不支持Https,我们可以通过curl -V看到如下结果 curl 7.72.0 (x86_64-apple-darwin18.6.0) libcurl/7.72.0 zlib/1.2.12 libidn2/2.3.7 librtmp/2.3 Release-Date: 2020-08-19 Protocols: dict file ftp gopher http imap ldap ldaps pop3 rtmp rtsp smtp telne…

LabVIEW汽车ECU测试系统

开发了一个基于LabVIEW开发的汽车发动机控制单元&#xff08;ECU&#xff09;测试系统。该系统使用了NI的硬件和LabVIEW软件&#xff0c;能够自动执行ECU的功能测试和性能测试&#xff0c;确保其在不同工作条件下的可靠性和功能性。通过自动化测试系统&#xff0c;大大提高了测…

基于xilinx FPGA的GTX/GTH/GTY位置信息查看方式(如X0Y0在bank几)

目录 1 概述2 参考文档3 查看方式4查询总结&#xff1a; 1 概述 本文用于介绍如何查看xilinx fpga GTX得位置信息&#xff08;如X0Y0在哪个BANK/Quad&#xff09;。 2 参考文档 《ug476_7Series_Transceivers》 《pg156-ultrascale-pcie-gen3-en-us-4.4》 3 查看方式 通过…

linux——IPC 进程间通信

IPC 进程间通信 interprocess communicate IPC&#xff08;Inter-Process Communication&#xff09;&#xff0c;即进程间通信&#xff0c;其产生的原因主要可以归纳为以下几点&#xff1a; 进程空间的独立性 资源隔离&#xff1a;在现代操作系统中&#xff0c;每个进程都…

Hadoop-12-Hive 基本介绍 下载安装配置 MariaDB安装 3台云服务Hadoop集群 架构图 对比SQL HQL

章节内容 上一节我们完成了&#xff1a; Reduce JOIN 的介绍Reduce JOIN 的具体实现DriverMapperReducer运行测试 背景介绍 这里是三台公网云服务器&#xff0c;每台 2C4G&#xff0c;搭建一个Hadoop的学习环境&#xff0c;供我学习。 之前已经在 VM 虚拟机上搭建过一次&am…

独立开发者系列(18)——js的window对象

独立开发者&#xff0c;必然要面对JS代码&#xff0c;基本可以认为在脚本语言里面&#xff0c;JS门槛最低&#xff0c;正因为如此&#xff0c;JS也是最受欢迎的开发语言之一。JS的代码运行规律&#xff0c;按照代码模块执行&#xff0c;也就是<script></script> 每…

2024年上半年网络工程师下午真题及答案解析

试题一(20分) 某高校网络拓扑如下图所示&#xff0c;两校区核心&#xff08;CORE-1、CORE-2&#xff09;&#xff0c;出口防火墙&#xff08;NGFW-1、NGFW-2&#xff09;通过校区间光缆互联&#xff0c;配置OSPF实现全校路由收敛&#xff0c;两校区相距40km。两校区默认由本地…

「媒体邀约」苏州媒体宣传服务公司

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 媒体宣传加速季&#xff0c;100万补贴享不停&#xff0c;一手媒体资源&#xff0c;全国100城线下落地执行。详情请联系胡老师。 苏州的媒体资源相当丰富&#xff0c;涵盖了报纸、电视、广…

postman请求访问:认证失败,无法访问系统资源

1、使用postman时&#xff0c;没有传入相应的token&#xff0c;就会出现这种情况&#xff0c;此时需要把token放进去 发现问题: { "msg": "请求访问&#xff1a;/getInfo&#xff0c;认证失败&#xff0c;无法访问系统资源", "code": 401 } 1…

金属制品行业企业数字化转型实践

金属制品行业总体上存在着企业数量多、规模小、管理流程复杂等特点。而在数字化应用方面&#xff0c;调查显示&#xff1a;金属制品行业企业信息化总体应用水平低&#xff0c;信息系统建设水平尚处于一般事务处理和简单信息管理阶段&#xff0c;“信息孤岛”问题严重。在信息化…

最新发布!MySQL 9.0 的向量 (VECTOR) 类型文档更新

7月1日&#xff0c;MySQL 9.0.0 创新版本, 8.4.1 LTS, 8.0.38 三版齐发。 发版当天安装包已经可以下载&#xff0c;我也在第一时间做了分享&#xff1a; MySQL 9.0.0 新鲜出炉&#xff01;支持向量类型 当时参考手册还未上线&#xff0c;这两天文档虽已上线&#xff0c;但似乎仍…

RPM包管理-rpm命令管理

1.RPM包命令原则 所有的rpm包都在光盘中 例&#xff1a;httpd-2.2.15-15.e16.centos.1.i686.rpm httpd 软件包名 2.2.15 软件版本 15 软件发布的次数 e16.centos 适合的Linux平台 i686 适合的硬件平台…

springboot酒店管理系统-计算机毕业设计源码93190

目 录 摘 要 1 绪论 1.1 选题背景与意义 1.2开发现状 1.3论文结构与章节安排 2 酒店管理系统系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 法律可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非功能性分析 2.3 系统用例分析…

【计算机视觉】基于OpenCV的直线检测

直线检测原理 霍夫变换是图像处理必然接触到的一个算法&#xff0c;它通过一种投票算法检测具有特定形状的物体,该过程在一个参数空间中通过计算累计结果的局部最大值得到一个符合该特定形状的集合作为霍夫变换结果&#xff0c;该方法可以进行圆&#xff0c;直线&#xff0c;椭…

docker安装ElasticSearchKibana

本文参考以下两篇文章 ✅ElasticSearch&Kibana 部署 云效 Thoughts 企业级知识库 (aliyun.com) docker安装ElasticSearch&Kibana - 飞书 安装elasticsearch 使用docker下载es&#xff1a; docker pull elasticsearch:8.13.0 挂载配置 创建挂在文件目录 mkdir…

Hadoop3:集群压测-读写性能压测

一、准备工作 首先&#xff0c;我们要知道&#xff0c;平常所说的网速和文件大小的MB是什么关系。 100Mbps单位是bit&#xff1b;10M/s单位是byte ; 1byte8bit&#xff0c;100Mbps/812.5M/s。 测试 配置102、103、104虚拟机网速 102上用Python开启一个文件下载服务&#x…