python爬虫之xpath4

embedded/2024/9/17 19:00:49/ 标签: web安全

1 最终项目实现的代码

仙剑

#!/usr/bin/env python
​
import logging
import requests
import re
from urllib.parse import urljoin
import pymongo
import multiprocessing
​
mongo_client = pymongo.MongoClient("mongodb://192.168.135.131:27017/")
db = mongo_client["wy_movies"]
collection = db["movies"]
​
logging.basicConfig(level=logging.INFO,format='%(asctime)s - %(levelname)s - %(message)s')
​
BASE_URL = 'https://ssr1.scrape.center'
TOTAL_PAGE = 10
​
#抓取某一页面的内容
def scrape_index(page):index_url = f'{BASE_URL}/page/{page}'return scrape_page(index_url)
​
#定义一个函数抓取网页的内容    
def scrape_page(url):logging.info("正在抓取 %s.....",url)#发起get请求try:response = requests.get(url)if response.status_code == 200:return response.textelse:logging.error("抓取 %s 时返回无效的状态码 %s",url,response.status_code)except requests.RequestException :#如果发生异常,就报错logging.error("抓取%s时发生异常",url,exc_info=True) #解析内容,并提取出详情页面的url
def parse_index(html):#用正则把连接给提取出来# print(type(html))pattern = re.compile('<a.*href="(.*?)".*?class="name">')items = re.findall(pattern,html)# print(items)if not items:return []for item in items:#把相对链接转为绝对链接           detail_url = urljoin(BASE_URL,item)# print(detail_url)logging.info('找到详情页面了,链接%s',detail_url)yield detail_url
​
def scrape_detail(url):return scrape_page(url)        def parse_detail(html):cover_pattern = re.compile('class="el-col.*?<img.*?src="(.*?)".*?class="cover">', re.S)# cover_pattern = re.compile(#     '<img.*?src="(.*?)".*?class="cover">', re.S)name_pattern = re.compile('<h2.*?>(.*?)</h2>')categories_pattern = re.compile('<button.*?category.*?<span>(.*?)</span>.*?</button>', re.S)published_at_pattern = re.compile('(\d{4}-\d{2}-\d{2})\s?上映')drama_pattern = re.compile('<div.*?drama.*?>.*?<p.*?>(.*?)</p>', re.S)score_pattern = re.compile('<p.*?score.*?>(.*?)</p>', re.S)
​cover = re.search(cover_pattern, html).group(1).strip() if re.search(cover_pattern, html) else Nonename = re.search(name_pattern, html).group(1).strip() if re.search(name_pattern, html) else Nonecategories = re.findall(categories_pattern, html) if re.findall(categories_pattern, html) else []published_at = re.search(published_at_pattern, html).group(1) if re.search(published_at_pattern, html) else Nonedrama = re.search(drama_pattern, html).group(1).strip() if re.search(drama_pattern, html) else Nonescore = float(re.search(score_pattern, html).group(1).strip()) if re.search(score_pattern, html) else None# print(type(cover))return {'cover': cover,'name': name,'categories': categories,'published_at': published_at,'drama': drama,'score': score}   
​
def save_data(data):collection.insert_one(data)logging.info("数据保存到mongodb成功!!!!")def main(page):# for page in range(1,TOTAL_PAGE+1):index_html = scrape_index(page)detail_urls = parse_index(index_html)for detail_url in detail_urls:detail_html = scrape_detail(detail_url)data = parse_detail(detail_html)logging.info('get detail data %s', data)save_data(data=data)logging.info('data saved successfully')
​
def run_main(page):main(page)            
​
if __name__ == '__main__':#获取CPU的核心数量num_process = multiprocessing.cpu_count()#创建进程池pool = multiprocessing.Pool(num_process)#要抓取的页面数量page_to_scrape = list(range(1,TOTAL_PAGE+1))#使用进程池运行pool.map(run_main,page_to_scrape)#关闭进程池pool.close()    

结果

2 xpath

2.1 xpath介绍

XPath是一种在XML或HTML文档中查找信息的强大语言,通过简洁的路径表达式和丰富的内置函数,能够精确定位并提取文档中的特定节点或内容。而HTML解析器的原理则在于将HTML文档转化为易于程序操作的DOM树形结构,通过词法分析和语法分析将文档分解为标记并组合成节点,最终构建出完整的DOM树,从而实现对HTML内容的解析和提取。在Python中,我们常结合如BeautifulSoup和lxml等库来使用XPath,这些库不仅内置了对XPath的支持,还提供了高效的解析和查询机制,使得处理HTML文档变得简单而高效。

2.2 xpath案例

案例1

#! /usr/bin/env python  # 导入html模块,用于处理HTML实体编码  
import html  # 导入lxml库的etree模块,用于解析HTML和XML  
from lxml import etree  # 定义一段HTML文本  
text = """  <div>  <ul>  <li class="item-0"><a href="link1.html">1-item</a></li>  <li class="item-1"><a href="link2.html">2-item</a></li>  <li class="item-0"><a href="link3.html">3-item</a></li>  <li class="item-1"><a href="link4.html">4-item</a></li>  <li class="item-1"><a href="link5.html">5-item</a></li>  <li class="item-0"><a href="link6.html">6-item</a></li>  </ul>  </div>  
"""  # 1. 使用etree.HTML方法将HTML文本解析成一个Element对象  
# 这个Element对象代表整个HTML文档结构,可以进一步查询和操作  
html = etree.HTML(text)  # 2. 使用etree.tostring()方法将Element对象再次转换为HTML文本  
# 这个方法返回的是字节串,所以需要使用decode('utf-8')来解码为字符串  
result = etree.tostring(html)  # 打印转换后的HTML文本  
print(result.decode('utf-8'))  # 打开一个名为'a.html'的文件,以写入模式打开  
with open('a.html', 'w') as file:  file.write(text)  
​​

结果

案例2

#!/usr/bin/env python  # 导入html模块,用于处理HTML实体编码,但在这个示例中并未实际使用  
import html  # 导入lxml库的etree模块,用于解析HTML和XML  
from lxml import etree  # 使用etree.parse方法和etree.HTMLParser()解析器来解析名为'a.html'的文件  
# etree.parse方法返回一个ElementTree对象,它代表整个HTML文档的结构  
html = etree.parse('a.html', etree.HTMLParser())  # 使用etree.tostring方法将ElementTree对象转换为字节串形式的HTML文本  
# 这个方法返回的是字节串,所以需要使用decode('utf-8')来解码为字符串  
result = etree.tostring(html, pretty_print=True)  # 添加pretty_print=True可以美化输出格式  # 打印转换后的HTML文本  
print(result.decode('utf-8'))  

结果

案例3

#!/usr/bin/env python  # 导入lxml库,虽然这里直接导入了lxml,但实际上只需要使用etree模块  
import lxml  # 从lxml库中导入etree模块,用于解析HTML和XML  
from lxml import etree  # 创建一个自定义的HTML解析器  
# remove_comments=True: 解析时移除HTML中的注释  
# recover=True: 尝试修复不规范的HTML代码  
# remove_blank_text=True: 移除空白文本节点  
parser = etree.HTMLParser(remove_comments=True, recover=True, remove_blank_text=True)  # 使用etree.parse方法和自定义的解析器来解析名为'a.html'的文件  
# 解析后返回一个ElementTree对象,它代表整个HTML文档的结构  
html = etree.parse('a.html', parser)  # 使用etree.tostring方法将ElementTree对象转换为字节串形式的HTML文本  
# 注意:这里应该添加pretty_print=True以美化输出格式  
result = etree.tostring(html, pretty_print=True)  # 打印转换后的HTML文本  
# 使用decode('utf-8')将字节串解码为字符串  
print(result.decode('utf-8'))  

案例4 使用xpath进行查询

#!/usr/bin/env python  # 导入html模块,虽然在这个脚本中并未使用到,可能是为了演示或其他部分使用的。  
import html  # 导入lxml库中的etree模块,用于解析HTML或XML文档。  
from lxml import etree  # 使用etree.parse函数和etree.HTMLParser()来解析名为'a.html'的文件。  
# 这里'a.html'应该是一个包含HTML内容的文件。  
html = etree.parse('a.html', etree.HTMLParser())  # 使用XPath查询语言,'//*'是一个XPath表达式,表示选取文档中所有的节点。  
# 无论节点的类型(比如元素、属性、文本等)或名称是什么,都会被选取。  
result = html.xpath('//*')  # 打印查询结果,result将是一个列表,包含文档中所有的节点。  
print(result)

结果

案例5

#!/usr/bin/env python 
​
import html
from lxml import etree
​
html = etree.parse('a.html',etree.HTMLParser())
result = html.xpath('//li')
print(result)

案例6

#!/usr/bin/env python 
​
import html
from lxml import etree
​
html = etree.parse('a.html',etree.HTMLParser())
#使用xpath语法选取所有位于li标签内的a标签
result = html.xpath('//li//a')
print(result)
​

案例7

#!/usr/bin/env python 
​
import html
from lxml import etree
​
html = etree.parse('a.html',etree.HTMLParser())
# 使用XPath查询语言查询文档中所有class属性值为'item-0'的li元素。
result = html.xpath("//li[@class='item-0']")
print(result)

案例8

#!/usr/bin/env python 
​
import html
from lxml import etree
​
html = etree.parse('a.html',etree.HTMLParser())
# XPath表达式'//a[@href="link6.html"]/parent::*/@class'的作用是:  
# 1. '//a[@href="link6.html"]':查找所有href属性值为"link6.html"的<a>标签。  
# 2. '/parent::*':选取这些<a>标签的父元素,'*'表示任意类型的父元素。  
# 3. '/@class':从选取的父元素中获取class属性的值。  
result = html.xpath('//a[@href="link6.html"]/parent::*/@class')
print(result)

案例9

#!/usr/bin/env python 
​
import html
from lxml import etree
​
html = etree.parse('a.html',etree.HTMLParser())
# XPath表达式"//li[@class='item-1']/a/text()"的作用是:  
# 1. "//li[@class='item-1']":查找所有class属性值为'item-1'的<li>标签。  
# 2. "/a":从这些<li>标签中选择直接子元素<a>。  
# 3. "/text()":从这些<a>标签中提取文本内容。
result = html.xpath("//li[@class='item-1']/a/text()")
print(result)

案例10

#!/usr/bin/env python 
​
import html
from lxml import etree
​
html = etree.parse('a.html',etree.HTMLParser())
result = html.xpath('//li/a/@href')
print(result)

案例11

#!/usr/bin/env python 
​
import html
from lxml import etree
​
text = '''<li class="li item-0"><a href="link1.html">1-item</a></li>
'''
​
html = etree.HTML(text)
result = html.xpath('//li[contains(@class,li)]/a/text()')
print(result)

案例12

#!/usr/bin/env python   # 导入html模块,虽然在这个脚本中并未使用到,但通常用于处理HTML字符串  
import html  # 导入lxml库中的etree模块,用于解析HTML字符串  
from lxml import etree  # 定义一个包含HTML内容的字符串  
text = '''  <li class="li item-0" name="wuyue"><a href="link1.html">1-item</a></li>  <li class="li item-0"><a href="link1.html">2-item</a></li>  
'''  # 使用etree.HTML()函数将字符串解析为HTML对象  
html = etree.HTML(text)  # 使用XPath查询语言来查找匹配的元素  
# XPath表达式'//li[contains(@class,li) and @name="wuyue"]/a/text()'的意思是:  
# 1. //li:选择所有<li>标签  
# 2. [contains(@class,li) and @name="wuyue"]:条件筛选,只选取class属性中包含"li"且name属性值为"wuyue"的<li>标签  
# 3. /a:选择这些<li>标签下的直接子元素<a>  
# 4. /text():提取这些<a>标签内的文本内容  
result = html.xpath('//li[contains(@class, "li") and @name="wuyue"]/a/text()')  # 打印查询结果,result是一个包含匹配到的<a>标签内文本内容的列表  
print(result)

案例13

#!/usr/bin/env python 
​
import html
from lxml import etree
​
html = etree.parse('a.html',etree.HTMLParser())
#只要第一个li节点里面的a元素的文本
result = html.xpath('//li[1]/a/text()')
# print(result)
#只要第最后一个li节点里面的a元素的文本
result = html.xpath('//li[last()]/a/text()')
# print(result)
#查询前两元素下的a标签的文本内容
result = html.xpath('//li[position()<3]/a/text()')
# print(result)
#查询倒数第三个呢
result = html.xpath('//li[last()-2]/a/text()')
print(result)

2.3 xpath综合性练习小项目

#!/usr/bin/env python   # 导入html模块,但在这个脚本中实际上并未使用到html模块的功能  
import html  # 从lxml库中导入etree模块,用于解析HTML字符串  
from lxml import etree  # 定义一个包含HTML内容的字符串  
html = '''  <html>  <body>  <div class="item" id="item1">item 1</div>  <div class="item" id="item2">item 2</div>  <div class="item" id="item3">item 3</div>  <div class="price">price:$50</div>  </body>  
</html>  
'''  # 使用etree.HTML()函数将字符串解析为HTML对象  
tree = etree.HTML(html)  # 此处注释了几个XPath查询示例,它们演示了如何使用XPath查询不同的内容  # 查询价格大于40的div内容(此查询无法正常工作,因为XPath无法直接对文本进行数值比较)  
# xpth_exp = '//div[contains(text(),"$") and number(substring-after(text(),"$")) > 40]/text()'  
# result = tree.xpath(xpth_exp)  
# print(result)  # 查询第二个div元素的内容  
# xpth_exp = '//div[position()=2]/text()'  
# result = tree.xpath(xpth_exp)  
# print(result)  # 查询第一个div元素的内容和最后一个div的内容  
# 使用'|'操作符可以同时查询多个XPath表达式,并将结果合并  
xpth_exp = '//div[position()=1]/text() | //div[position()=last()]/text()'  # 执行XPath查询  
result = tree.xpath(xpth_exp)  # 打印查询结果,result是一个包含匹配到的div元素内文本内容的列表  
print(result)

3 xpath项目:

3.1 需求:

1.抓图片and名称 2.抓到图片and名称后 3.保存到本地 4.从本地发送到远程文件服务器 (是一个中项目)

3.2 xpath项目1

对图片进行抓取

#!/usr/bin/env python
import requests
from lxml import etree
import logging
import random
from fake_useragent import UserAgent
import os
​
ua = UserAgent()
logging.basicConfig(level=logging.INFO,format='%(asctime)s - %(levelname)s : %(message)s')
​
url = 'https://www.4399dmw.com/search/dh-1-0-0-0-0-0-0/'
filepath = "D:\\code\\html\\http_proxies.txt"
​
def read_proxy_file(filepath):proxy_list = []try:with open(filepath,'r') as file:for line in file:if line:proxy_list.append(line.strip())except FileExistsError:logging.error("文件未找到")except Exception as e:logging.error(f"发生错误:{e}")   return proxy_list
​
def get_proxy():proxy = random.choice(read_proxy_file(filepath))return {"http":proxy}       
​
#下载图片并保存到本地
def save_image(img_url,img_name):headers = {"User-Agent":ua.random,"Cookie":"UM_distinctid=18a97aab8cf882-083b9875fb34fe-7f5d5476-1bcab9-18a97aab8d0d81; Hm_lvt_6bed68d13e86775334dd3a113f40a535=1695364979,1695696815,1695798201,1695816352; a_180_90_index=2; CNZZDATA3217746=cnzz_eid%3D924600740-1694761663-%26ntime%3D1695816461; Hm_lpvt_6bed68d13e86775334dd3a113f40a535=1695816461; a_200_90_index=4; a_980_90_index=1","Referer":"https://www.4399dmw.com/donghua/"}try:img = requests.get(url=img_url,headers=headers)iamge_name = img_name + ".jpg"with open(iamge_name,'ab') as f:f.write(img.content)except Exception as e:logging.error(e)    def mk_dir(path):#判断这个目录是否存在  #os.path.exists判断是否存在路径#os.path.join连接路径和文件名is_exist = os.path.exists(os.path.join('D:\\code\\html\image_dir',path))if not is_exist:#创建文件夹os.mkdir(os.path.join('D:\\code\\html\\image_dir',path))os.chdir(os.path.join('D:\\code\\html\\image_dir',path))return Trueelse:os.chdir(os.path.join('D:\\code\\html\\image_dir',path))return True  def next_page(html):next_url = html.xpath('//a[@class="next"]/@href')#拼接if next_url:next_url = "https://www.4399dmw.com/" + next_url[0]return next_urlelse:return False               
​
def spider_4399dmw(url):# 图片的xpath # result = html.xpath('//div[@class="lst"]/a[@class="u-card"]/img/@data-src')#title的xpath#html.xpath('//div[@class="lst"]/a[@class="u-card"]/div[@class="u-ct"]/p[@class="u-tt"]/text()')headers = {"User-Agent":ua.random,"Cookie":"UM_distinctid=18a97aab8cf882-083b9875fb34fe-7f5d5476-1bcab9-18a97aab8d0d81; Hm_lvt_6bed68d13e86775334dd3a113f40a535=1695364979,1695696815,1695798201,1695816352; a_180_90_index=2; CNZZDATA3217746=cnzz_eid%3D924600740-1694761663-%26ntime%3D1695816461; Hm_lpvt_6bed68d13e86775334dd3a113f40a535=1695816461; a_200_90_index=4; a_980_90_index=1","Referer":"https://www.4399dmw.com/donghua/"}logging.info("开始爬取: "+url)resp=requests.get(url=url,headers=headers,proxies=get_proxy())html_text = resp.content.decode('utf-8')html = etree.HTML(html_text)page = html.xpath('//span[@class="cur"]/text()')mk_dir("第"+page[0]+"页")#title的xpathtitle = html.xpath('//div[@class="lst"]/a[@class="u-card"]/div[@class="u-ct"]/p[@class="u-tt"]/text()')#image的xpathimage_src = html.xpath('//div[@class="lst"]/a[@class="u-card"]/img/@data-src')#讲链接前面拼上httpimage_url = []for i in image_src:image_url.append("http:"+i)#保存图片#1.请求图片的url#2.将请求的内容保存成图片for nurl,ntitle in zip(image_url,title):save_image(nurl,ntitle)if next_page(html=html):spider_4399dmw(next_page(html))else:logging.warning("已完成,无法找到下一页")    spider_4399dmw(url)    
# read_proxy_file(filepath)
# logging.warning(get_proxy())

3.3.xpath项目2

对图片进行抓取下载到本地以及服务器上

import os
import paramiko
​
# 远程服务器的连接信息
hostname = '192.168.135.131'  # 远程服务器的IP地址或主机名
port = 22  # SSH连接的端口号,默认为22
username = 'root'  # SSH连接的用户名
password = '123456'  # SSH连接的密码(或者可以使用密钥认证)
​
# 本地图片文件夹路径
local_image_folder = 'D:\\code\\html\\image_dir'  # 本地图片文件夹的路径
​
# 远程服务器上的目标路径,可以根据需要进行更改
remote_target_path = '/root/spider_img/'  # 远程服务器上存储图片的目标路径
​
def upload_images_recursively(local_folder, remote_folder, ssh_client):# 打开SFTP连接with ssh_client.open_sftp() as sftp:# 递归遍历本地文件夹及其子文件夹for root, _, files in os.walk(local_folder):for filename in files:# 检查文件是否以指定图片文件扩展名之一结尾if filename.endswith(('.jpg', '.jpeg', '.png', '.gif', '.bmp')):local_filepath = os.path.join(root, filename)  # 获取本地文件的完整路径# 构建远程服务器上的文件路径,使用相对路径并连接到远程基础路径relative_path = os.path.relpath(local_filepath, local_folder)remote_filepath = os.path.join(remote_folder, relative_path)# 输出上传信息,包括本地文件路径和远程文件路径print(f'Uploaded: {local_filepath} to {hostname}:{remote_filepath}')# 创建远程文件夹以确保上传路径存在remote_folder = os.path.dirname(remote_filepath)sftp.mkdir(remote_folder)# 上传文件到远程服务器sftp.put(local_filepath, remote_filepath)
​
try:# 建立SSH连接ssh_client = paramiko.SSHClient()ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())  # 设置自动添加远程主机密钥策略ssh_client.connect(hostname, port, username, password)  # 连接到远程服务器
​# 调用递归函数上传所有图片文件upload_images_recursively(local_image_folder, remote_target_path, ssh_client)
​print(f'All images successfully uploaded to {hostname}:{remote_target_path}')
​
except Exception as e:print(f'Error: {e}')  # 捕获并打印任何异常信息
​
finally:ssh_client.close()  # 最终关闭SSH连接               

结果


http://www.ppmy.cn/embedded/14398.html

相关文章

ABAP MR21: BAPI_MATVAL_PRICE_CHANGE

文章目录 前言 一、报错问题 二、代码如下 总结 前言 MR21 发布物料价格&#xff0c;BAPI_MATVAL_PRICE_CHANGE 一、报错问题 BAPI报错&#xff1a;估价XXX 对于物料XXXXXXXXXXXXX没有被维护 解决办法&#xff1a;CKML_PRICE_SEND没有对应的评估范围数据&#xff0c;SM30&a…

递归、搜索与回溯算法:综合练习

例题一 解法&#xff1a; 算法思路&#xff1a; ⾸先&#xff0c;我们在第⼀⾏放置第⼀个皇后&#xff0c;然后遍历棋盘的第⼆⾏&#xff0c;在可⾏的位置放置第⼆个皇后&#xff0c;然后再遍历第三⾏&#xff0c;在可⾏的位置放置第三个皇后&#xff0c;以此类推&#xff0c…

【Stable Diffusion系列】(一):AI绘画本地部署教程

目录 一、总览 二、本地部署 1、安装cuda 2、安装python 3、安装git 4、方法一 1&#xff09;获取安装包 2&#xff09;update 3&#xff09;run 5、方法二 1&#xff09;git clone 2&#xff09;双击webui-user.bat 3&#xff09;更新 6、设置启动参数 7、…

ik分词器是什么,有那些配置? ik_smart和ik_max_word的两个分词算法有何区别?

1、ik分词器是什么&#xff0c;有那些配置&#xff1f; 1、ik分词器是什么&#xff1f; IK分词器是一种基于正向匹配的分词算法&#xff0c;它是中文自然语言处理中的一个基本环节。在搜索时&#xff0c;IK分词器会把用户的信息以及数据库或索引库中的数据进行分词&#xff0…

【Linux高性能服务器编程】两种高性能并发模式剖析——领导者/追随者模式

hello &#xff01;大家好呀&#xff01; 欢迎大家来到我的Linux高性能服务器编程系列之两种高性能并发模式介绍&#xff0c;在这篇文章中&#xff0c;你将会学习到高效的创建自己的高性能服务器&#xff0c;并且我会给出源码进行剖析&#xff0c;以及手绘UML图来帮助大家来理解…

背包问题汇总

本文涉及知识点 动态规划汇总 状态机dp 01背包 有n件物品&#xff0c;体积分别是v[i]&#xff0c;价值分别是w[i]&#xff0c;有个包的容积是bv。如何选择物品使得&#xff0c;在总体积不超过vb的前提下&#xff0c;让总价值最大。 动态规划的状态表示 dp[i][j] 表示处理完…

数据仓库与数据挖掘(实验一2024.4.24)

实验准备&#xff1a; 1.下载conda 2.配置环境C:\ProgramData\miniconda3\Scripts 3.创建文件夹panda进入虚拟环境qq 激活虚拟环境&#xff1a;activate qq 启动jupyter lab&#xff08;python语言环境编译&#xff09;&#xff1a;jupyter lab 4.panda下载 &#xff08;…

MT3027 red and blue

样例1&#xff1a; 输入&#xff1a; 8 4 1 2 5 2 BRBR 2 1 1 BB 5 3 1 4 2 5 RBRRB 5 3 1 3 1 3 RBRRB 5 5 1 5 1 5 RBRRB 4 2 2 2 2 BRBR 2 1 -2 BR 4 -2 -1 4 0 RRRR 输出&#xff1a; YES NO YES YES NO YES YES YES 思路&#xff1a;贪心。 贪心策略&#xff1a;设B有…

rabbitmq报错

文章目录 Applying plugin configuration to rabbitDESKTOP-C3HQ9BK... Plugin configuration unchanged.rabbitmq-service.bat start和rabbitmq-plugins enable rabbitmq_management这两个命令在RabbitMQ中具有不同的功能和用途。以下是两者之间的主要区别&#xff1a; Applyi…

密码学 | 承诺:绑定性 + 隐藏性

&#x1f951;原文&#xff1a;承诺方案&#xff08;Commitment&#xff09;学习笔记 &#x1f951;写在前面&#xff1a; 本文属搬运博客&#xff0c;自己留存学习。本文只会讲承诺的两个安全属性&#xff0c;不会再讲解承诺的定义。 正文 承诺方案需要满足两个安全属性&…

python-自动化篇-终极工具-用GUI自动控制键盘和鼠标-pyautogui-键盘

文章目录 键盘键盘——记忆宫殿入门——通过键盘发送一个字符串——typewrite()常规——键名——typewrite()常规——按下键盘——keyDown()常规——释放键盘——keyUp()升级——热键组合——hotkey() 键盘 pyautogui也有一些函数向计算机发送虚拟按键&#xff0c;让你能够填充…

IPv4 NAT(含Cisco配置)

IPv4 NAT&#xff08;含Cisco配置&#xff09; IPv4私有空间地址 类RFC 1918 内部地址范围前缀A10.0.0.0 - 10.255.255.25510.0.0.0/8B172.16.0.0 - 172.31.255.255172.16.0.0/12C192.168.0.0 - 192.168.255.255192.168.0.0/16 这些私有地址可在企业或站点内使用&#xff0c…

生成对抗网络(GAN)

一、介绍 生成对抗网络&#xff08;Generative Adversarial Network&#xff0c;GAN&#xff09;是一种机器学习模型&#xff0c;由生成器和判别器两部分组成&#xff0c;用于生成逼真的图像、文本或音频等内容。GAN的作用主要包括以下几个方面&#xff1a; 图像生成&#xff…

云原生Kubernetes: K8S 1.29版本 部署GitLab

目录 一、实验 1.环境 2.搭建NFS 3.K8S 1.29版本 部署Redis 4.K8S 1.29版本 部署Postgresql 5.K8S 1.29版本 部署GitLab 6.K8S 部署istio微服务 7.K8S 部署ingress应用路由 二、问题 1.K8S部署gitlab报错 2.gitlab创建失败 3.生成网关资源报错 4.安装istio 报错 …

The_Maya_Society

突然发现自己做了一些逆向题都没有写笔记 今天&#xff0c;发现这道题有意思 1.解压文件 三个文件The Maya Society.html&#xff0c;maim.cc,maya.png 当时我看到这个题的时候&#xff0c;我以为是不是会是js逆向 看来是我蠢了 这三个文件&#xff0c;main.css和maya.png这两…

中医药性笔记

目录 当归黄芪党参白术甘草茯苓半夏陈皮升麻柴胡陈皮 当归 补血。 当归&#xff0c;腾讯医典 黄芪 土金之药。 补中气的同时补肺气。益卫固表、利水消肿、 腾讯医典黄芪 党参 土金之药。健脾益肺&#xff0c;生津养血。 党参补气之力弱于人参、用于脾肺气虚的轻症。…

深入探究音视频开源库WebRTC中NetEQ音频抗网络延时与抗丢包的实现机制

目录 1、引言 2、WebRTC简介 3、什么是NetEQ&#xff1f; 4、NetEQ技术详解 4.1、NetEQ概述 4.2、抖动消除技术 4.3、丢包补偿技术 4.4、NetEQ概要设计 4.5、NetEQ的命令机制 4.6、NetEQ的播放机制 4.7、MCU的控制机制 4.8、DSP的算法处理 4.9、DSP算法的模拟测试…

全程免费的ssl证书申请——七步实现网站https

全程免费的ssl证书申请步骤如下&#xff1a; 1 准备工作 首先确定好需要的证书类型&#xff0c;如单域名证书、通配符证书和多域名证书&#xff0c;准备好需要安装证书的域名。 2 选择CA 选择提供免费证书的服务商——JoySSL&#xff0c;并访问其官方网站&#xff0c;创建一…

修改Docker容器内文件的三种方式

说明&#xff1a;本文介绍修改Docker容器内文件的三种方式 方式一&#xff1a;直接修改 敲下面的命令&#xff0c;进入Docker容器&#xff0c;如mysql docker exec -it mysql /bin/bash修改mysql的配置文件&#xff0c;/etc/my.cnf vim /etc/my.cnf如下&#xff0c;如果vim…

华为机试:广场舞在编排舞蹈时,需要变换队形来体现团队协调性,假定参与者为字符串 str,调整的倍数为n,需要对从队伍的开头 n 个人进行位置互换

队伍变换 | 时间限制&#xff1a;1秒 | 内存限制&#xff1a;262144K 广场舞在编排舞蹈时&#xff0c;需要变换队形来体现团队协调性&#xff0c;假定参与者为字符串 str&#xff0c;调整的倍数为n&#xff0c;需要对从队伍的开头 n 个人进行位置互换条件&#xff1a;1、人数少…