用Python实现办公自动化(自动化处理PDF文件)

自动化处理 PDF 文件

目录

自动化处理 PDF 文件

谷歌浏览器 Chrome与浏览器驱动ChromeDriver安装

(一)批量下载 PDF 文件

1.使用Selenium模块爬取多页内容

2.使用Selenium模块下载PDF文件

3.使用urllib模块来进行网页的下载和保存 

4.使用urllib&Selenium模块判断下载和保存

(二)批量合并 PDF 文件

(三)批量拆分 PDF 文件

(四)批量加密 PDF 文件

(五)批量为 PDF 文件添加水印

1.自定义函数创建水印文件

2.自定义函数添加水印

3.使用循环为每个PDF文件添加水印


Chrome:浏览器

Selenium:是一个用于浏览器自动化测试的工具集,是一个完整的自动化测试框架

WebDriver:是Selenium的一个关键组件,用于控制和操作浏览器

ChromeDriver:是Webdriver的一个实现,专门用于控制和操作Google Chrome浏览器

谷歌浏览器 Chrome与浏览器驱动ChromeDriver安装

Chrome 73 版本以后, ChromeDriver 和 Chrome 版本是一对一,版本号是一样的。

查看网址:Chrome for Testing availability

a1e28477038e47f695d2dbb386991b56.png

39ec7a20717549bab53f4d3793c9949b.png

“安装路径展示”

5705e144bf984a6a9933c8913b60f5a4.png

6ccb967539b640698537999d8202ace1.png

(一)批量下载 PDF 文件

1.使用Selenium模块爬取多页内容

 Eg:以下载巨潮资讯网的上市公司公告PDF文件为例。

“获取公告总数”

8557a3dc07cf420a8dc696dd939a75a9.png

d3f6b665469942a99ba028711c0a5cda.png

“获取[下一页]单击按钮”

7f7e9eeaf6d74272b1f0c71753b4ff3f.png

“获取公告标题和网址”

3fa681ece5584a1490c9e9efd6e8cabf.png

d1b47c132bc142fa8ba08ef4c5d16e41.png

95e7b97459814d85a94d1949e844f3a8.png

"python程序完整代码"

在Selenium 4之后的版本中,由于引入了新的查找策略,原来的基于by_*方法的查找方式已经被弃用,需要使用新的方法。“find_element”配合By类来进行元素定位。

# 利用Selenium模块模拟鼠标单击"下一页"按钮
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
import re# 1.获取公告总数和单页次数
browser = webdriver.Chrome()
url = "http://www.cninfo.com.cn/new/fulltextSearch?notautosubmit=&keyWord=理财"
browser.get(url)
time.sleep(5)
data = browser.page_source
p_count = '<span class="total-box" style="">约 (.*?) 条'
count = re.findall(p_count, data)[0]
pages = int(int(count) / 10)
# 2.用Selenium模块模拟单击”下一页“按钮
datas = []
datas.append(data)
for i in range(1):browser.find_element(By.XPATH,'//*[@id="fulltext-search"]/div[2]/div/div/div[3]/div[3]/div[2]/div/button[2]',).click()time.sleep(3)data = browser.page_sourcedatas.append(data)time.sleep(3)
# 3.将列表转换为字符串
alldata = "".join(datas)
browser.quit()
# 4.通过正则表达式提取公告标题和网址
p_title = '<span title="" class="r-title">(.*?)</a>'
p_href = '<a target="_blank" href="(.*?)".*?<span title='
# 5.将提取公告标题和网址的正则表达式应用到汇总了所有页面源代码的字符串变量alldata中
title = re.findall(p_title, alldata)
href = re.findall(p_href, alldata)
# 6.对爬取到的数据进行清洗工作
for i in range(len(title)):title[i] = re.sub("<.*?>", "", title[i])href[i] = "http://www.cninfo.com.cn" + href[i]href[i] = re.sub("amp;", "", href[i])print(str(i + 1) + "." + title[i])print(href[i])

"程序运行结果展示"

d3947b69d2954a2bb3d9235119a0005d.png

2.使用Selenium模块下载PDF文件

在搜索”理财“的结果网址:

http://www.cninfo.com.cn/new/fulltextSearch?notautosubmit=&keyWord=理财

中,单击任意一个公告标题,打开公告PDF文件的下载页面,网址变更为:

http://www.cninfo.com.cn/new/disclosure/detail?orgId=9900014267&announcementId=1219372722&announcementTime=2024-03-22

自动下载页面PDF文件,使用Selenium模块模拟单击页面中的”公告下载

2d7016b2c85a4f328a77ce14f4fa52fb.png

查看源码,右键获取“公告下载”按钮的XPath内容:

//*[@id="noticeDetail"]/div/div[1]/div[3]/div[1]/button

"

文件存在危险,因此 Chrome 已将其拦截"

daf7286f9c8248aa89350d22298c4740.png

"python程序完整代码【单公告】"

# 利用Selenium模块模拟鼠标单击"下一页"按钮
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
import time# 设置Chrome驱动本地目录
chromedriver_path = "C:\\Program Files\\Google\\Chrome\\Application\\chromedriver-win64\\chromedriver.exe"
# 创建ChromeOptions对象并设置下载目录
chrome_options = Options()
# 启用无头模式,隐藏 Chrome 窗口以在后台执行。
chrome_options.add_argument("--headless")
# 禁用 GPU 加速。
chrome_options.add_argument("--disable-gpu")
# 这两个参数通常用于 Docker 容器中运行测试。
# chrome_options.add_argument("--no-sandbox")   # 运行在没有沙箱的环境中
# chrome_options.add_argument("--disable-dev-shm-usage")    # 禁用/dev/shm目录用于临时文件存储
# 隐身模式(无痕模式)
chrome_options.add_argument("--incognito")
# 设置浏览器的下载参数
chrome_options.add_experimental_option("prefs",{"download.default_directory": r"D:\pppp\第4章\批量下载的PDF文件\公告",  # 指定文件下载路径。"download.prompt_for_download": False,  # 禁用下载提示对话框(直接开始下载)。"download.directory_upgrade": True,  # 启用目录升级,以确保文件下载到指定的文件夹。"download_restrictions": 0,  # 禁用下载保护,允许下载所有类型的内容。"safebrowsing_for_trusted_sources_enabled": False,  # 禁用针对受信任来源的安全浏览。"safebrowsing.enabled": False,  # 禁用安全浏览,允许下载被 Chrome 识别为不安全的文件。},
)
# 说明: Selenium从4.10以后不再支持executeable_path参数了,需要使用service对象参数代替
browser = webdriver.Chrome(service=Service(chromedriver_path), options=chrome_options)
browser.get("http://www.cninfo.com.cn/new/disclosure/detail?orgId=9900014267&announcementId=1219372722&announcementTime=2024-03-22"
)
try:# 找到下载链接并点击下载文件browser.find_element(By.XPATH, '//*[@id="noticeDetail"]/div/div[1]/div[3]/div[1]/button').click()time.sleep(30)# 退出模拟浏览器。quit 必须要有,否则停留后台,需要在任务管理器中手动关闭browser.quit()print("下载完毕")
except:print("没有PDF文件")

"python程序完整代码【批量】"

# 利用Selenium模块模拟鼠标单击"下一页"按钮
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
import time
import re# 1.获取公告总数和单页次数
browser = webdriver.Chrome()
url = "http://www.cninfo.com.cn/new/fulltextSearch?notautosubmit=&keyWord=理财"
browser.get(url)
time.sleep(5)
data = browser.page_source
p_count = '<span class="total-box" style="">约 (.*?) 条'
count = re.findall(p_count, data)[0]
pages = int(int(count) / 10)
# 2.用Selenium模块模拟单击”下一页“按钮
datas = []
datas.append(data)
for i in range(1):browser.find_element(By.XPATH,'//*[@id="fulltext-search"]/div[2]/div/div/div[3]/div[3]/div[2]/div/button[2]',).click()time.sleep(3)data = browser.page_sourcedatas.append(data)time.sleep(3)
# 3.将列表转换为字符串
alldata = "".join(datas)
browser.quit()
# 4.通过正则表达式提取公告标题和网址
p_title = '<span title="" class="r-title">(.*?)</a>'
p_href = '<a target="_blank" href="(.*?)".*?<span title='
# 5.将提取公告标题和网址的正则表达式应用到汇总了所有页面源代码的字符串变量alldata中
title = re.findall(p_title, alldata)
href = re.findall(p_href, alldata)
# 6.对爬取到的数据进行清洗工作
for i in range(len(title)):title[i] = re.sub("<.*?>", "", title[i])href[i] = "http://www.cninfo.com.cn" + href[i]href[i] = re.sub("amp;", "", href[i])print(str(i + 1) + "." + title[i])print(href[i])# 7.批量下载下载PDF文件
def driver_download():# 设置Chrome驱动本地目录chromedriver_path = "C:\\Program Files\\Google\\Chrome\\Application\\chromedriver-win64\\chromedriver.exe"# 创建ChromeOptions对象并设置下载目录chrome_options = Options()# 启用无头模式,隐藏 Chrome 窗口以在后台执行。chrome_options.add_argument("--headless")# 禁用 GPU 加速。chrome_options.add_argument("--disable-gpu")# 隐身模式(无痕模式)chrome_options.add_argument("--incognito")# 设置浏览器的下载参数chrome_options.add_experimental_option("prefs",{"download.default_directory": r"D:\pppp\第4章\批量下载的PDF文件\公告",  # 指定文件下载路径。"download.prompt_for_download": False,  # 禁用下载提示对话框(直接开始下载)。"download.directory_upgrade": True,  # 启用目录升级,以确保文件下载到指定的文件夹。"download_restrictions": 0,  # 禁用下载保护,允许下载所有类型的内容。"safebrowsing_for_trusted_sources_enabled": False,  # 禁用针对受信任来源的安全浏览。"safebrowsing.enabled": False,  # 禁用安全浏览,允许下载被 Chrome 识别为不安全的文件。},)# 说明: Selenium从4.10以后不再支持executeable_path参数了,需要使用service对象参数代替browser = webdriver.Chrome(service=Service(chromedriver_path), options=chrome_options)return browserfor i in range(len(href)):browser = driver_download()browser.get(href[i])try:# 找到下载链接并点击下载文件browser.find_element(By.XPATH, '//*[@id="noticeDetail"]/div/div[1]/div[3]/div[1]/button').click()time.sleep(30)# 退出模拟浏览器。quit 必须要有,否则停留后台,需要在任务管理器中手动关闭browser.quit()print("下载完毕")except:print("没有PDF文件")

3.使用urllib模块来进行网页的下载和保存 

案例:网址:

沅陵县国民经济和社会发展第十四个五年规划和二〇三五年远景目标纲要 - 沅陵县人民政府

e203827d882f4158b176fb4b02e894b3.png

“Python程序完整代码”

import os.pathfrom selenium import webdriver
from selenium.webdriver.common.by import By
from urllib.request import urlretrieve
from selenium.webdriver.chrome.service import Service
import time# 设置Chrome驱动本地目录
chromedriver_path = "C:\\Program Files\\Google\\Chrome\\Application\\chromedriver-win64\\chromedriver.exe"
# 说明: Selenium从4.10以后不再支持executeable_path参数了,需要使用service对象参数代替
browser = webdriver.Chrome(service=Service(chromedriver_path))
url = "http://www.yuanling.gov.cn/yuanling/c132955/202112/ac08a665e96644ad8e6e31215f518c77.shtml"
browser.get(url)
time.sleep(2)
# XPath选择所有图片
img_elements = browser.find_elements(By.XPATH, "/html/body/div[2]/div[2]/div[2]/div/img"
)
# 循环遍历图片元素并下载图片
for img in img_elements:src = img.get_attribute("src")print(src.title())# src为要下载文件的URL地址;filename参数用于指定下载后文件的保存路径和文件名。urlretrieve(src, filename=os.path.join("D:\\pppp\\test\\", src.split("/")[-1]))
# 关闭WebDriver
browser.quit()

"查看下载图片"

4542ab2c98e64835b4d70d15effa6e42.png

4.使用urllib&Selenium模块判断下载和保存

如果图片是Base64编码的,则会进行解码后保存;否则,会直接根据图片的源地址进行保存。

“Python程序完整代码”

import os.pathfrom selenium import webdriver
from selenium.webdriver.common.by import By
from urllib.request import urlretrieve
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
import time# 设置Chrome驱动本地目录
chromedriver_path = "C:\\Program Files\\Google\\Chrome\\Application\\chromedriver-win64\\chromedriver.exe"
# 创建ChromeOptions对象并设置下载目录
chrome_options = Options()
# 启用无头模式,隐藏 Chrome 窗口以在后台执行。
chrome_options.add_argument("--headless")
# 禁用 GPU 加速。
chrome_options.add_argument("--disable-gpu")
# 隐身模式(无痕模式)
chrome_options.add_argument("--incognito")
# 设置浏览器的下载参数
chrome_options.add_experimental_option("prefs",{"download.default_directory": r"D:\pppp\test2",  # 指定文件下载路径。"download.prompt_for_download": False,  # 禁用下载提示对话框(直接开始下载)。"download.directory_upgrade": True,  # 启用目录升级,以确保文件下载到指定的文件夹。"download_restrictions": 0,  # 禁用下载保护,允许下载所有类型的内容。"safebrowsing_for_trusted_sources_enabled": False,  # 禁用针对受信任来源的安全浏览。"safebrowsing.enabled": False,  # 禁用安全浏览,允许下载被 Chrome 识别为不安全的文件。},
)
# 说明: Selenium从4.10以后不再支持executeable_path参数了,需要使用service对象参数代替
browser = webdriver.Chrome(service=Service(chromedriver_path), options=chrome_options)
url = "http://www.yuanling.gov.cn/yuanling/c132955/202112/ac08a665e96644ad8e6e31215f518c77.shtml"
browser.get(url)
time.sleep(2)
# XPath选择所有图片
img_elements = browser.find_elements(By.XPATH, "/html/body/div[2]/div[2]/div[2]/div/img"
)
# 循环遍历图片元素并下载图片
counter = 1
for img in img_elements:try:# 获取图片的源地址src = img.get_attribute("src")# 如果图片是Base64编码的,则需要解码并保存if src.startswith("data:image"):import base64data = src.split(",")[1]with open(f"image_{counter}.png", "wb") as file:file.write(base64.b64decode(data))else:# 直接通过源地址保存图片import urllib.requesturllib.request.urlretrieve(src, filename=os.path.join("D:\\pppp\\test2\\", f"image_{counter}.png"))counter += 1except Exception as e:print(f"Error saving image: {e}")# 关闭浏览器
browser.quit()

“下载保存结果展示”

95c1ff3dfb144f9ead864a970794a306.png

(二)批量合并 PDF 文件

“合并前PDF文件”

2af9264942e44ec99b33e209e77c60a8.png

“Python完整程序代码”

# 导入pathlib模块中的Path()函数,用于完成路径相关操作
from pathlib import Path# 使用Python第三方模块PyPDF2来操控PDF文件.PdfReader类用于读取PDF文件,PdfMerger类用于合并PDF文件
from PyPDF2 import PdfReader, PdfMerger# 1.设置相关文件夹路径
src_folder = Path("D:\\pppp\\第4章\\批量下载的PDF文件\\公告\\")
des_file = Path("D:\\pppp\\第4章\\批量下载的PDF文件\\公告\\合并后的公告文件.PDF")
if not des_file.parent.exists():des_file.parent.mkdir(parents=True)
file_list = list(src_folder.glob("*.PDF"))
# 2.逐个读取PDF文件并进行合并
merger = PdfMerger()
outputPages = 0
for pdf in file_list:inputfile = PdfReader(str(pdf))merger.append(inputfile)pageCount = len(inputfile.pages)print(f"{pdf.name} 页数:{pageCount}")outputPages += pageCount
# 3.将合并后的PDF文件写入指定的路径中
merger.write(str(des_file))
# 4.关闭PdfFileMerger对象,释放占用的系统资源
merger.close()
print(f"\n合并后的总页数:{outputPages}")

“合并后的PDF文件”

080ebb0331224cf3a35f9e70aff21abc.png

63ac5f05281b4620baa95d34f4cd629d.png

(三)批量拆分 PDF 文件

“Python程序完整代码”

# 采用按照固定页数进行拆分的方式
# 导入pathlib模块中的Path()函数,用于完成路径相关操作
from pathlib import Path# 使用Python第三方模块PyPDF2来操控PDF文件.PdfReader类用于读取PDF文件,PdfWriter类用于输出PDF文件
from PyPDF2 import PdfReader, PdfWriter# 1.0 设置相关文件夹路径
src_folder = Path("D:\\pppp\\第4章\\批量下载的PDF文件\\公告\\")
file_list = list(src_folder.glob("*.PDF"))
# 2.0 逐个读取PDF文件并获取页数,计算拆分后的份数,每份的页数设置为5
step = 5
for pdf in file_list:inputfile = PdfReader(str(pdf))pages = len(inputfile.pages)if pages <= step:print(f"【{pdf.name}】页数为{pages},小于等于每份的页数{step},不做拆分")continueparts = pages // step + 1# 3.0 根据份数进行循环,计算每一份的开始页码和结束页码for pt in range(parts):start = step * ptif pt != (parts - 1):end = start + step - 1else:end = pages - 1# 4.0 拆分PDF文件,调用路径对象的stem属性获取文件的主名outputfile = PdfWriter()for pn in range(start, end + 1):outputfile.add_page(inputfile.pages[pn])pt_name = f"{pdf.stem}_第{pt+1}部分.pdf"pt_file = src_folder / pt_namewith open(pt_file, "wb") as f_out:outputfile.write(f_out)# 5.0 输出拆分完毕的信息print(f"【{pdf.name}】页数为{pages},拆分为{parts}部分")

“批量拆分后的信息”

7090a8cabddf40ababfe49a5d6c174de.png

9a3e9ad99bb44a5c9999ca61f99e3573.png

(四)批量加密 PDF 文件

为PDF文件设置打开密码来防止泄密。

“Python完整代码”

"""
为PDF文件设置打开密码来防止泄密
"""
# 导入pathlib模块中的Path()函数,用于完成路径相关操作
from pathlib import Path# 使用Python第三方模块PyPDF2来操控PDF文件.PdfReader类用于读取PDF文件,PdfWriter类用于输出PDF文件
from PyPDF2 import PdfReader, PdfWriter# 1.0 设置相关文件夹路径
src_folder = Path("D:\\pppp\\第4章\\批量下载的PDF文件\\公告\\")
file_list = list(src_folder.glob("*.PDF"))
# 2.0 逐个读取PDF文件
for pdf in file_list:inputfile = PdfReader(str(pdf))outputfile = PdfWriter()pageCount = len(inputfile.pages)for page in range(pageCount):outputfile.add_page(inputfile.pages[page])# 3.0 将PDF文件的打开密码设置为“123456”outputfile.encrypt("123456")# 4.0 设置加密后的PDF文件名des_name = f"{pdf.stem}_secret.pdf"des_file = src_folder / des_namewith open(des_file, "wb") as f_out:outputfile.write(f_out)

“查看加密文件”

50a439690aff4df6a3748276c9aa420f.png

de015a0a70e1442a96fd1dceead3e7db.png

(五)批量为 PDF 文件添加水印

为了防止PDF文件内容被他人随意盗用,可以为PDF文件添加水印。

1.自定义函数创建水印文件

要批量添加水印,需准备一个PDF格式的水印文件。

“Python程序代码”

"""
为PDF文件添加水印,防止他人随意盗用
"""
# 导入pathlib模块中的Path()函数,用于完成路径相关操作
from pathlib import Path# 使用Python第三方模块PyPDF2来操控PDF文件.PdfReader类用于读取PDF文件,PdfWriter类用于输出PDF文件
from PyPDF2 import PdfReader, PdfWriter# 使用Python第三方模块reportlab来制作水印文件
from reportlab.lib.units import cm
from reportlab.pdfgen import canvas
import reportlab.pdfbase.ttfontsdef create_watermark(content):"""自定义函数:创建水印文件,并对水印文字的字体,字号等格式进行设置"""# 设置水印文件的文件名file_name = "水印.PDF"# 设置水印文件的页面大小,默认大小是21cm×29.7cma = canvas.Canvas(file_name, pagesize=(30 * cm, 30 * cm))# 设置页面的坐标原点,默认(0,0)左下角a.translate(5 * cm, 0 * cm)# 注册水印文字要使用的字体,注意:如果水印文字为中文,需使用显示中文的字体,否则水印文字会显示为乱码reportlab.pdfbase.pdfmetrics.registerFont(reportlab.pdfbase.ttfonts.TTFont("阿里巴巴普惠体", "D:\\pppp\\第4章\\Alibaba-PuHuiTi-Regular.ttf"))# 设置水印文字的字体a.setFont("阿里巴巴普惠体", 25)# 设置水印文字的旋转角度a.rotate(30)# 设置水印文字的填充颜色a.setFillColorRGB(0, 0, 0)# 设置水印文字的透明度a.setFillAlpha(0.2)# 在页面绘制6行6列的水印文字for i in range(0, 30, 5):for j in range(0, 30, 5):# drawString()的前两个参数为文字的坐标,第三个参数为文字的内容a.drawString(i * cm, j * cm, content)a.save()return file_name

2.自定义函数添加水印

为每一页PDF都添加水印。

“Python程序代码”

def add_watermark(pdf_file_in, pdf_file_mark, pdf_file_out):"""自定义函数:为每一页PDF文件添加水印"""outputfile = PdfWriter()inputfile = PdfReader(pdf_file_in)pageCont = len(inputfile.pages)markfile = PdfReader(pdf_file_mark)# 读取PDF文件的每一页,与水印文件融合后添加到PdfWriter对象中for i in range(pageCont):page = inputfile.pages[i]page.merge_page(markfile.pages[0])outputfile.add_page(page)with open(pdf_file_out, "wb") as f_out:outputfile.write(f_out)

3.使用循环为每个PDF文件添加水印

“Python程序代码”

# 1.0 设置相关文件夹路径
src_folder = Path("D:\\pppp\\第4章\\批量下载的PDF文件\\公告\\")
des_folder = Path("D:\\pppp\\第4章\\批量下载的PDF文件\\公告添加水印后\\")
if not des_folder.exists():des_folder.mkdir(parents=True)
file_list = list(src_folder.glob("*.PDF"))
# 2.0依次为每个PDF文件添加水印
for pdf in file_list:pdf_file_in = str(pdf)# 设置水印的文本内容pdf_file_mark = create_watermark("巨潮资讯网")pdf_file_out = str(des_folder / pdf.name)add_watermark(pdf_file_in, pdf_file_mark, pdf_file_out)

“水印文件查看”

042f7787749744fbb39e0338ecf1a1d9.png

c092638d201942b19b47532fac5c8e1b.png

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

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

相关文章

关于OcenaBase v4.2中,分区转移和负载均衡的技术解读

OceanBase​​​​​​​​​​​​​​作为一款原生分布式数据库&#xff0c;其核心的技术特性之一是高可扩展性&#xff0c;其具体表现在两个方面&#xff1a; 首先&#xff0c;是灵活的扩缩容能力&#xff0c;包括垂直扩缩容和水平扩缩容&#xff1a; 垂直扩缩容&#xff…

神经网络汇聚层

文章目录 最大汇聚层平均汇聚层自适应平均池化层 最大汇聚层 汇聚窗口从输入张量的左上角开始&#xff0c;从左往右、从上往下的在输入张量内滑动。在汇聚窗口到达的每个位置&#xff0c;它计算该窗口中输入子张量的最大值或平均值。计算最大值或平均值是取决于使用了最大汇聚…

RISC-V/ARM mcu OpenOCD 调试架构解析

Risc-v/ARM mcu OpenOCD 调试架构解析 最近有使用到risc-v的单片机&#xff0c;所以了解了下risc-v单片机的编译与调试环境的搭建&#xff0c;面试时问到risc-v的调试可参看以下内容。 risc-v根据官方的推荐&#xff0c;调试器服务是选择OpenOCD&#xff0c;DopenOCD(开放片上…

Python反爬案例——验证码的识别

验证码的识别 使用打码平台识别验证码 利用打码平台可以轻松识别各种各样的验证码&#xff0c;图形验证码、滑动验证码、点选验证码和逻辑推理验证码。打码平台提供了一系列API&#xff0c;只需要向API上传验证码图片&#xff0c;它便会返回对应的识别结果。 使用超级鹰平台…

深入理解指针1:指针变量、指针运算、野指针、const修饰指针

生活中我们把门牌号也叫地址&#xff0c;在计算机中我们把内存单元的编号也称为地址。C语⾔中给地址起 了新的名字叫&#xff1a;指针。 所以我们可以理解为&#xff1a;内存单元的编号地址指针 1、指针变量 我们知道的是&#xff1a;数组名是数组首元素的地址。也就是说&…

中断服务程序模板

通常定时器初始化过程如下: ①对 TMOD赋值,以确定TO和T1的工作方式。 ②计算初值,并将初值写入THO、TLO或TH1、TL1。 ③中断方式时&#xff0c;则对IE赋值&#xff0c;开放中断。 ④使TRO或TR1置位&#xff0c;启动定时器/计数器定时或计数。 代码 利用定时器0工作方式1&…

轻松设置Facebook自动隐藏评论和删除评论功能

Facebook作为海外营销的最大流量平台之一&#xff0c;是很多跨境卖家争夺的市场&#xff0c;希望可以通过Facebook这个全球性的平台来推广自己的产品或服务。身处这个竞争激烈的市场&#xff0c;任何一条负面评论或不当言论出现在你的品牌页面上都可能影响到品牌形象&#xff0…

臻奶惠无人售货机:新零售时代的便捷消费革命

臻奶惠无人售货机&#xff1a;新零售时代的便捷消费革命 在新零售的浪潮中&#xff0c;智能无人售货机作为一个创新的消费模式&#xff0c;已经成为距离消费者最近的便捷购物点之一。这种模式不仅能够满足居民对消费升级的需求&#xff0c;还能通过建立多样化和多层次的消费体…

k8s练习-创建一个Deployment

创建Deployment 创建一个nginx deployment [rootk8s-master home]# cat nginx-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata:name: nginx-deployment spec:selector:matchLabels:app: nginx # 配置pod的labelsreplicas: 2 # 声明2个副本template:metada…

spring boot自动配置原理-怎样回答这个问题

首先我们说一下自动配置的概念。 自动配置&#xff1a;遵循约定大约配置的原则&#xff0c;在boot程序启动后&#xff0c;起步依赖中的一些bean对象会自动注入到ioc容器 例子 程序引入spring-boot-starter-web 起步依赖&#xff0c;启动后&#xff0c;会自动往ioc容器中注入…

记一次 pdfplumber 内存泄漏导致的服务器宕机

有一个项目需求&#xff0c;要在每天凌晨5点的时候执行一个任务&#xff0c;获取一系列的PDF文件并解析。 后端是Django框架&#xff0c;定时任务用Celery来实现的。 本地跑没什么问题&#xff0c;但是一放到服务器上跑就会宕机&#xff0c;而且是毫无征兆的宕机&#xff0c;…

黑马HTMLCSS基础

黑马的笔记和资料都是提供好了的&#xff0c;这个文档非常适合回顾复习。我在黑马提供的笔记上做了一些微不足道的补充&#xff0c;以便自己复习查阅。该笔记比较重要的部分是 表单&#xff0c;http请求 第一章. HTML 与 CSS HTML 是什么&#xff1a;即 HyperText Markup lan…

使用虚拟引擎为AR体验提供动力

Powering AR Experiences with Unreal Engine ​​​​​​​ 目录 1. 虚拟引擎概述 2. 虚拟引擎如何为AR体验提供动力 3. 虚拟引擎中AR体验的组成部分是什么&#xff1f; 4. 使用虚拟引擎创建AR体验 5. 虚拟引擎中AR的优化提示 6. 将互动性融入AR与虚拟引擎 7. 在AR中…

5G PLMN相关概念

PLMN PLMN&#xff08;Public Land Mobile Network&#xff0c;公用陆地移动网络&#xff09;&#xff0c;是由政府或其批准的经营者为公众提供陆地移动通信业务而建立、经营的网络。PLMN与公众交换电话网&#xff08;PSTN&#xff09;互连&#xff0c;形成整个地区或国家规模…

AR和VR如何改变客户体验?

How AR and VR are transforming customer experiences&#xff1f; How AR and VR are transforming customer experiences AR和VR如何改变客户体验 AR and VR technology was largely expedited by the past pandemic with at least 93.3 million and 58.9 million users r…

运筹学经典问题(八):CVRP和VRP-TW

文章目录 问题描述问题建模决策变量数学建模基于容量的消除子环的约束 &#xff08;load-based SECs&#xff09; CVRP完整的数学模型加上时间窗限制的CVRP 问题描述 给定一个图&#xff0c;图上的点代表客户&#xff0c;边代表客户之间的路线&#xff0c;边的权重代表客户之间…

Day60:WEB攻防-XMLXXE安全无回显方案OOB盲注DTD外部实体黑白盒挖掘

目录 XML&XXE-传输-原理&探针&利用&玩法 XXE 黑盒发现 XXE 白盒发现 XXE修复防御方案 有回显 无回显 XML&XXE-黑盒-JSON&黑盒测试&类型修改 XML&XXE-白盒-CMS&PHPSHE&无回显 知识点&#xff1a; 1、XXE&XML-原理-用途&…

MATLAB绘制堆叠填充图--巧用句柄

MATLAB绘制堆叠填充图–巧用句柄 目录 MATLAB绘制堆叠填充图--巧用句柄1. 主要原理讲解1.1 主要函数1.2 句柄原理 2. 绘图示例2.1 准备数据2.2 绘制堆叠填充图-使用句柄控制图形属性2.3 设置填充颜色和样式2.4 添加标题和标签2.5 绘图效果 3. 结语 堆叠填充图是一种常见的数据可…

政安晨:【Keras机器学习实践要点】(十三)—— 利用 TensorFlow 进行多 GPU 分布式训练

目录 前言 设置 单主机、多设备同步培训 工作原理 如何使用 使用回调确保容错 tf.data 性能提示 数据集批处理注意事项 调用 dataset.cache() 调用 dataset.prefetch(buffer_size) 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏:…

ssm015基于java的健身房管理系统的设计与实现+vue

健身房管理系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本健身房管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间…