Python 模拟登录网页,或者编写爬虫时模拟登录的详细总结
参考
Python模拟登陆网页的三种方法_python模拟登录-CSDN博客
python-模拟登陆多种方法总结_python模拟登录-CSDN博客
Python模拟登录的几种方法_实现模拟登录的方式有哪些?-CSDN博客
Python爬虫——模拟登录_python 模拟登录-CSDN博客
Python3 爬虫 模拟登录_python模拟登录网站-CSDN博客
模拟登录
模拟登录现在主要分为两种模式,一种是基于Session和Cookie的模拟登录,一种是基于JWT(JSON Web Token)的模拟登录。
简单来说,打开网页后模拟登录,服务器会返回带有Set-Cookie字段的响应头,客户端会生成对应的Cookie,其中保存着与SessionID相关的信息,之后发送给服务器的请求都会携带这个生成的Cookie。这种模式的核心是获取客户端登录后生成的Cookie。对于第二种模式也是如此,现在很多网站采取的开发模式是前后端分离式,所以使用JWT进行登录校验越来越普遍。请求数据时,服务器会校验请求中携带的JWT是否有效,如果有效,就返回正常的数据,所以,这种模式其实就是获取JWT。
基于分析结果,我们可以手动在浏览器里输入用户名和密码,再把Cookie或者JWT复制到代码中请求数据,但是这样做明显会增加人工工作量。所以说实现爬虫,就要程序模拟登录。
1. 模拟登录的基本原理
### 模拟登录的必要性
- **获取身份验证后的数据**:有些网页需要用户登录后才能访问,这些页面的数据是通过身份验证来保护的,爬虫需要模拟登录才能获取这些数据.
- **维持会话状态**:网站通常通过 cookies 维持用户的会话状态,模拟登录后可以保持登录状态,以便进行后续的爬取操作,如访问登录后的页面、获取用户数据等.
### 模拟登录的基本步骤
1. **分析登录页面**:
- 在浏览器中打开目标网站的登录页面,使用开发者工具(F12)查看登录请求是如何发送的.
- 在 **Network** 选项卡中查找登录请求的 URL,找到需要提交的表单字段(如用户名、密码等),并确认是否需要发送其他隐藏字段,如 `token` 或 `CSRF`(跨站请求伪造)防护码.
2. **发送登录请求**:
- 使用 Python 的 `requests` 库模拟用户发送登录表单数据,获取登录后的会话.
- 创建一个 `Session` 对象来保持会话状态,使用 `session.post()` 方法提交登录表单,表单数据包括用户名、密码和其他必要的隐藏字段.
3. **维持会话状态**:
- 登录成功后,`Session` 对象会自动保存 cookies,你可以使用同一个会话对象进行后续的请求,以保持登录状态并访问登录后的页面.
- 如果需要手动处理 cookies,可以在请求时将 cookies 作为参数传递给 `requests` 方法.
### 常用工具与库
- **requests**:用于发送 HTTP 请求,是模拟登录的核心工具.
- **BeautifulSoup**(可选):用于解析网页数据,提取登录页面中的隐藏字段(如 CSRF 令牌)等信息.
- **Selenium**:用于模拟真实浏览器操作,适用于处理复杂的登录流程,如带有验证码或动态加载内容的页面.
### 实战案例:模拟登录 GitHub
1. **获取登录页面和 CSRF 令牌**:
- 使用 `requests` 获取 GitHub 登录页面,解析页面内容,提取 `authenticity_token`(CSRF 令牌).
2. **提交登录表单**:
- 构造登录表单数据,包括用户名、密码和 `authenticity_token`,使用 `session.post()` 方法提交表单,登录 GitHub.
3. **访问登录后页面**:
- 使用已登录的会话对象请求登录后的页面,如 GitHub 个人主页,获取页面内容.
### 处理常见问题
- **处理验证码**:
- **手动输入**:在脚本运行时暂停,人工输入验证码.
- **OCR(光学字符识别)**:使用 `Tesseract` 等库自动识别验证码图片(如果验证码不是太复杂).
- **绕过验证码**:通过分析网站接口,找到无验证码的登录方式(某些 API 不需要验证码).
- **使用代理**:
- 如果目标网站对频繁的登录请求有限制(如 IP 封禁),可以使用代理池来发送请求,通过 `proxies` 参数指定代理服务器.
- **处理动态加载内容**:
- **抓取 API**:找到页面背后调用的接口,直接请求 API 获取数据.
- **Selenium**:使用 Selenium 模拟真实浏览器操作,处理 JavaScript 动态加载的内容.
### 保存用户信息的方法
- **通过 Session 保存登录信息**:
- 使用 `requests.Session()` 创建会话对象,通过会话对象发送请求,会自动保存和携带 cookies,保持登录状态.
- 示例代码:
```python
import requests
s = requests.Session()
r = s.post(url, headers=headers)
```
- **通过 Cookie 保存登录信息**:
- 使用 `http.cookiejar` 模块初始化 Cookie,通过 `urllib.request.HTTPCookieProcessor` 处理 Cookie,保存登录信息.
- 示例代码:
```python
import urllib.request, http.cookiejar
cookie = http.cookiejar.CookieJar()
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cookie))
urllib.request.install_opener(opener)
```
### 注意事项
- **遵守网站的爬虫政策**:在进行模拟登录和爬取数据时,务必遵守目标网站的爬虫协议和使用条款,不要对网站造成过大的负载或违反法律法规.
- **处理异常和错误**:在代码中添加异常处理和错误检查,确保在登录失败或请求出错时能够及时发现并处理,避免程序崩溃或数据丢失.
- **更新和维护**:网站的登录机制和页面结构可能会发生变化,定期检查和更新爬虫代码,以适应网站的更新和变化,确保爬虫的稳定性和有效性.
使用Selenium模拟登录
注意 ChromeDriver和chrome版本要对应上,
当然第三个小数点后面的版本好不对应也可以
# Chrome 版本 109.0.5414.120(正式版本) (64 位) # 指定 ChromeDriver 的路径 service = Service(executable_path='K:/download/chromedriver109.0.5414.25.exe')
下载 ChromeDriverGitCode - 全球开发者的开源社区,开源代码托管平台GitCode是面向全球开发者的开源社区,包括原创博客,开源代码托管,代码协作,项目管理等。与开发者社区互动,提升您的研发效率和质量。https://gitcode.com/open-source-toolkit/da9da?utm_source=highlight_word_gitcode&word=ChromeDriver&isLogin=1ChromeDriver GitCode - 全球开发者的开源社区,开源代码托管平台
更多版本 这个网址 GitCode - 全球开发者的开源社区,开源代码托管平台GitCode是面向全球开发者的开源社区,包括原创博客,开源代码托管,代码协作,项目管理等。与开发者社区互动,提升您的研发效率和质量。https://gitcode.com/org/open-source-toolkit/repos,搜索 chromedriver
对于 登陆方式是比较特殊的 。直接在js中实现的
一、使用Selenium模拟登录
使用Selenium来进行模拟登录,整个过程非常简单。流程如下。
(1)初始化ChromeDriver。
(2)打开知乎登录页面。
(3)找到用户名的输入框,输入用户名。
(4)找到密码输入框,输入密码。
(5)手动单击验证码。
(6)按下Enter键。
以上过程,若使用Selenium,一般情况下只需要不到20行代码就可以完成:
selenium 4以下的的老版本
from selenium import webdriver from elenium.webdriver.common.keys import Keys import time driver = webdriver.Chrome('./chromedriver') #填写你的chromedriver的路径 driver.get("https://www.zhihu.com/#signin") elem = driver.find_element_by_name("account") #寻找账号输入框 elem.clear() elem.send_keys("xxx@gmail.com") #输入账号 password = driver.find_element_by_name('password') #寻找密码输入框 password.clear() password.send_keys("12345678") #输入密码 input('请在网页上点击倒立的文字,完成以后回到这里按任意键继续。') elem.send_keys(Keys.RETURN) #模拟键盘回车键 time.sleep(10) #这里可以直接sleep, 也可以使用等待某个条件出现 print(driver.page_source) driver.quit()
上面的代码就是使用Selenium登录知乎的全部代码,包括空行一共18行。程序首先打开知乎的登录页面,然后使用“find_element_by_name”分别找到输入账号和密码的两个输入框。这两个输入框的name属性值分别为“account”和“password”。
新版本
from selenium import webdriver
from selenium.webdriver.chrome.service import Service# Chrome 版本 109.0.5414.120(正式版本) (64 位)
# 指定 ChromeDriver 的路径
service = Service(executable_path='K:/download/chromedriver109.0.5414.25.exe')# 创建 WebDriver 实例
driver = webdriver.Chrome(service=service)# 打开一个网页
driver.get('https://www.example.com')# 执行一些操作,例如获取页面标题
print(driver.title)# 关闭浏览器
driver.quit()
在Selenium中可以使用send_keys()方法往输入框中输入字符串。在输入了密码以后,验证码框就会弹出来。知乎使用的验证码为点击倒立的文字,这种验证码不容易自动化处理,因此在这个地方让爬虫先暂停,手动点击倒立文字。爬虫中的input()语句会阻塞程序,直到在控制台按下Enter键,爬虫才会继续运行,触发知乎的登录行为,实现登录。
无论是使用Selenium来运行异步加载的网站,还是模拟登录,代码少,效果好,看起来简直完美。但是Selenium的缺点就是它的速度太慢了。如果一个网页有很多图片又有很多的异步加载,那么使用Selenium处理完成一个网页要十几秒甚至几十秒。而且如果是在服务器上使用PhantomJS作为WebDriver,还会出现内存泄漏的问题,爬虫轻轻松松就会把服务器内存撑爆。因此,Selenium不适合用于大规模的爬虫开发。虽然Selenium和WebDriver不适合做主力,但是用其来做辅助操作,却有意想不到的效果。
selenium模拟登陆
Selenium 是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等。这个工具的主要功能包括:测试与浏览器的兼容性——测试你的应用程序看是否能够很好得工作在不同浏览器和操作系统之上。测试系统功能——创建回归测试检验软件功能和用户需求。支持自动录制动作和自动生成.Net、Java、Perl等不同语言的测试脚本。
3.1.常见的函数使用
selenium.webdriver支持各种浏览器,包括谷歌、火狐、IE等浏览器,这里主要使用谷歌,不同浏览器操作区别不太。常用的几个函数包如下
from selenium import webdriver #基础模块应用,用来创建浏览器对象,操作浏览器
from selenium.common.exceptions import TimeoutException #异常处理
from selenium.webdriver.support.ui import WebDriverWait # 设置等待浏览器加载
3.2.html中的定位元素
html中的元素定位上面都准备好了之后,只要熟悉了html的定位就可以很好的进行模拟登陆了。元素查找分为以下几类:
(1)find_element_by_name------通过它的name属性单位到这个元素
(2)find_element_by_id--------通过它的id属性单位到这个元素。
(3)find_element_by_xpath-----如果一个元素它既没有id、name、class属性也不是超链接,这么办呢?或者说它的属性很多重复的。这个时候就可以用xpath解决
(4)find_element_by_link_text--通过link超链接属性定位
(5)find_element_by_partial_link_text-有时候一个超链接它的字符串可能比较长,如果输入全称的话,会显示很长,这时候可以用一模糊匹配方式,截取其中一部分字符串就可以了
(6)find_element_by_tag_name---每个元素都有tag(标签)属性
(7)find_element_by_class_name-通过它的class属性定位到这个元素
(8)find_element_by_css_selector
1.find_element_by_id--定位id属性
以百度搜索 框为例,id属性由浏览器-->F12寻找搜索框的id属性得来。如下:
其他类似的属性:
selenium3老版本
from selenium import webdriver
from time import sleep# 初始化Chrome浏览器驱动
driver = webdriver.Chrome()# 访问百度首页
driver.get('https://www.baidu.com')# 通过id属性定位百度搜索框,并输入“python”
driver.find_element_by_id("kw").send_keys("python")# 通过name属性定位百度搜索框,并输入“python”--->可能会产生报错,主要是由于name属性不唯一
# 注意:这里原代码中的dirver是拼写错误,应为driver
driver.find_element_by_name("wd").send_keys("python")# 通过class属性定位百度搜索框,并输入“python”
driver.find_element_by_class_name("s_ipt").send_keys("python")# 通过tag_name属性定位搜索框,并输入“python”--->直接运行是会报错的,因为页面上可能有多个input标签
driver.find_element_by_tag_name("input").send_keys("python")# 通过link_text属性定位hao123按钮,并点击
driver.find_element_by_link_text("hao123").click()# 有时候一个超链接它的字符串可能比较长,如果输入全称的话,会显示很长,这时候可以用一模糊匹配方式,截取其中一部分字符串就可以了
# partial_link_text是一种模糊匹配的方式,对于超长字符中的一段进行匹配
driver.find_element_by_partial_link_text("ao123").click()# 通过xpath语法进行定位
driver.find_element_by_xpath('//*[@id="kw"]').send_keys("python")
selenium版本4
from selenium import webdriver
from time import sleep# 初始化Chrome浏览器驱动
driver = webdriver.Chrome()# 访问百度首页
driver.get('https://www.baidu.com')# 通过id属性定位百度搜索框,并输入“python”
driver.find_element_by_id("kw").send_keys("python")# 通过name属性定位百度搜索框,并输入“python”--->可能会产生报错,主要是由于name属性不唯一
# 注意:这里原代码中的dirver是拼写错误,应为driver
driver.find_element_by_name("wd").send_keys("python")# 通过class属性定位百度搜索框,并输入“python”
driver.find_element_by_class_name("s_ipt").send_keys("python")# 通过tag_name属性定位搜索框,并输入“python”--->直接运行是会报错的,因为页面上可能有多个input标签
driver.find_element_by_tag_name("input").send_keys("python")# 通过link_text属性定位hao123按钮,并点击
driver.find_element_by_link_text("hao123").click()# 有时候一个超链接它的字符串可能比较长,如果输入全称的话,会显示很长,这时候可以用一模糊匹配方式,截取其中一部分字符串就可以了
# partial_link_text是一种模糊匹配的方式,对于超长字符中的一段进行匹配
driver.find_element_by_partial_link_text("ao123").click()# 通过xpath语法进行定位
driver.find_element_by_xpath('//*[@id="kw"]').send_keys("python")
link属性按钮比如hao123
find_element_by_xpath()------以上定位方式都是通过元素的某个属性来定位的,如果一个元素它既没有id、name、class属性也不是超链接,这么办呢?或者说它的属性很多重复的。这个时候就可以用xpath解决
使用方法:chrome应用商店下载xpath helper插件,该插件在安装后,打开某个网页 拷贝目标页面元素的XPATH,如下图所示。copy的结果为:
//*[@id="kw"]/html/body/div[1]/div[2]/div[5]/div[1]/div/form/span[1]/input
selenium模拟登陆的代码如下:
find_element_by_css_selector中的元素我 们可以在chrome中右边copy selector选择得出,具体如下图所示:
#方式三:selenium模拟登录
from selenium import webdriver
from time import sleep
driver = webdriver.Chrome()
driver.get('http://jsnu.fuyunweb.com/login2.html')
sleep(2)
driver.find_element_by_name("user").send_keys("用户名")
driver.find_element_by_name("passwordLogin").send_keys("密码")
sleep(2)
# find_element_by_css_selector中的元素在chrome中可以通过右键copy selector 进行选择
driver.find_element_by_css_selector("body > div.login2.log > div > div.loginbtn > button").click()#登录点击模拟
自动输入用户名和密码进行登录
四.socket模拟登陆
什么是Socket?
Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯。
# 方式四:socket编程
import socket
from urllib.parse import urlparse
url = urlparse('http://XXX/login2.html')#登录界面
host = url.netloc #获取url中的host
path = url.path #获取url后面的路径
#data为抓到的响应包
data = '''
POST /manage/admin/pt_login.aspx HTTP/1.1
Host: jsnu.fuyunweb.com
Content-Length: 40
Accept: */*
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Origin: http://XXX
Referer: http:/XXX/login2.html
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Cookie: ASP.NET_SessionId=2fwb5pydk0htjy45nanudauf; userinfo=userid=ZTxan6d5Aja4AMMDe5yu&uid=pCRUyMSkr5XlOxie3ganHRdIJ7fQDe5yuDe5yu&pass=837A6C7DDD08D1629D0F1394190687EE&schoolid=7YTECdKVMaQDe5yu&cookid=9f729e29-a4d2-4b39-8bbc-068e2c7ab644
Connection: close
action=login&uid=用户名&pass=密码
'''
# 建立socke连接,如果是https请求需要使用ssl,例如:ssl.wrap_socket(socket.socket())
# ssl是专门用来处理https的模块,我们使用该模块的wrap_socket函数生成一个SSLSocket对象,使用前需要使用import进行导入
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((host,80)) #建立连接
sock.send(data.format(path, host).encode("utf-8")) #发送数据
#recv_data = sock.recv(8192) #可以直接获取响应包的数据,以下循环纯属是用来对响应包格式进行一个规范的没有什么意义
recv_data = b""
while True:
d = sock.recv(1024)
if d:
recv_data += d
else:
break
recv_data = recv_data.decode("utf-8")
print(recv_data)
sock.close()
输出结果如下:
HTTP/1.1 200 OK
Cache-Control: private
Content-Length: 91
Content-Type: text/html; charset=utf-8
Server: Microsoft-IIS/8.0
X-AspNet-Version: 2.0.50727
Set-Cookie: userinfo=; expires=Sat, 12-Dec-2020 07:55:03 GMT; path=/
Set-Cookie: userinfo=userid=ZTxan6d5Aja4AMMDe5yu&uid=pCRUyMSkr5XlOxie3ganHRdIJ7fQDe5yuDe5yu&pass=837A6C7DDD08D1629D0F1394190687EE&schoolid=7YTECdKVMaQDe5yu&cookid=be8bf64b-430a-400c-b735-bd11ce65c6cc; domain=jsnu.fuyunweb.com; expires=Sat, 02-Jan-2021 07:55:03 GMT; path=/; HttpOnly
X-Powered-By: ASP.NET
Date: Sun, 13 Dec 2020 07:55:02 GMT
Connection: close
success<[ DISCUZ_CODE_2 ]gt;/manage/admin/admin_pt_main.aspx<[ DISCUZ_CODE_2 ]gt;/manage/admin/admin_pt_order_mydbgd.aspx
socket拓展:
一些来自于链接:https://www.cnblogs.com/limengda/p/10785719.html
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
socket又称为套接字,可以将其分为多种:
1.基于文件类型的套接字:AF_UNIX unix一切皆文件,基于文件的套接字调用的就是底层的文件系统来取数据,两个套接字进程运行在同一机器,可以通过访问同一个文件系统间接完成通信
2.基于网络类型的套接字:AF_INET/6 还有AF_INET6被用于ipv6,还有一些其他的地址家族,不过,他们要么是只用于某个平台,要么就是已经被废弃,或者是很少被使用,或者是根本没有实现,所有地址家族中,AF_INET是使用最广泛的一个,python支持很多种地址家族,但是由于我们只关心网络编程,所以大部分时候我么只使用AF_INET
一个生活中的场景。你要打电话给一个朋友,先拨号,朋友听到电话铃声后提起电话,这时你和你的朋友就建立起了连接,就可以讲话了。等交流结束,挂断电话结束此次交谈。 生活中的场景就解释了这工作原理。
服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。
客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束。
# 获取tcp/ip套接字
tcpSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 获取udp/ip套接字
udpSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 由于 socket 模块中有太多的属性。我们在这里破例使用了'from module import *'语句。使用 'from socket import *',我们就把 socket 模块里的所有属性都带到我们的命名空间里了,这样能 大幅减短我们的代码。
# 例如tcpSock = socket(AF_INET, SOCK_STREAM)
'''
# 涉及到的参数
AF_UNIX : 文件类型的套接字
AF_INET/6 :网络类型的套接字
SOCK_STREAM:提供面向连接的稳定数据传输,即TCP协议
SOCK_DGRAM :是基于UDP的,专门用于局域网
protocal : 协议默认为0填写的就是tcp协议
'''
# 服务端套接字函数
s.bind() 绑定(主机,端口号)到套接字
s.listen() 开始TCP监听,半连接池可以指定等待数量
s.accept() 被动接受TCP客户的连接,(阻塞式)等待连接的到来
# 客户端套接字函数
s.connect() 主动初始化TCP服务器连接
s.connect_ex() connect()函数的扩展版本,出错时返回出错码,而不是抛出异常
# 公共用途的套接字函数
s.recv() 接收TCP数据
s.send() 发送TCP数据(send在待发送数据量大于己端缓存区剩余空间时,数据丢失,不会发完)
s.sendall() 发送完整的TCP数据(本质就是循环调用send,sendall在待发送数据量大于己端缓存区剩余空间时,数据不丢失,循环调用send直到发完)
s.recvfrom() 接收UDP数据
s.sendto() 发送UDP数据
s.getpeername() 连接到当前套接字的远端的地址
s.getsockname() 当前套接字的地址
s.getsockopt() 返回指定套接字的参数
s.setsockopt() 设置指定套接字的参数
s.close() 关闭套接字
# 面向锁的套接字方法
s.setblocking() 设置套接字的阻塞与非阻塞模式
s.settimeout() 设置阻塞套接字操作的超时时间
s.gettimeout() 得到阻塞套接字操作的超时时间
# 面向文件的套接字的函数
s.fileno() 套接字的文件描述符
s.makefile() 创建一个与该套接字相关的文件
PS:一些用户名和密码比较涉及隐私,就码掉了,调用函数这自行添加啊
相关文章:
Python 模拟登录网页,或者编写爬虫时模拟登录的详细总结
参考 Python模拟登陆网页的三种方法_python模拟登录-CSDN博客 python-模拟登陆多种方法总结_python模拟登录-CSDN博客 Python模拟登录的几种方法_实现模拟登录的方式有哪些?-CSDN博客 Python爬虫——模拟登录_python 模拟登录-CSDN博客 Python3 爬虫 模拟登录_python模拟登录网…...
若依框架简介
若依(RuoYi)框架是一个基于Java语言的后台管理系统快速开发框架,它结合了多种前端和后端技术,提供了高效的开发工具。以下是对若依框架的详细解析: 一、技术架构 后端:若依框架后端采用了Spring Boot、My…...
Linux中rsync命令使用
一、rsync简介 rsync 是一种高效的文件复制和同步工具,常用于在本地或远程计算机之间同步文件和目录 主要特性增量同步:rsync 会检测源和目标文件之间的差异,只传输发生变化的部分,而不是重新传输整个文件。这样就能有效减少数据…...
opencv 学习(1)
文章目录 opencv导学部分opencv的作用ffmpeg和 opencv的关系opencv的未来 计算机视觉是什么? opencv导学部分 opencv的作用 1 : 目标识别 人脸识别 车辆识别 2 : 自动驾驶技术 – 计算机视觉 进行车道的检测 3 : 医学图像分析 通过分析光片 来分析人到底得了什么病…...
中高级运维工程师运维面试题(十一)之 Docker
目录 往期回顾前言基础知识1. 什么是 Docker?2. Docker 的核心组件有哪些?3. Docker 镜像和容器有什么区别?4. 什么是 Dockerfile? 高级知识5. 什么是多阶段构建?如何使用?6. Docker 网络有哪些模式&#x…...
Kafka如何实现顺序消费?
Kafka的消息是存储在指定的topic中的某个partition中的。并且一个topic是可以有多个partition的。同一个partition中的消息是有序的,但是跨partition,或者跨topic的消息就是无序的了。 为什么同一个partition的消息是有序的? 因为当生产者向某个parti…...
通过 ulimit 和 sysctl 调整Linux系统性能
目录 一:资源限制管理工具:ulimit1、ulimit 作用介绍2、ulimit 常用选项3、ulimit 配置文件 二:内核参数调整工具:sysctl1、sysctl 作用介绍2、sysctl 常用选项3、sysctl 配置文件 一:资源限制管理工具:uli…...
pandas基础使用
pandas基础使用 基本介绍 类似于字典形式的numpy,可以给它的不同行和不同列进行重命名。 import numpy as np import pandas as pd # 创建一个序列 s pd.Series([1,4,True,np.nan,55.0])创建date format日期矩阵 import numpy as np import pandas as pd dates…...
2024.1.5总结
今日不开心:这周本来想花点时间学习的,没想到全都花在刷视频,外出消费去了。 今日思考: 1.找对象这件事确实不能强求,顺其自然吧,单身和不单身,其实,各有各的利弊。在一次坐地铁的过程中,我一…...
解释一下:运放的输入偏置电流
输入偏置电流 首先看基础部分:这就是同相比例放大器 按照理论计算,输入VIN=0时,输出VOUT应为0,对吧 仿真与理论差距较大,有200多毫伏的偏差,这就是输入偏置电流IBIAS引起的,接着看它的定义 同向和反向输入电流的平均值,也就是Ib1、Ib2求平均,即(Ib1+Ib2)/2 按照下面…...
Federation机制的实现
1.关闭Hadoop的HDFS和YARN,依次执行“stop-yarn.sh”和“stop-dfs.sh”命令关闭Hadoop的YARN和HDFS。 2.删除3台虚拟机上的临时文件: 3.修改hdfs-site.xml配置文件,进入虚拟机liumengting1的/export/servers/hadoop-3.3.4/etc/hadoop目录&…...
120.Jenkins里的Pipeline Script
目录 1. **Declarative Pipeline** 主要部分 示例 2. **Scripted Pipeline** 主要部分 示例 3. **常用指令和功能** 环境变量 工具管理 文件操作 构建触发器 并行执行 异常处理 用户交互 4.**两种类型的特点** 1. **声明式 Pipeline (Declarative Pipeline)** 中…...
SpringBoot3-整合WebSocket指南
更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ SpringBoot3-整合WebSocket指南 1. 什么是WebSocket?2. 环境准备2.1 项目依赖 3. WebSocket配置3.1 WebSocket配置类3.2 自定义WebSocket处理器 4. 控制器5. 前端实现5.…...
【npm依赖包介绍】借助rimraf依赖包,在用npm run build构建项目时,清空dist目录,避免新旧混合
文章目录 背景如何使用附上rimraf的介绍和说明主要作用使用场景安装使用示例异步删除同步删除 参考资料 背景 在npm run build时,一般都会清空项目中已有的dist目录再构建,避免新旧混合。 如何使用 可以简单使用rimraf这个npm依赖包。 目前rimraf的最…...
python学opencv|读取图像(二十四)使用cv2.putText()绘制文字进阶-倾斜文字
【1】引言 前述学习进程中,我们已经掌握了pythonopencv绘制文字的基本技能,相关链接为: python学opencv|读取图像(二十三)使用cv2.putText()绘制文字-CSDN博客 在这里,我们使用不同的字体、线条颜色和线…...
【简博士统计学习方法】第1章:3. 统计学习方法的三要素
3. 统计学习方法的三要素 3.1 监督学习的三要素 3.1.1 模型 假设空间(Hypothesis Space):所有可能的条件概率分布或决策函数,用 F \mathcal{F} F表示。 若定义为决策函数的集合: F { f ∣ Y f ( X ) } \mathcal{F…...
“AI智慧语言训练系统:让语言学习变得更简单有趣
大家好,我是你们的老朋友,一个热衷于探讨科技与教育结合的产品经理。今天,我想和大家聊聊一个让语言学习变得不再头疼的话题——AI智慧语言训练系统。这个系统可是我们语言学习者的福音,让我们一起来揭开它的神秘面纱吧࿰…...
机器学习笔记 - 单幅图像深度估计的最新技术
1、深度估计简述 单眼深度估计是一项计算机视觉任务,AI 模型从单个图像中预测场景的深度信息。模型估计场景中对象从一个照相机视点的距离。单目深度估计已广泛用于自动驾驶、机器人等领域。深度估计被认为是最困难的计算机视觉任务之一,因为它要求模型理解对象及其深度信息之…...
洛谷:P1540 [NOIP2010 提高组] 机器翻译
[NOIP2010 提高组] 机器翻译 题目背景 NOIP2010 提高组 T1 题目描述 小晨的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章。 这个翻译软件的原理很简单,它只是从头到尾,依次将每个英文单词用对应的中文含义来替换。对于…...
2025第2周 | JavaScript中的函数的参数默认值和剩余参数
目录 1. 函数的默认值1.1 ES5的时候默认值写法1.2 es6的默认值1.3 babel转换之后1.4 有默认值的参数建议放到最后1.5 有默认值的函数length属性 2. 参数为对象时默认值及解构2.1 默认值和解构一起使用2.2 默认值为一个空对象 3. 剩余参数3.1 剩余参数必须放到最后3.2 剩余参数和…...
Unity学习之UGUI(三)
十二、Slider 1、作用 Slider是滑动条组件,是UGUI中用于处理滑动条相关交互的关键组件 创建Slider默认包括4个对象 父对象:Slider组件依附的对象 子对象:背景图,进度图,滑动块三组对象 2、主要参数 3、代码控制 voi…...
分享3个国内使用正版GPT的网站【亲测有效!2025最新】
1. molica 传送入口:https://ai-to.cn/url/?umolica 2. 多帮AI 传送入口:https://aigc.openaicloud.cn?inVitecodeMYAAGGKXVK 3. 厉害猫 传送入口:https://ai-to.cn/url/?ulihaimao...
ffmpeg-avio实战:打开本地文件或者网络直播流dome
使用ffmpeg打开打开本地文件或者网络直播流的一个小dome。流程产靠ffmpeg4.x系列的解码流程-CSDN博客 #include <libavcodec/avcodec.h> #include <libavformat/avformat.h> #include <libavformat/avio.h> #include <libavutil/file.h> #include &l…...
三维管线管网自动化建模工具MagicPipe3D V3.6.0
经纬管网建模系统MagicPipe3D,本地离线参数化构建地下管网三维模型(包括管道、接头、附属设施等),输出标准3DTiles、Obj模型等格式,支持Cesium、Unreal、Unity、Osg等引擎加载进行三维可视化、语义查询、专题分析。欢迎…...
设计基于检索增强生成的个性化语言模型(RAG-based LLM)
设计基于检索增强生成的个性化语言模型(RAG-based LLM) 引言 在当今快速发展的自然语言处理技术中,生成式预训练模型(LLM)对个性化和可靠结果的需求不断增加。为了满足这种需求,基于检索增强生成…...
Oracle Dataguard(主库为单节点)配置详解(5):使用 rman 复制技术(DUPLICATE)同步主库到备库
Oracle Dataguard(主库为单节点)配置详解(5):使用 rman 复制技术(DUPLICATE)同步主库到备库 目录 Oracle Dataguard(主库为单节点)配置详解(5)&am…...
119.使用AI Agent解决问题:Jenkins build Pipeline时,提示npm ERR! errno FETCH_ERROR
目录 1.Jenkins Build时的错误 2.百度文心快码AI智能体帮我解决 提问1:jenkins中如何配置npm的源 提问2:jenkins pipeline 类型为pipeline script from SCM时,如何配置npm源 3.最终解决方法-Jenkinsfile的修改 4.感触 1.Jenkins Build时…...
回归预测 | MATLAB实ELM-Adaboost多输入单输出回归预测
回归预测 | MATLAB实ELM-Adaboost多输入单输出回归预测 目录 回归预测 | MATLAB实ELM-Adaboost多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 一、极限学习机(ELM) 极限学习机是一种单层前馈神经网络,具有训练速…...
服务器漏洞修复解决方案
漏洞1、远程桌面授权服务启用检测【原理扫描】 Windows Remote Desktop Licensing Service is running: Get Server version: 0x60000604 1、解决方案:建议禁用相关服务避免目标被利用 方法一:使用服务管理器 打开“运行”对话框(WinR&am…...
Couldn‘t resolve host name for http://mirrorlist.centos.org
【问题】 在CentOS8执行sudo yum update -y 软件包更新的时候报错 Errors during downloading metadata for repository appstream:- Curl error (6): Couldnt resolve host name for http://mirrorlist.centos.org/?release8-stream&archx86_64&repoAppStream&…...
Vue2:el-table中的文字根据内容改变颜色
想要实现的效果如图,【级别】和【P】列的颜色根据文字内容变化 1、正常创建表格 <template><el-table:data="tableData"style="width: 100%"><el-table-column prop="id" label="ID"/> <el-table-column …...
C++静态变量的使用方法?C++静态变量占用内存情况?拷贝构造函数会拷贝哪些内容?const使用注意
1.静态变量的使用 函数中使用:静态变量初次声明并定义作为初始值,后续再次运行函数,基于上次的结果累加类中:类内声明,类外实现(如声明为const,特殊情况,可以类内直接声明时定义&am…...
Linux初识——基本指令
我们在linux下输入各种指令,其实就相当于在windows中的相关操作,比如双击,新建文件夹等。 以下是相关基本指令基本用法 一.ls(显示当前目录下的所有文件和目录) 那如何显示当前目录(我们所在的位置&…...
python 实现贪心算法(Greedy Algorithm)
贪心算法(Greedy Algorithm)是一种在每一步选择中都采取当前最优的选择,希望通过局部最优解达到全局最优解的算法设计方法。以下是使用Python实现贪心算法解决几个经典问题的示例: 1. 活动选择问题(Activity Selection…...
设计形成从业务特点到设计模式的关联
规范和指引在应用架构、数据架构等各架构方向上形成规范性约束指导。同一个决策要点、架构单元在统一的架构原则指导下,会因业务特点差异有不同的实现,经过总结形成了最佳实践。在开展新应用的设计时,根据决策要点以及相关的业务特点…...
Pytorch初学
创建虚拟环境 python控制台,jupyter notebook,python文件运行的差异,后续结合使用三者。 jupter主要可以对代码进行分割单独运行,主要做一些探索性工作。 数据集的常见存储模式 1、以标签命名图像。 2、单独存储图像的地址。 加载数据集…...
【动态重建】时间高斯分层的长体积视频
标题:Representing Long Volumetric Video with Temporal Gaussian Hierarchy 来源:浙江大学 链接:https://zju3dv.github.io/longvolcap/ 文章目录 摘要一、前言二、主要方法2.1 时间高斯分层2.2 高效渲染2.3 层次结构更新2.4 紧凑的外观模型…...
Java设计模式 —— 【行为型模式】命令模式(Command Pattern) 详解
文章目录 模式介绍优缺点适用场景结构案例实现注意事项 模式介绍 有时候需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是什么。此时希望用一种松耦合的方式来设计程序,使得请求发送者和请求接收者能够消除彼此…...
IOS开发如何从入门进阶到高级
针对iOS开发的学习,不同阶段应采取不同的学习方式,以实现高效提升.本文将iOS开发的学习分为入门、实战、进阶三个阶段,下面分别详细介绍. 一、学习社区 iOS开源中国社区 这个社区专注于iOS开发的开源项目分享与协作,汇集了大量开…...
数据结构与算法之二叉树: LeetCode 108. 将有序数组转换为二叉搜索树 (Ts版)
将有序数组转换为二叉搜索树 https://leetcode.cn/problems/convert-sorted-array-to-binary-search-tree/description/ 描述 给你一个整数数组 nums ,其中元素已经按 升序 排列请你将其转换为一棵 平衡 二叉搜索树 示例 1 输入:nums [-10,-3,0,5,9…...
细说STM32F407单片机以轮询方式读写外部SRAM的方法
目录 一、实例的功能 二、工程配置 1、KEYLED 2、时钟、DEBUG、USART6、NVIC、GPIO、CodeGenerator 3、FSMC (1) 模式设置 (2) Bank 1子区3参数设置 1) NOR/PSRAM control组,子区控制参数 2) NOR/PSRAM timi…...
【Unity3D】AB包加密(AssetBundle加密)
加密前: 加密后,直接无法加载ab,所以无法正常看到ab内容。 using UnityEngine; using UnityEditor; using System.IO; public static class AssetBundleDemoTest {[MenuItem("Tools/打包!")]public static void Build(){//注意:St…...
wujie无界微前端框架初使用
先说一下项目需求:将单独的四套系统的登录操作统一放在一个入口页面进行登录,所有系统都使用的是vue3,(不要问我为啥会这样设计,产品说的客户要求) 1.主系统下载wujie 我全套都是vue3,所以直接…...
联发科MTK6771/MT6771安卓核心板规格参数介绍
MT6771,也被称为Helio P60,是联发科技(MediaTek)推出的一款中央处理器(CPU)芯片,可运行 android9.0 操作系统的 4G AI 安卓智能模块。MT6771芯片采用了12纳米工艺制造,拥有八个ARM Cortex-A73和Cortex-A53核心,主频分别…...
ZooKeeper Java API操作
(1)添加依赖,在pom.xml文件中添加zookeeper依赖: (2)连接zookeeper服务,创建cn.itcast.zookeeper包,在该包中创建ZooKeeperDemo类,该类用于实现创建会话和操作ZooKeeper&…...
【vue3封装element-plus的反馈组件el-drawer、el-dialog】
vue2中封装el-drawer、el-dialog这类反馈类子组件,需要将父组件的visible值传递子组件,并且再通过$emit将关闭弹窗的组件值传回父组件,同事子组件还需要监听父组件传递过来的visible的值,来驱动弹窗显示隐藏,很麻烦&am…...
doris:远程存储
功能简介 远程存储支持把部分数据放到外部存储(例如对象存储,HDFS)上,节省成本,不牺牲功能。 注意 远程存储的数据只有一个副本,数据可靠性依赖远程存储的数据可靠性,您需要保证远程存储有…...
win11 电脑重启后,需要重新插拔U盘、移动硬盘才能识别问题
win11 电脑重启后,需要重新插拔U盘、移动硬盘才能识别问题 前言 原因:win10在一个版本更新后,usb默认都开了自动停用 一、解决方式一 在设备管理里面找到那些需要插拔才能识别的usb设备,电源策略里关掉“允许计算机关闭这个设…...
望获实时Linux系统与大语言模型深度融合,开创实时智能无限可能!
大语言模型的崛起为智能化应用开辟了新的可能性。借助深度学习技术,这些模型能够理解和生成自然语言,处理复杂的文本和语义信息。这使得它们在诸如人机问答、内容生成和数据分析等领域展现出巨大的潜力。在实时控制领域,大语言模型能够显著提…...
【工业场景】用YOLOv8实现工业安全帽识别
工业安全帽识别是一项重要的工作安全管理措施,旨在防止工作场所发生头部伤害事故。通过使用YOLOv8等深度学习模型,可以实时准确地检测出工人是否佩戴安全帽,及时发现违规行为,为工人提供更安全的工作环境。 使用YOLOv8实现工业安全…...