4-爬虫-selenium(等待元素加载、元素操作、操作浏览器执行js、切换选项卡、前进后退异常处理)、xpath、动作链

1 selenium等待元素加载
2 selenium元素操作
3 selenium操作浏览器执行js
4 selenium切换选项卡
5 selenium前进后退异常处理
6 登录cnblogs
7 抽屉半自动点赞
8 xpath
9 动作链
10 自动登录12306

上节回顾

# 1 bs4 解析库---》xml(html)-遍历文档树-属性 文本 标签名-搜索文档树:find  find_all-5 种过滤器:字符串,正则,布尔,列表,方法-find(name='字符串',src='正则',class_='布尔',href='列表',text='字符串',方法)-遍历文档树和搜索文档树可以连用find()  结果是:Tag类的对象,BeautifulSoup继承了它结果可以继续 . 也可以继续 find-find的其他参数-limit-recursive-链式调用-小说,图片# 2 css选择器-id选择器-标签选择器-类选择器-属性选择器- 标签- .- #id- div a- div>asoup.select('css选择器')  可能是多个,放到列表中# 3 selenium :控制浏览器,解决requests不能执行js的问题-浏览器驱动:浏览器版本-pip install selenium-快速使用import timefrom selenium import webdriver# 跟人操作浏览器一样,打开了谷歌浏览器,拿到浏览器对象bro=webdriver.Chrome()# 在地址栏中输入地址bro.get('https://www.baidu.com')time.sleep(5)bro.close() # 关闭当前tab页bro.quit() # 关闭浏览器# 4 模拟登录百度-查找标签# By.ID  # 根据id号查找标签# By.NAME  # 根据name属性查找标签# By.TAG_NAME  # # 根据标签查找标签# By.CLASS_NAME # 按类名找# By.LINK_TEXT # a标签文字# By.PARTIAL_LINK_TEXT # a标签文字,模糊匹配#---------selenium 自己的--------# By.CSS_SELECTOR # 按css选择器找# By.XPATH  #按xpath找-操作标签-点击-写文字# 5 无头浏览器-bro.page_source# 6 找到标签-属性-文本-标签名-位置-大小

1 selenium等待元素加载

# 代码操作非常快---》有的标签还没加载---》找就找不到---》就会报错
# 设置等待:显示等待,隐士等待
bro.implicitly_wait(10) # 找某个标签,如果找不到,最多等待10s

2 selenium元素操作

# 点击操作click()# 写文字send_keys("内容")# 清空文字clear()

3 执行js

# 在使用selenium操作浏览器的时候,可以自己写js执行,会用这东西做什么?-创建新的选项卡-打印出一些变量(属于当前爬取的页面中的变量)-获取当前登录的cookie-滑动屏幕
import timefrom selenium import webdriver
from selenium.webdriver.common.by import By
bro = webdriver.Chrome()
bro.get('https://www.pearvideo.com/category_1')
bro.implicitly_wait(10)
bro.maximize_window()
# 1 基本使用
# bro.execute_script('alert("美女")')
# 2 打印出一些变量
# res=bro.execute_script('console.log(urlMap)')
# print(res)# 3 新建选项卡
# bro.execute_script('open()')# 4 滑动屏幕
# bro.execute_script('scrollTo(0,document.documentElement.scrollHeight)')# 5 获取当前访问地址
# bro.execute_script('alert(location)')
# bro.execute_script('location="http://www.baidu.com"')# 6 打印cookie
bro.execute_script('alert(document.cookie)')
time.sleep(10)
bro.close()

4 切换选项卡

from selenium import webdriver
import time
bro = webdriver.Chrome()
bro.get('https://www.pearvideo.com/')
bro.implicitly_wait(10)
print(bro.window_handles)
# 开启选项卡
bro.execute_script('window.open()')
# 获取出所有选项卡bro.switch_to.window(bro.window_handles[1]) # 切换到某个选项卡
bro.get('http://www.taobao.com')time.sleep(2)
bro.switch_to.window(bro.window_handles[0]) # 切换到某个选项卡
bro.get('http://www.baidu.com')time.sleep(2)
bro.execute_script('window.open()')
bro.execute_script('window.open()')
bro.close() # 关闭选项卡
bro.quit()  # 关闭页面

5 前进后退异常处理

from selenium import webdriver
import time
bro = webdriver.Chrome()
bro.get('https://www.pearvideo.com/')
bro.implicitly_wait(10)# 获取出所有选项卡
time.sleep(2)
bro.get('http://www.taobao.com')time.sleep(2)bro.get('http://www.baidu.com')
time.sleep(2)
bro.back()
time.sleep(2)
bro.back()
time.sleep(2)
bro.forward()
bro.quit()  # 关闭页面

6 登录cnblogs

# 以后要爬取的数据,要登录后才能看到-如果使用selenium,速度慢---》不能开启多线程---》速度不会太快-如果使用requests发送请求,登录不好登录,自动登录不进去--》拿不到cookie-使用selenium登录---》拿到cookie---》换到别的机器,使用这个cookie,依然是登录状态
import timefrom selenium import webdriver
from selenium.webdriver.chrome.options import Options
import json
from selenium.webdriver.common.by import By
# 去掉自动化软件控制的检测
options = Options()
options.add_argument("--disable-blink-features=AutomationControlled")  # 去掉自动化控制
bro = webdriver.Chrome(options=options)
# bro = webdriver.Chrome()
########### 纯自动登录#######得到了cookie
bro.get('https://www.cnblogs.com/')
bro.implicitly_wait(10)
bro.maximize_window()
login_btn = bro.find_element(By.LINK_TEXT, '登录')
login_btn.click()time.sleep(2)# 找到用户名和密码输入框
username = bro.find_element(By.CSS_SELECTOR, '#mat-input-0')
password = bro.find_element(By.ID, 'mat-input-1')submit_btn = bro.find_element(By.CSS_SELECTOR,'body > app-root > app-sign-in-layout > div > div > app-sign-in > app-content-container > div > div > div > form > div > button')
# 验证码
code=bro.find_element(By.ID,'rectMask')
time.sleep(1)username.send_keys('@qq.com')
time.sleep(1)
password.send_keys('#')
time.sleep(1)
submit_btn.click()  # 一种情况直接登录成功   一种情况会弹出验证码
code.click()
time.sleep(10)# 让程序先停在这---》手动操作浏览器---》把验证码搞好---》程序再继续往下走
# 到现在,是登录成功的状态
# 取出cookie存起来
cookies = bro.get_cookies()
with open('cnblogs.json', 'w', encoding='utf-8') as f:json.dump(cookies, f)time.sleep(2)
bro.close()
import timefrom selenium import webdriver
from selenium.webdriver.chrome.options import Options
import json
from selenium.webdriver.common.by import By# 去掉自动化软件控制的检测
options = Options()
options.add_argument("--disable-blink-features=AutomationControlled")  # 去掉自动化控制
bro = webdriver.Chrome(options=options)bro.get('https://www.cnblogs.com/')
bro.implicitly_wait(10)
bro.maximize_window()time.sleep(5)
# 取出cookie--》写入到浏览器中---》刷新浏览器---》登录状态
with open('cnblogs.json', 'r') as f:cookies = json.load(f)
# 写到浏览器中
for item in cookies:bro.add_cookie(item) # 如果是没登录的cookie,往里写会报错# 刷新浏览器
bro.refresh()time.sleep(5)
bro.close()

7 抽屉半自动点赞

# 使用selenium登录---》拿到cookie
# 点赞 使用requests 用cookie点赞
####自动登录---使用selenium####
import json# import time
#
# from selenium import webdriver
# from selenium.webdriver.chrome.options import Options
# import json
# from selenium.webdriver.common.by import By
#
# bro = webdriver.Chrome()
# bro.get('https://dig.chouti.com/')
# bro.implicitly_wait(10)
# bro.maximize_window()
#
# btn_login = bro.find_element(By.ID, 'login_btn')
# time.sleep(1)
# btn_login.click()
# time.sleep(1)
#
# phone = bro.find_element(By.NAME, 'phone')
# password = bro.find_element(By.CSS_SELECTOR,
#                             'body > div.login-dialog.dialog.animated2.scaleIn > div > div.login-footer > div.form-item.login-item.clearfix.mt24 > div > input.input.pwd-input.pwd-input-active.pwd-password-input')
#
# submit_login = bro.find_element(By.CSS_SELECTOR,
#                                 'body > div.login-dialog.dialog.animated2.scaleIn > div > div.login-footer > div:nth-child(4) > button')
#
# phone.send_keys('你的手机号')
# password.send_keys('你的密码')
# time.sleep(2)
# submit_login.click()
#
# input('等你')
#
# cookies = bro.get_cookies()
# with open('chouti.json', 'w', encoding='utf-8') as f:
#     json.dump(cookies, f)
#
# time.sleep(2)
# bro.close()#### 使用requests点赞# 访问首页,解析出id号
import requests
from bs4 import BeautifulSoup#### 携带cookie访问#####
session = requests.Session()
cookie = {}  # 本地取出来,写入
with open('chouti.json', 'r') as f:cookie_list = json.load(f)
##### selenium的cookie和requests的cookie格式不一样,要转换   {key:value,key:value}
for item in cookie_list:cookie[item['name']] = item['value']
header={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36'}
res = session.get('https://dig.chouti.com/', cookies=cookie,headers=header)
soup = BeautifulSoup(res.text, 'html.parser')print(res.text)divs = soup.find_all(name='div', class_='link-item')
for div in divs:article_id = div.attrs.get('data-id')data = {'linkId': article_id}res1 = session.post('https://dig.chouti.com/link/vote', data=data,headers=header)print(res1.text)

8 xpath

# 在 xml中查找元素,解析库-解析库自带的-css选择器-xpath---》通用的---》即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言# 记住的:nodename	选取此节点的所有子节点。/	        从根节点选取。//	        从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。.	        选取当前节点。..	        选取当前节点的父节点。@	        选取属性。
doc = '''
<html><head><base href='http://example.com/' /><title>Example website</title></head><body><div id='images'><a href='image1.html' id='lqz'>Name: My image 1 <br /><img src='image1_thumb.jpg' /></a><a href='image2.html'>Name: My image 2 <br /><img src='image2_thumb.jpg' /></a><a href='image3.html'>Name: My image 3 <br /><img src='image3_thumb.jpg' /></a><a href='image4.html'>Name: My image 4 <br /><img src='image4_thumb.jpg' /></a><a href='image5.html' class='li li-item' name='items'>Name: My image 5 <br /><img src='image5_thumb.jpg' /></a><a href='image6.html' name='items'><span><h5>test</h5></span>Name: My image 6 <br /><img src='image6_thumb.jpg' /></a></div></body>
</html>
'''
from lxml import etreehtml = etree.HTML(doc)
# html=etree.parse('search.html',etree.HTMLParser())
# 1 所有节点
# a=html.xpath('//*')
# 2 指定节点(结果为列表)
# a=html.xpath('//head')
# 3 子节点,子孙节点
# a=html.xpath('//div/a')
# a=html.xpath('//body/a') #无数据
# a=html.xpath('//body//a')
# 4 父节点
# a=html.xpath('//body//a[@href="image1.html"]/..')
# a=html.xpath('//body//a[1]/..')
# 也可以这样
# a=html.xpath('//body//a[1]/parent::*')
# a=html.xpath('//body//a[1]/parent::div')
# 5 属性匹配
# a=html.xpath('//body//a[@href="image1.html"]')# 6 文本获取     /text()
# a=html.xpath('//body//a[@href="image1.html"]/text()')# 7 属性获取     @属性名
# a=html.xpath('//body//a/@href')
# # 注意从1 开始取(不是从0)
# a=html.xpath('//body//a[1]/@href')# 8 属性多值匹配
#  a 标签有多个class类,直接匹配就不可以了,需要用contains
# a=html.xpath('//body//a[@class="li"]')
# a=html.xpath('//body//a[contains(@class,"li")]')
# a=html.xpath('//body//a[contains(@class,"li")]/text()')
# 9 多属性匹配
# a=html.xpath('//body//a[contains(@class,"li") or @name="items"]')
# a=html.xpath('//body//a[contains(@class,"li") and @name="items"]/text()')
# a=html.xpath('//body//a[contains(@class,"li")]/text()')
# 10 按序选择
# a=html.xpath('//a[2]/text()')
# a=html.xpath('//a[2]/@href')
# 取最后一个
# a=html.xpath('//a[last()]/@href')
# a=html.xpath('//a[last()-1]/@href') # 倒数第二个
# 位置小于3的
# a = html.xpath('//a[position()<3]/@href')# 倒数第三个
# a=html.xpath('//a[last()-2]/@href')
# 11 节点轴选择
# ancestor:祖先节点
# 使用了* 获取所有祖先节点
# a=html.xpath('//a/ancestor::*')
# # 获取祖先节点中的div
# a=html.xpath('//a/ancestor::div')
# attribute:属性值
# a=html.xpath('//a[1]/attribute::*')
# a=html.xpath('//a[1]/attribute::href')# child:直接子节点
# a=html.xpath('//a[1]/child::*')
# descendant:所有子孙节点
# a=html.xpath('//a[6]/descendant::*')
# following:当前节点之后所有节点
# a=html.xpath('//a[1]/following::*')
# a=html.xpath('//a[1]/following::*[1]/@href')
# following-sibling:当前节点之后同级节点
# a=html.xpath('//a[1]/following-sibling::*')
# a=html.xpath('//a[1]/following-sibling::a')
# a=html.xpath('//a[1]/following-sibling::*[2]')
# a=html.xpath('//a[1]/following-sibling::*[2]/@href')# print(a)'''
/
//
.
..
取文本  /text()
取属性  /@属性名
根据属性过滤  [@属性名=属性值]
class 特殊
[contains(@class,"li")]
'''# 终极大招  直接复制
# 案例
import requests
res=requests.get('https://www.w3school.com.cn/xpath/xpath_syntax.asp')
from lxml import etreehtml = etree.HTML(res.text)
# a=html.xpath('//div[@id="intro"]//strong/text()')
# a=html.xpath('/html/body/div/div[4]/div[2]/p/strong')
a=html.xpath('//*[@id="intro"]/p/strong/text()')
print(a)

9 动作链

# 模拟鼠标点住,拖动的效果,实现滑块认证# 两种形式-形式一:actions=ActionChains(bro) #拿到动作链对象actions.drag_and_drop(sourse,target) #把动作放到动作链中,准备串行执行actions.perform()-方式二:ActionChains(bro).click_and_hold(sourse).perform()distance=target.location['x']-sourse.location['x']track=0while track < distance:ActionChains(bro).move_by_offset(xoffset=2,yoffset=0).perform()track+=2
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.support.wait import WebDriverWait  # 等待页面加载某些元素
import time
from selenium.webdriver.common.by import Bydriver = webdriver.Chrome()
driver.get('http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable')
driver.implicitly_wait(3)
driver.maximize_window()try:driver.switch_to.frame('iframeResult')  ##切换到iframeResultsourse = driver.find_element(By.ID, 'draggable')target = driver.find_element(By.ID, 'droppable')# 方式一:基于同一个动作链串行执行# actions = ActionChains(driver)  # 拿到动作链对象# actions.drag_and_drop(sourse, target)  # 把动作放到动作链中,准备串行执行# actions.perform()# 方式二:不同的动作链,每次移动的位移都不同ActionChains(driver).click_and_hold(sourse).perform()  # 鼠标点中源 标签 不松开distance=target.location['x']-sourse.location['x']track = 0while track < distance:ActionChains(driver).move_by_offset(xoffset=2, yoffset=0).perform()track += 2ActionChains(driver).release().perform()time.sleep(10)finally:driver.close()

10 自动登录12306

import time
from selenium.webdriver import ActionChains
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
# 12306检测到咱们用了自动化测试软件,
options = Options()
options.add_argument("--disable-blink-features=AutomationControlled")  # 去掉自动化控制
bro = webdriver.Chrome(chrome_options=options)
bro.get('https://kyfw.12306.cn/otn/resources/login.html')
bro.implicitly_wait(5)
bro.maximize_window()
user_login = bro.find_element(By.CSS_SELECTOR,'#toolbar_Div > div.login-panel > div.login-box > ul > li.login-hd-code.active > a')user_login.click()
time.sleep(1)username = bro.find_element(By.ID, 'J-userName')
password = bro.find_element(By.ID, 'J-password')
submit_btn = bro.find_element(By.ID, 'J-login')
username.send_keys('18953675221')
password.send_keys('')
time.sleep(3)
submit_btn.click()time.sleep(5)# 找到滑块
span = bro.find_element(By.ID, 'nc_1_n1z')
ActionChains(bro).click_and_hold(span).perform()
ActionChains(bro).move_by_offset(xoffset=300, yoffset=0).perform()
ActionChains(bro).release().perform()
time.sleep(5)bro.close()

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

34 mysql limit 的实现

前言 这里来看一下 我们常见的 mysql 分页的 limit 的相的处理 这个问题的主要是来自于 之前有一个需要处理 大数据量的数据表的信息, 将数据转移到 es 中 然后就是用了最简单的 “select * from tz_test limit $pageOffset, $pageSize ” 来分页处理 但是由于 数据表的数…

1-前端基本知识-HTML

1-前端基本知识-HTML 文章目录 1-前端基本知识-HTML总体概述什么是HTML&#xff1f;超文本标记语言 HTML基础结构文档声明根标签头部元素主体元素注释 HTML概念词汇&#xff1a;标签、属性、文本、元素HTML基本语法规则HTML常见标签标题标签段落标签换行标签列表标签超链接标签…

【Windows Docker:安装nginx】

拉镜像 docker pull nginx运行初始镜像 docker run -d -p 80:80 --name nginx nginx拷贝文件 docker cp nginx:/etc/nginx/nginx.conf D:/dockerFile/nginx/nginx.conf docker cp nginx:/etc/nginx/conf.d D:/dockerFile/nginx/conf.d docker cp nginx:/usr/share/nginx/htm…

华为李鹏:到 2025 年智能算力需求将达到目前水平的 100 倍

在第十四届全球移动宽带论坛上&#xff0c;华为高级副总裁、运营商 BG 总裁李鹏表示&#xff0c;大模型为代表的 AI 应用发展带来对智能算力的爆发式需求。 李鹏在题为《加速 5G 商业正循环&#xff0c;拥抱更繁荣的 5.5G》的讲话中表示&#xff0c;「5G 已经走在商业成功的正确…

学之思开源考试系统部署至Centos7

学之思开源考试系统部署至Centos7 1、下载源码 源码下载&#xff1a; https://gitee.com/mindskip/xzs-mysql 数据库脚本下载&#xff1a; https://www.mindskip.net:999/ 2、项目打包 分别在\source\vue\xzs-student目录和source\vue\xzs-admin目录&#xff0c;执行前端打…

人工智能基础_机器学习023_理解套索回归_认识L1正则---人工智能工作笔记0063

然后上一节我们说了L1,L2正则是为了提高,模型的泛化能力, 提高泛化能力,实际上就是把模型的公式的w,权重值,变小对吧. 然后我们这里首先看第一个L1正则,是怎么做到把w权重变小的 可以看到最上面是线性回归的损失函数,然后 L1可以看到,这个正则,就是在损失函数的基础上给损失…

uniapp+vue3+ts+vite+echarts开发图表类小程序,将echarts导入项目使用的详细步骤,耗时一天终于弄好了

想在uniapp和vue3环境中使用echarts是一件相当前卫的事情&#xff0c;官方适配的还不是很好&#xff0c;echarts的使用插件写的是有些不太清晰的&#xff0c;这里我花费了一天的时间&#xff0c;终于将这个使用步骤搞清楚了&#xff0c;并且建了一个仓库&#xff0c;大家可以直…

C#动态拦截并覆盖第三方进程的函数,实现函数篡改(外挂)

今天在看之前收藏的一个pdf文档(介绍C#外挂的相关知识的)&#xff0c;结合网上的东西及个人的理解才有了这篇文章。 参考文章&#xff1a; 【精选】一文带解读C# 动态拦截覆盖第三方进程中的函数&#xff08;外挂必备&#xff09;_zls365365的博客-CSDN博客 DotNetDetour - …

Feign优化之底层HTTP客户端实现

Feign有哪些底层HTTP客户端实现&#xff1a; Feign是一个声明式的、模板化的HTTP客户端&#xff0c;用于简化使用HTTP API的过程。在Feign中&#xff0c;可以选择使用不同的底层HTTP客户端实现&#xff0c;包括defaultHttpClient、apacheHttpClient和okHttpClient。这些客户端…

解决内存泄漏问题,Profiler工具的使用介绍

什么是内存泄漏 内存泄漏&#xff08;Memory Leak&#xff09;是指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放&#xff0c;造成系统内存的浪费&#xff0c;导致程序运行速度减慢甚至系统崩溃等严重后果。 以上是官方针对内存泄漏的说法。说的通俗一点&#x…

在IDEA中使用maven项目总结

一 什么是maven Maven本身也是Java写的&#xff0c;他是一款服务于Java平台的自动化构建工具 Maven是一个项目管理工具&#xff0c;旨在简化软件项目的构建、依赖管理和项目信息管理。它使用基于项目对象模型&#xff08;Project Object Model&#xff0c;POM&#xff09;的…

Vue3-Composition-API-学习笔记

01.Setup函数的体验 App.vue <template><div><h2>当前计数&#xff1a;{{ counter }}</h2><button click"increment">1</button><button click"decrement">-1</button></div> </template>&…

「我在淘天做技术」音视频技术及其在淘宝内容业务中的应用

作者&#xff1a;李凯 一、前言 近年来&#xff0c;内容电商似乎已经充分融入到人们的生活中&#xff1a;在闲暇时间&#xff0c;我们已经习惯于拿出手机&#xff0c;从电商平台的直播间、或者短视频链接下单自己心仪的商品。 尽管优质的货品、实惠的价格、精致的布景、有趣的…

基于SSM的科技公司门户网站

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

Vatee万腾的科技决策力奇迹:Vatee科技决策力的独特之选

在金融投资的复杂领域中&#xff0c;Vatee万腾以其独特的科技决策力创造了一场真正的奇迹。这不仅是一种引领投资者走向成功的选择&#xff0c;更是一种开启新时代的科技决策奇迹。 Vatee的科技决策力背后蕴藏着强大的智慧和创新。通过大数据分析、智能算法的运用&#xff0c;V…

LoRAShear:微软在LLM修剪和知识恢复方面的最新研究

LoRAShear是微软为优化语言模型模型(llm)和保存知识而开发的一种新方法。它可以进行结构性修剪&#xff0c;减少计算需求并提高效率。 LHSPG技术&#xff08; Lora Half-Space Projected Gradient&#xff09;支持渐进式结构化剪枝和动态知识恢复。可以通过依赖图分析和稀疏度…

jupyter notebook中markdown改变图像大小

文章目录 &#x1f56e;原始图像&#x1f56e;改变图像大小&#x1f56e;使图像靠左 在 jupyter notebook中&#xff0c;导入的图片过大&#xff0c;想要改变图像的大小 &#x1f56e;原始图像 &#x1f56e;改变图像大小 复制小括号里面的内容到src后面&#xff0c;满足<…

《LeetCode力扣练习》代码随想录——数组(螺旋矩阵II---Java)

《LeetCode力扣练习》代码随想录——数组&#xff08;螺旋矩阵II—Java&#xff09; 刷题思路来源于 代码随想录 59. 螺旋矩阵 II 左闭右开——[x,y) class Solution {public int[][] generateMatrix(int n) {if(n1){return new int[][]{{1}};}int[][] resultnew int[n][n];int…

opencv 任意两点切割图像

目录 opencv python直线切割图像,把图像分为两个多边形 升级版,把多边形分割抠图出来,取最小外接矩形: