python爬虫------- Selenium下篇(二十三天)

🎈🎈作者主页: 喔的嘛呀🎈🎈
🎈🎈所属专栏:python爬虫学习🎈🎈
✨✨谢谢大家捧场,祝屏幕前的小伙伴们每天都有好运相伴左右,一定要天天开心哦!✨✨ 

 

目录

十、处理动态内容

十一、处理验证码

十二、模拟登录

十三、跨页面操作

十四、异常处理

十五、数据存储

存储到文件(例如 CSV 文件)

存储到数据库(例如 SQLite)

存储到其他存储介质(例如 MongoDB)

十六、反爬虫策略

十七、性能优化

十八、定时任务:

十九、 与其他库和工具的集成


helllo,兄弟姐妹们!今天我们接着把第二十二天剩下的十个知识点学完(从第十个开始)。

十、处理动态内容

处理动态加载内容的常见方法是通过模拟用户操作来触发页面加载新内容。对于需要滚动页面加载的情况,可以使用 Selenium 的 execute_script 方法来执行 JavaScript 代码,从而实现滚动页面的效果。下面是一个示例代码,演示如何使用 Selenium 模拟滚动页面来加载更多内容:


from selenium import webdriver
import time# 启动浏览器
driver = webdriver.Chrome()# 打开网页
driver.get('<https://example.com>')# 模拟滚动页面
scroll_pause_time = 2  # 每次滚动后等待时间
screen_height = driver.execute_script("return window.screen.height;")   # 获取屏幕高度i = 1
while True:# 记录滚动前页面高度last_height = driver.execute_script("return document.body.scrollHeight;")# 模拟滚动到页面底部driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")# 等待页面加载time.sleep(scroll_pause_time)# 计算新的页面高度new_height = driver.execute_script("return document.body.scrollHeight;")# 如果新的页面高度和上次相同,则说明已经滚动到底部if new_height == last_height:break# 打印滚动次数print(f"Scrolling {i} times")i += 1# 获取页面数据
data = driver.page_source# 关闭浏览器
driver.quit()# 处理页面数据,如解析数据等

在这个示例中,我们首先启动 Chrome 浏览器,并打开了一个示例网页。然后,我们通过执行 JavaScript 代码来模拟滚动页面到底部的效果。在每次滚动后,我们等待了2秒钟以确保页面有足够的时间加载新内容。如果页面高度不再增加,说明已经滚动到了页面底部,循环就会结束。最后,我们获取了页面的 HTML 源码,并可以继续处理数据,如解析数据等操作。

请注意,这只是一个简单的示例。实际情况可能会更复杂,具体取决于要爬取的网站和其动态加载数据的机制。

十一、处理验证码

处理网页中的验证码通常需要结合 Selenium 和图像识别技术。下面是一个使用 Selenium 和 pytesseract 库来处理网页中简单验证码的示例:

首先,安装 Pillow、pytesseract 和 pytesseract 库:


pip install Pillow pytesseract selenium

然后,下载并安装 Tesseract OCR,并将其添加到系统路径中。

接下来,使用以下代码示例:


from PIL import Image
import pytesseract
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
import requests
from io import BytesIO# 设置 Tesseract OCR 路径
pytesseract.pytesseract.tesseract_cmd = r'C:\\Program Files\\Tesseract-OCR\\tesseract.exe'# 启动浏览器
driver = webdriver.Chrome()# 打开网页
driver.get('<https://example.com>')# 找到验证码图片元素
captcha_element = driver.find_element(By.XPATH, '//img[@id="captcha-image"]')# 获取验证码图片的链接
captcha_image_url = captcha_element.get_attribute('src')# 下载验证码图片
response = requests.get(captcha_image_url)
captcha_image = Image.open(BytesIO(response.content))# 识别验证码
captcha_text = pytesseract.image_to_string(captcha_image)# 输入验证码
captcha_input = driver.find_element(By.XPATH, '//input[@id="captcha-input"]')
captcha_input.send_keys(captcha_text)# 提交表单
submit_button = driver.find_element(By.XPATH, '//button[@id="submit-button"]')
submit_button.click()# 等待页面加载
time.sleep(2)# 获取页面数据
data = driver.page_source# 关闭浏览器
driver.quit()# 处理页面数据,如解析数据等

在这个示例中,我们首先设置了 Tesseract OCR 的路径。然后,使用 Selenium 打开了一个示例网页,并找到了验证码图片元素。我们通过请求验证码图片的链接,并使用 pytesseract 库识别验证码中的文本。最后,我们将识别结果填写到验证码输入框中,并提交表单。

请注意,这只适用于简单的验证码。对于复杂的验证码,可能需要使用更复杂的技术和工具。

注意:

Tesseract OCR(Optical Character Recognition)是一个开源的光学字符识别引擎,由 Google 开发并维护。它能够将图像中的文字转换为可编辑的文本。Tesseract 能够识别超过100种语言的文字,并且支持许多图像格式。Tesseract 的最新版本是4.x,具有比较高的准确性和性能。

使用 Tesseract OCR 进行文本识别通常涉及以下步骤:

  1. 安装 Tesseract OCR:根据您的操作系统下载并安装 Tesseract OCR。对于 Windows 系统,可以从 GitHub Release 页面下载安装包进行安装。对于 macOS 和 Linux 系统,可以通过包管理器(如 Homebrew 或 apt)安装。

  2. 安装 pytesseract:pytesseract 是一个 Python 模块,用于与 Tesseract OCR 进行交互。您可以使用 pip 安装 pytesseract:

    bashCopy code
    pip install pytesseract
  3. 使用 pytesseract 进行图像文本识别:下面是一个简单的示例代码,演示如何使用 pytesseract 对图像进行文本识别:

    
    from PIL import Image
    import pytesseract# 读取图像文件
    image = Image.open('example.png')# 使用 pytesseract 进行文本识别
    text = pytesseract.image_to_string(image)# 打印识别结果
    print(text)

Tesseract OCR 对于特定字体、大小和质量的图像效果可能会有所不同。在实际使用中,我们需要调整图像预处理和 Tesseract 的参数来获得最佳的识别结果。

十二、模拟登录

要使用 Selenium 模拟登录网站并爬取需要登录才能访问的页面,我们可以按照以下步骤进行:

  1. 启动浏览器并打开登录页面。
  2. 填写登录表单,包括用户名和密码。
  3. 点击登录按钮。
  4. 等待登录完成。
  5. 访问需要登录才能访问的页面,提取数据或进行其他操作。

下面是一个示例代码,演示如何使用 Selenium 模拟登录网站并爬取需要登录才能访问的页面:


from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time# 启动浏览器
driver = webdriver.Chrome()# 打开登录页面
driver.get('<https://example.com/login>')# 填写用户名和密码
username_input = driver.find_element(By.ID, 'username')
password_input = driver.find_element(By.ID, 'password')username_input.send_keys('your_username')
password_input.send_keys('your_password')# 提交登录表单
password_input.send_keys(Keys.RETURN)# 等待登录完成,这里假设登录成功后会跳转到首页
time.sleep(2)# 访问需要登录才能访问的页面
driver.get('<https://example.com/protected_page>')# 提取页面数据或进行其他操作
data_element = driver.find_element(By.XPATH, '//div[@class="data"]')
data = data_element.text
print('Protected Page Data:', data)# 关闭浏览器
driver.quit()

请注意,在实际使用中,我们需要替换示例中的 '<https://example.com/login''your_username'> 和 'your_password' 为实际的登录页面 URL、用户名和密码。同时,确保我们的行为符合网站的使用条款和规定,以免触发反爬虫措施。

十三、跨页面操作

处理需要跨页面操作的情况通常需要在页面之间进行导航和交互。使用 Selenium 可以模拟用户在网页上的操作,包括点击链接跳转到另一个页面。下面是一个示例代码,演示如何在一个页面点击链接跳转到另一个页面进行数据提取:


from selenium import webdriver
from selenium.webdriver.common.by import By
import time# 启动浏览器
driver = webdriver.Chrome()# 打开第一个页面
driver.get('<https://example.com/page1>')# 点击页面上的链接
link_element = driver.find_element(By.XPATH, '//a[@id="link-to-page2"]')
link_element.click()# 等待页面加载
time.sleep(2)# 在第二个页面提取数据
data_element = driver.find_element(By.XPATH, '//div[@id="data-on-page2"]')
data = data_element.textprint('Data on page 2:', data)# 关闭浏览器
driver.quit()

在这个示例中,我们首先启动了 Chrome 浏览器,并打开了第一个页面。然后,我们找到了第一个页面上的链接元素,并使用 click() 方法点击了该链接。随后,我们等待了2秒钟,以确保第二个页面加载完成。最后,我们找到了第二个页面上的数据元素,并提取了其文本内容。

需要注意的是,实际情况可能更复杂,具体取决于网站的结构和交互方式。在处理跨页面操作时,确保等待页面加载完成并处理可能的异常情况是很重要的。

十四、异常处理

在爬取过程中,可能会出现各种异常情况,如超时、元素未找到等。为了确保爬虫的稳定性和可靠性,需要对这些异常情况进行处理。下面是一个示例代码,演示如何使用 try-except 语句来处理这些异常情况:


from selenium import webdriver
from selenium.common.exceptions import TimeoutException, NoSuchElementException
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC# 启动浏览器
driver = webdriver.Chrome()try:# 设置页面加载超时时间为10秒driver.set_page_load_timeout(10)# 打开网页driver.get('<https://example.com>')# 显式等待10秒,直到元素加载完成WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, '//div[@id="content"]')))# 提取数据content_element = driver.find_element(By.XPATH, '//div[@id="content"]')content = content_element.textprint('Content:', content)except TimeoutException:print('页面加载超时')except NoSuchElementException:print('元素未找到')finally:# 关闭浏览器driver.quit()

在这个示例中,我们使用了 try-except 语句来捕获可能出现的 TimeoutException(超时异常)和 NoSuchElementException(元素未找到异常)。在 try 代码块中,我们设置了页面加载超时时间为10秒,并使用显式等待来等待页面元素加载完成。如果页面加载超时或元素未找到,则会相应地捕获并处理异常。最后,无论是否发生异常,我们都会在 finally 代码块中关闭浏览器。

通过合理地处理异常情况,可以使爬虫在遇到问题时能够优雅地处理,并继续执行其他操作。

十五、数据存储

提取到的数据存储到文件、数据库或其他存储介质中是网页爬取的重要步骤之一。具体的存储方式取决于您的需求和项目的要求。以下是几种常见的数据存储方式示例:

存储到文件(例如 CSV 文件)


import csvdata = [{'name': 'Alice', 'age': 25}, {'name': 'Bob', 'age': 30}]with open('data.csv', mode='w', newline='') as file:writer = csv.DictWriter(file, fieldnames=['name', 'age'])writer.writeheader()for row in data:writer.writerow(row)

存储到数据库(例如 SQLite)


import sqlite3data = [{'name': 'Alice', 'age': 25}, {'name': 'Bob', 'age': 30}]conn = sqlite3.connect('data.db')
cursor = conn.cursor()cursor.execute('''CREATE TABLE IF NOT EXISTS users(id INTEGER PRIMARY KEY, name TEXT, age INTEGER)''')for row in data:cursor.execute('INSERT INTO users (name, age) VALUES (?, ?)', (row['name'], row['age']))conn.commit()
conn.close()

存储到其他存储介质(例如 MongoDB)


from pymongo import MongoClientdata = [{'name': 'Alice', 'age': 25}, {'name': 'Bob', 'age': 30}]client = MongoClient('mongodb://localhost:27017/')
db = client['mydatabase']
collection = db['users']for row in data:collection.insert_one(row)client.close()

这些示例展示了如何将提取到的数据存储到不同的存储介质中。您可以根据项目的需要选择适合的存储方式。

十六、反爬虫策略

反爬虫策略是网站为防止被爬虫程序恶意抓取数据而采取的一系列措施。常见的反爬虫策略包括:

  1. User-Agent检测:网站会检查请求中的 User-Agent 字段,如果发现是爬虫程序常用的 User-Agent,则可能拒绝服务或返回特定响应。
  2. IP地址限制:网站可能会限制同一IP地址的访问频率,过高频率的访问会被视为异常行为。
  3. 验证码:网站可能会在某些操作前要求用户输入验证码,以确认访问者是人类而不是爬虫程序。
  4. 动态加载内容:网站使用JavaScript等技术来动态加载内容,使得只有通过真正执行页面脚本才能获取到完整内容。
  5. 频率限制:限制同一用户或IP地址在一定时间内的请求频率,过高频率的请求会被拒绝。
  6. 页面结构变化:定期改变页面结构,使得爬虫程序难以适应变化而失效。

应对这些反爬虫策略的方法包括:

  1. 设置合理的User-Agent:模拟浏览器行为,避免使用常见的爬虫User-Agent。
  2. 使用代理IP:使用代理IP来隐藏真实IP地址,避免被网站封禁。
  3. 处理验证码:使用验证码识别技术自动处理验证码。
  4. 限制访问频率:设置合理的访问间隔时间,避免过高频率的访问。
  5. 使用随机延迟:在请求之间添加随机延迟,模拟人类操作。
  6. 动态解析页面:使用动态解析技术获取动态加载的内容。
  7. 定期监测网站变化:定期检查网站结构的变化,及时调整爬取策略。
  8. 遵守robots.txt规范:遵守网站的robots.txt文件中的规定,不访问被禁止的页面。

综上所述,应对反爬虫策略需要综合考虑网站的具体情况和采取合适的应对策略。

十七、性能优化

当涉及性能优化时,代码中的优化通常是特定于应用程序和场景的。下面是一些常见的Python爬虫代码优化技巧示例:

(1)减少不必要的等待时间:避免使用固定的等待时间,而是根据需要进行动态等待。示例代码:


from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ECdriver = webdriver.Chrome()
driver.get("<https://example.com>")try:element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "myElement")))
finally:driver.quit()

(2)合理使用隐式等待:在创建WebDriver实例时设置隐式等待时间,而不是在每个操作中都设置等待时间。示例代码:


from selenium import webdriverdriver = webdriver.Chrome()
driver.implicitly_wait(10) # 设置隐式等待时间为10秒driver.get("<https://example.com>")
element = driver.find_element(By.ID, "myElement")

(3)使用多线程/异步处理:使用**concurrent.futures**模块进行异步处理。示例代码:


from concurrent.futures import ThreadPoolExecutor
from selenium import webdriverdef scrape(url):driver = webdriver.Chrome()driver.get(url)# 爬取逻辑driver.quit()urls = ['<https://example.com/page1>', '<https://example.com/page2>', '<https://example.com/page3>']with ThreadPoolExecutor(max_workers=5) as executor:executor.map(scrape, urls)

(4)避免重复请求:使用缓存来存储已经爬取过的数据。示例代码:


import requests
import hashlibcache = {}def get_data(url):if url in cache:return cache[url]response = requests.get(url)data = response.textcache[url] = datareturn dataurl = '<https://example.com>'
data = get_data(url)

这些示例代码演示了一些常见的Python爬虫代码优化技巧,但实际的优化策略应根据具体的爬虫应用程序和场景进行调整和优化。

十八、定时任务:

要将爬虫任务设置为定时执行,可以使用Python的**schedule库来实现。schedule库可以帮助我们在指定的时间间隔内定期运行任务。以下是一个简单的示例代码,演示如何使用schedule**库来定时执行爬虫任务:


import schedule
import timedef crawl():# 在这里编写爬虫逻辑print("开始爬取数据...")# 每小时执行一次爬虫任务
schedule.every().hour.do(crawl)# 在这里可以设置其他定时任务,如每天、每周等# 保持程序运行,直到手动终止
while True:schedule.run_pending()time.sleep(1)

在这个示例中,**crawl函数是我们的爬虫逻辑。使用schedule.every().hour.do(crawl)来设置每小时执行一次爬虫任务。您还可以使用其他schedule.every()**方法来设置其他的定时任务,如每天、每周等。

请注意,为了保持程序持续运行,我们使用了一个**while True循环来不断检查是否有定时任务需要执行,并使用time.sleep(1)**来让程序每秒钟检查一次。这样可以确保定时任务能够按照预期执行。

十九、 与其他库和工具的集成

将Selenium与其他库和工具集成可以实现更强大的功能,比如使用BeautifulSoup解析页面内容、使用pandas处理数据等。以下是一个示例代码,演示了如何将Selenium与BeautifulSoup和pandas集成:

pythonCopy code
from selenium import webdriver
from bs4 import BeautifulSoup
import pandas as pd# 启动浏览器
driver = webdriver.Chrome()# 打开网页
driver.get('<https://example.com>')# 获取页面源码
html = driver.page_source# 使用BeautifulSoup解析页面
soup = BeautifulSoup(html, 'html.parser')# 提取需要的数据
data = []
for item in soup.find_all('div', class_='item'):name = item.find('h2').textprice = item.find('span', class_='price').textdata.append({'name': name, 'price': price})# 将数据转换为DataFrame
df = pd.DataFrame(data)# 关闭浏览器
driver.quit()# 打印数据
print(df)

在这个示例中,我们首先使用Selenium打开了一个网页,并获取了页面的源码。然后,我们使用BeautifulSoup解析了页面,并提取了需要的数据。最后,我们使用pandas将数据转换为DataFrame,并进行打印输出。这样,就实现了将Selenium与BeautifulSoup和pandas集成的功能。

好了,今天的学习就到这里了,第二十四天会带来几个案例将上面的知识点运用起来。敬请期待!拜拜啦!

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

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

相关文章

CAN帧中的ACK位

1&#xff1a;先看官方文档对ACK的解释 All nodes that have received the matching CRC sequence (and, in FD Frames the matching stuff count) shall send an ACK within the ACK slot by overwriting the recessive bit of the transmitter by a dominant bit (they send…

求圆、圆球和圆柱的面积和体积(C语言)

一、运行结果&#xff1b; 二、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h> //定义π常量的值&#xff1b; # define π 3.141526int main() {//初始化变量值&#xff1b;float r, h, S1, S2, P1, V1, V2;int judge 0;//提示用户&#x…

Python基于flask的豆瓣电影分析可视化系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

mid_360建图和定位

录制数据 roslaunch livox_ros_driver2 msg_MID360.launch使用fast-lio 建图 https://github.com/hku-mars/FAST_LIO.git 建图效果 使用python做显示 https://gitee.com/linjiey11/mid360/blob/master/show_pcd.py 使用 point_lio建图 https://github.com/hku-mars/Point…

【数据结构】【C++】AVL树的模拟实现(插入、判断、旋转)

文章目录 1 概念2 实现2.1 AVL树结点的定义2.2 AVL树的插入2.2.1 AVL树的插入规则2.2.2 旋转2.2.2.1 左单旋2.2.2.2 右单旋2.2.2.3 左右双旋2.2.2.4 右左双旋 2.2.3 总结 3 平衡判断4 删除5 源码 1 概念 二叉搜索树虽可以缩短查找的效率&#xff0c;但如果数据有序或接近有序二…

找不到api-ms-win-crt-runtime-l1-1-0.dll文件5种解决方法

在日常使用计算机的过程中&#xff0c;我们时常会遭遇各类意想不到的问题&#xff0c;其中之一就是“api-ms-win-crt-runtime-l1-1-0.dll丢失”。这个错误通常发生在Windows操作系统中&#xff0c;它表示一个动态链接库文件丢失或损坏。这个问题可能会导致某些应用程序无法正常…

1Panel官方出品丨MaxKB:基于LLM大模型的知识库问答系统

1Panel&#xff08;github.com/1Panel-dev/1Panel&#xff09;是一款现代化、开源的Linux服务器运维管理面板&#xff0c;它致力于通过开源的方式&#xff0c;帮助用户简化建站与运维管理流程。为了方便广大用户快捷安装部署相关软件应用&#xff0c;1Panel特别开通应用商店&am…

TensorFlow 1.x的学习

.为什么还有很多人都选择使用TensorFlow 1.x 兼容性问题: TensorFlow 1.x在一些旧项目中已经得到了广泛应用&#xff0c;这些项目可能依赖于1.x版本的特定API或行为。升级到2.x可能需要大量的代码修改和测试工作&#xff0c;对于一些已经稳定运行的项目&#xff0c;维护者可能…

实现iOS App代码混淆

简介 在开发iOS应用程序时&#xff0c;保护代码安全是至关重要的。代码混淆是一种常用的技术&#xff0c;可以增加逆向工程的难度&#xff0c;防止他人对代码的篡改和盗用。本文将介绍如何实现iOS App代码混淆的步骤和操作方法。 整体流程 下面是实现iOS App代码混淆的整体流…

创维:在博鳌论坛 叩响世界之门

出走半生&#xff0c;归来仍是少年。 2024年4月8日&#xff0c;一个离开海南近半个世纪的“少年”回到琼海博鳌&#xff0c;“下一站&#xff0c;1000亿&#xff01;”&#xff0c;他的承诺掷地有声。“1000亿”&#xff0c;意指创维集团在2025年前冲击千亿营收&#xff0c;这…

【JavaWeb】Day45.Mybatis——入门程序

什么是MyBatis? MyBatis是一款优秀的持久层框架&#xff0c;用于简化JDBC的开发。 &#xff08;持久层&#xff1a;指的是就是数据访问层(dao)&#xff0c;是用来操作数据库的。&#xff09; &#xff08;框架&#xff1a;是一个半成品软件&#xff0c;是一套可重用的、通用…

【企业动态】瑞芯微高级业务总监来访东胜物联,共探新能源汽车市场合作

近日&#xff0c;瑞芯微高级业务总监阙金珍一行来访东胜物联参观交流&#xff0c;并就深化合作进行讨论。 东胜物联与瑞芯微建有长期稳固的合作关系&#xff0c;基于RK3588、RK3399、RK3568等处理器&#xff0c;推出了多款嵌入式核心硬件产品&#xff0c;包括核心板、网关等&a…

工业物联网网关

在数字化浪潮席卷全球的今天&#xff0c;工业物联网&#xff08;IIoT&#xff09;作为连接物理世界与数字世界的桥梁&#xff0c;正在逐渐改变传统工业的面貌。而作为IIoT的核心枢纽&#xff0c;工业物联网网关发挥着至关重要的作用。今天&#xff0c;我们就来深入了解一下工业…

使用webpack5+TypeScript+npm发布组件库

一、前言 作为一只前端攻城狮&#xff0c;没有一个属于自己的组件库&#xff0c;那岂不是狮子没有了牙齿&#xff0c;士兵没有了武器&#xff0c;姑娘没有了大宝SOD蜜&#xff0c;你没有了我.... 言归正传&#xff0c;下面将给大家介绍如何通过webpack5编译一个TS组件发布到NPM…

【c 语言】声明了一个指针,会给指针分配内存吗?

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;C语言 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进步&…

租用境外服务器,越南服务器的优势有哪些

自从中国加入世界贸易组织之后&#xff0c;国内经济增加速度非常快&#xff0c;同时越来越多的人选择去东南亚国家发展&#xff0c;因为当地的中国人很多&#xff0c;所以中国企业在当地面临着更小的文化差异。东南亚地区也是最新的经济体&#xff0c;互联网正处于蓬勃发展的阶…

docker服务无法启动

背景&#xff1a;断电重启经常会导致磁盘io错误&#xff0c;甚至出现磁盘坏块 这时可以使用xfs_repair来修复磁盘&#xff0c;但是修复过程可能会导致部分数据丢失 xfs_repair -f -L /dev/sdc问题一&#xff1a; Apr 15 19:27:15 Centos7.6 systemd[1]: Unit docker.service e…

【十一】MyBatis Plus 原理分析

MyBatis Plus 原理分析 摘要 Java EE开发中必不可少ORM框架&#xff0c;目前行业里最流行的orm框架非Mybatis莫属了&#xff0c;而Mybatis框架本身没有提供api实现&#xff0c;所以市面上推出了Mybatis plus系列框架&#xff0c;plus版是mybatis增强工具&#xff0c;用于简化My…

嵌入式系统及应用-1.1嵌入式

嵌入式系统 定义&#xff1a;看不见的计算机&#xff0c;一般不能被用户编程&#xff0c;它有一些专用的I/O设备&#xff0c;对用户的接口是应用专用的 通常将嵌入式计算机系统简称为嵌入式系统。 嵌入式系统是以应用为中心&#xff0c;以计算机技术为基础、软件硬件可裁剪、…

记录一下如何腾讯云服务器用客户端连MySQL

我一般喜欢用IDEA连数据库&#xff0c;别问我为啥&#xff08;就喜欢用一个软件解决所有问题&#xff09; 当然写SQL语句个人还是觉得sqlyog体验最佳&#xff01;