【爬蟲】05 - 爬蟲攻防

爬蟲05 - 爬蟲攻防

文章目錄

  • 爬蟲05 - 爬蟲攻防
    • 一:隨機User-Agent爬蟲
      • 1:fake-useragent
      • 2:高級反反爬策略
      • 3:生產環境建議
    • 二:代理IP爬蟲
      • 1:獲取代理IP
      • 2:高階攻防
      • 3:企業級的代理實戰
    • 三:動態數據的抓取
      • 1:動態頁面技術全景
      • 2:動態頁面逆向工程
        • 2.1:XHR請求追蹤與解析
        • 2.2:websocket實時數據捕獲
      • 3:無頭瀏覽器控制技術
        • 3.1:Playwright詳解
        • 3.2:反反爬蟲策略應對
        • 3.3:高級技術應用

一:隨機User-Agent爬蟲

1:fake-useragent

當爬蟲請求頭(User-Agent)暴露規律時,目標網站的反爬系統會在?5秒內?識別并封鎖IP。2023年AlexTop百萬網站統計顯示,?68.7%的反爬策略會檢測User-Agent特征?。

檢測項檢測原理典型案例
固定特征值持續相同User-Agent觸發閾值告警某電商平臺連續10次相同UA即封禁
非常用瀏覽器識別非常規瀏覽器版本(如過時Chrome 85)政府網站拒絕服務古董瀏覽器
設備類型沖突移動端UA訪問PC端網頁觸發異常新聞APP接口校驗設備一致性
協議完整性缺失Accept-Encoding/Connection等標準頭金融數據接口強制校驗完整協議頭
pip install fake-useragent --upgrade # 添加upgrade是為了防止舊版數據源失效的問題
from fake_useragent import UserAgent
import requests# 創建UserAgent對象, 下面將使用ua.random 獲取隨機的 UserAgent
ua = UserAgent(browsers=['chrome', 'firefox', 'edge'], os=['windows', 'mac'])
header = {'User-Agent': ua.random, # 隨機獲取一個UserAgent'Accept-Encoding': 'gzip, deflate, br', # 告訴服務器,我們接受gzip壓縮'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8', # 告訴服務器,我們接受中文'Connection': 'keep-alive' # 告訴服務器,我們保持連接
}requests.get('https://www.baidu.com', headers=header)

可以封裝設備的一致性

from fake_useragent import UserAgent
import requests# 可以封裝設備一致性
def generate_user_agent(device_type="pc"):ua = UserAgent()base_headers = {'Accept-Encoding': 'gzip, deflate, br','Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8'}if device_type == 'mobile':return {**base_headers,'User-Agent': ua.firefox, # a'X-Requested-With': 'com.android.browser'}else:return {**base_headers,'User-Agent': ua.chrome, # b'Sec-CH-UA-Platform': '"Windows"'}for page in range(1, 11):headers = generate_user_agent('mobile' if page % 2 else 'pc')response = requests.get(f'https://www.zhipin.com/job_detail/?query=python&city=101010100&industry=&position=', headers=headers)while True:if response.status_code == 200:print(response.text)breakprint("=" * 20)

2:高級反反爬策略

方案一:動態版本更新?(解決版本過時檢測)

# 強制使用最新Chrome版本  
ua = UserAgent(min_version=120)  # Chrome 120+  
headers = {'User-Agent': ua.chrome}  

方案二:混合真實瀏覽器指紋?

# 從真實瀏覽器捕獲指紋注入  
real_fingerprint = {  'Sec-CH-UA': '"Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="8"',  'Sec-CH-UA-Mobile': '?0',  'Sec-CH-UA-Platform': '"Windows"'  
}  
headers = {‌**generate_context_headers(), **‌real_fingerprint}  

失敗重試熔斷機制

from tenacity import retry, stop_after_attempt, wait_exponential  @retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1))  
def safe_request(url):  try:  return requests.get(url, headers=generate_context_headers())  except requests.exceptions.RequestException as e:  if e.response.status_code == 403:  # 觸發UA刷新熔斷  UserAgent().update()  raise  safe_request('https://target.com/api')  

3:生產環境建議

定時更新UA數據庫

# 每天自動更新UA數據庫  
0 3 * * * /usr/bin/python3 -c "from fake_useragent import UserAgent; UserAgent().update()"  

可以配置些監控和報警

# 當連續5次403錯誤時觸發警報  
if error_count > 5:  send_alert(f"UA策略失效!當前攔截率:{error_count/request_count*100:.2f}%")  switch_to_backup_proxy()  

在生產環境中最好使用多庫備用

# 當fake_useragent失效時切換至browser_useragent  
try:  from fake_useragent import UserAgent  
except ImportError:  from browswer_useragent import BrowserUserAgent as UserAgent

二:代理IP爬蟲

當爬蟲請求頻率超過?5次/秒?時,目標網站的反爬系統將在?10秒內?封鎖當前IP。據2024年全球反爬技術報告,?83%的網站采用IP指紋檢測?作為核心防御手段

動態代理IP池?,結合智能路由與熔斷機制實現反爬突圍,實測將IP封禁率從?72%降至3%?

檢測維度反爬策略典型案例
請求頻率閾值單IP單位時間內請求次數超限觸發封禁某社交平臺限制單IP每秒3次請求
IP黑名單庫識別代理服務器IP段并全局封禁新聞網站屏蔽已知數據中心IP
地理位置異常短時間跨國IP跳躍觸發風控電商平臺攔截中美IP交替訪問行為

1:獲取代理IP

可以使用https://free-proxy-list.net/zh-cn/獲取到免費的代理IP

在這里插入圖片描述

import requests
import random
from bs4 import BeautifulSoup# 獲取免費代理 -> https://free-proxy-list.net/zh-cn/
def scrape_free_proxies():url = "https://free-proxy-list.net/" # 獲取免費的ip代理response = requests.get(url)soup = BeautifulSoup(response.text, 'html.parser')proxies = [] # 創建一個空列表, 存儲獲取到的代理for row in soup.select("table.table tbody tr"):cols = row.find_all('td')if len(cols) < 7:continueif cols[4].text == 'elite proxy' and cols[6].text == 'yes':proxies.append(f"{cols[0].text}:{cols[1].text}")return proxies# 請求, 如果失敗了就換一個代理IP, 最多嘗試5次
def do_request(proxy):for i in range(5):print(f"Trying proxy: {proxy}")try:response = requests.get('http://www.baidu.com', proxies=proxy)print(response.json())returnexcept:print(f"Failed to get IP, trying again...")proxy = {'http': f'http://{random.choice(proxy_list)}','https': f'http://{random.choice(proxy_list)}'}if __name__ == '__main__':proxy_list = scrape_free_proxies()print(proxy_list)# 隨機選擇代理current_proxy = {'http': f'http://{random.choice(proxy_list)}','https': f'http://{random.choice(proxy_list)}'}do_request(current_proxy)

還可以添加代理IP的智能容錯機制

import requests
import random
from bs4 import BeautifulSoup
from tenacity import retry, stop_after_attempt, wait_fixed# 獲取免費代理 -> https://free-proxy-list.net/zh-cn/
def scrape_free_proxies():url = "https://free-proxy-list.net/" # 獲取免費的ip代理response = requests.get(url)soup = BeautifulSoup(response.text, 'html.parser')proxies = [] # 創建一個空列表, 存儲獲取到的代理for row in soup.select("table.table tbody tr"):cols = row.find_all('td')if len(cols) < 7:continueif cols[4].text == 'elite proxy' and cols[6].text == 'yes':proxies.append(f"{cols[0].text}:{cols[1].text}")return proxies# 代理IP的智能容錯機制
@retry(stop=stop_after_attempt(3), wait=wait_fixed(2))
def robust_request(url, proxy_pool):proxy = random.choice(proxy_pool)try:return requests.get(url,proxies={'http': f'http://{proxy}', 'https': f'http://{proxy}'},timeout=10)except (requests.ProxyError, requests.ConnectTimeout):proxy_pool.remove(proxy)  # 移除失效代理raiseif __name__ == '__main__':proxy_list = scrape_free_proxies()url = "http://www.baidu.com"response = robust_request(url, proxy_list)print(response.status_code)print(response.text)

2:高階攻防

四類代理IP的選型

代理類型優勢劣勢適用場景
數據中心代理高速度、低延遲易被識別封禁快速抓取非敏感數據
住宅代理高匿名性、真實用戶IP成本高、速度波動對抗嚴格反爬(如Cloudflare)
移動4G代理極高匿名性、IP池龐大穩定性差、管理復雜抓取APP接口數據
Socks5代理支持UDP、加密傳輸配置復雜、兼容性要求需要深度匿名場景

由此演化出對應IP黑名單的三種策略:

策略一:協議混淆,將HTTP流量偽裝成Socks5

import socks  
import socket  # 強制使用Socks5協議  
socks.set_default_proxy(socks.SOCKS5, "proxy_ip", 1080)  
socket.socket = socks.socksocket  # 發送請求(網站識別為普通Socks流量)  
requests.get("https://target.com")  

策略二:IP冷啟動?:新代理首次訪問僅采集低風險頁面

策略三:流量染色?:在代理請求中注入真實瀏覽器指紋(如TLS指紋)

3:企業級的代理實戰

redis自建代理池系統

import redis
import json
import requestsclass ProxyPool:def __init__(self):self.redis = redis.Redis(host='127.0.0.1', port=6379, db=0)def add_proxy(self, proxy:str, score:float=100):self.redis.zadd('proxies', {proxy: score})def get_best_proxy(self):return self.redis.zrange('proxies', 0, 0)[0].decode()def refresh_proxy(self, proxy:str, penalty:float=20):self.redis.zincrby('proxies', -penalty, proxy)if __name__ == '__main__':# 添加代理pool = ProxyPool()pool.add_proxy('127.0.0.1:8080')pool.add_proxy('127.0.0.1:8081')pool.add_proxy('127.0.0.1:8082')# 獲取代理best_proxy = pool.get_best_proxy()try:# 請求, 如果失敗了就換一個代理IP, 最多嘗試5次requests.get("https://target.com", proxies={'http': best_proxy})except Exception:pool.refresh_proxy(best_proxy)  

商業代理集成

import hashlib  
import time  def gen_mogu_proxy():  # 生成動態簽名  timestamp = str(int(time.time()))  secret = "your_api_secret"  sign = hashlib.md5(f"timestamp={timestamp}&secret={secret}".encode()).hexdigest()  # 獲取獨享代理(按需切換IP)  api_url = f"http://piping.mogumiao.com/proxy/api/get_ip?count=1&timestamp={timestamp}&sign={sign}"  result = requests.get(api_url).json()  return f"{result['msg'][0]['ip']}:{result['msg'][0]['port']}"  # 獲取高匿名IP  
mogu_proxy = gen_mogu_proxy()  
requests.get("https://target.com", proxies={'http': f'http://{mogu_proxy}'})  

三:動態數據的抓取

當傳統爬蟲遭遇?React/Vue單頁應用?時,?83%的數據請求?通過Ajax/WebSocket動態加載,直接獲取HTML源碼的成功率不足15%。

而如果結合?逆向工程?與?無頭瀏覽器控制技術?,構建覆蓋SPA(單頁應用)、SSR(服務端渲染)、CSR(客戶端渲染)的全場景解決方案,實現動態數據抓取成功率從?12%到98%?的技術躍遷

1:動態頁面技術全景

技術類型核心原理典型場景
Ajax/XHRXMLHttpRequest異步獲取數據電商商品分頁加載
WebSocket全雙工通信實時更新股票行情/在線聊天
SSR服務端生成動態HTML(如Next.js)新聞門戶首屏渲染
CSR客戶端JS動態構建DOM(如React/Vue)后臺管理系統
JSONP跨域數據獲取(逐漸被CORS替代)老舊天氣預報接口
爬蟲瀏覽器CDNAPI服務器React訪問https://shop.com獲取基礎HTML框架返回包含React Root的HTML發送XHR請求GET /api/products返回JSON數據執行hydrate渲染DOM生成完整商品列表DOM爬蟲瀏覽器CDNAPI服務器React

2:動態頁面逆向工程

2.1:XHR請求追蹤與解析
  1. 打開?Network面板?并篩選XHR/Fetch請求
  2. 定位目標數據的API端點(如/graphql)
  3. 解析請求頭認證參數(Authorization/X-API-Key)
  4. 復制為Python代碼(Copy as cURL → 轉換為requests代碼)

在這里插入圖片描述

import requests
from urllib.parse import urlencode# 設置請求頭,包含API版本和授權信息
headers = {'x-api-version': '3.2','authorization': 'Bearer eyJhbGciOiJIUzI1Ni...',
}# 定義請求參數,包括類別ID、排序方式、頁碼和平臺信息
params = {'categoryId': 305,'sort': 'sales_desc','page': 1,'platform': 'web'
}# 直接請求數據接口
response = requests.get('https://api.shop.com/graphql',headers=headers,params=urlencode(params, doseq=True)
)# 解析JSON數據
products = response.json()['data']['products']
2.2:websocket實時數據捕獲
import asyncio
import websockets
import jsonasync def fetch_danmu():uri = "wss://live-api.example.com/ws"  # 替換為實際的 WebSocket 地址while True:try:async with websockets.connect(uri) as websocket:print("成功連接到直播間!")# 可選:發送認證信息auth_message = json.dumps({"user": "test_user","token": "your_token"})await websocket.send(auth_message)print("認證信息已發送")while True:try:# 接收服務器發送的彈幕消息message = await websocket.recv()danmu_data = json.loads(message)print(f"收到彈幕: {danmu_data.get('content', '未知內容')}")except websockets.exceptions.ConnectionClosed:print("連接斷開,重新連接中...")breakexcept Exception as e:print(f"發生錯誤: {e}")break# 運行異步任務
asyncio.get_event_loop().run_until_complete(fetch_danmu())

3:無頭瀏覽器控制技術

無頭瀏覽器(Headless Browser)是指沒有圖形用戶界面的瀏覽器,可以通過編程方式控制,模擬用戶操作,執行JavaScript渲染,是現代爬蟲技術中的重要工具。

  1. Puppeteer - Google開發的Node庫,控制Chromium/Chrome
  2. Playwright - Microsoft開發的多瀏覽器控制工具
  3. Selenium - 傳統的瀏覽器自動化框架(后面介紹)
  4. Pyppeteer - Puppeteer的Python版本
3.1:Playwright詳解

Playwright是由Microsoft開發的跨瀏覽器自動化測試工具,支持Chromium、WebKit和Firefox

Playwright有如下的特性:

  • 多瀏覽器支持:Chromium (Chrome, Edge)、WebKit (Safari)、Firefox
  • 跨平臺能力:Windows、macOS、Linux全平臺支持 & 可本地運行也可CI/CD集成
  • 多語言綁定:JavaScript/TypeScript、Python、Java、.NET
  • 現代化架構:基于WebSocket的通信協議、自動等待機制、強大的選擇器引擎
pip install playwright
playwright install  # 安裝瀏覽器

基本頁面操作

from playwright.sync_api import sync_playwrightwith sync_playwright() as p:# 啟動瀏覽器(無頭模式)browser = p.chromium.launch(headless=False)# 創建新頁面page = browser.new_page()# 導航到URLpage.goto("https://example.com")# 獲取頁面標題print(page.title())# 截圖page.screenshot(path="example.png")# 關閉瀏覽器browser.close()

元素定位與交互 - Playwright提供多種強大的選擇器:

# CSS選擇器
page.click("button.submit")# 文本選擇器
page.click("text=Login")# XPath
page.click("//button[@id='submit']")# 組合選擇器
page.click("article:has-text('Playwright') >> button")

自動等待機制 -> Playwright內置智能等待,無需手動添加sleep

# 等待元素出現(最多10秒)
page.wait_for_selector("#dynamic-element", timeout=10000)# 等待導航完成
page.click("text=Navigate")
page.wait_for_url("**/new-page")# 等待網絡請求完成
with page.expect_response("**/api/data") as response_info:page.click("button.load-data")
response = response_info.value

網絡請求攔截

# 路由攔截
def handle_route(route):if "ads" in route.request.url:route.abort()  # 阻止廣告請求else:route.continue_()page.route("**/*", handle_route)

文件下載處理

# 等待下載開始
with page.expect_download() as download_info:page.click("a#download-link")
download = download_info.value# 保存下載文件
path = download.path()
download.save_as("/path/to/save")

iframe處理

# 定位iframe
frame = page.frame(name="embedded")# 在iframe內操作
frame.fill("#username", "testuser")
frame.click("#submit")

爬蟲實戰應用:

動態內容抓取

async with async_playwright() as p:browser = await p.chromium.launch()page = await browser.new_page()await page.goto("https://dynamic-ecom-site.com")# 滾動加載所有商品while await page.locator("text=Load More").is_visible():await page.click("text=Load More")await page.wait_for_timeout(2000)  # 適當延遲# 提取所有商品數據products = await page.locator(".product").evaluate_all("""products => products.map(p => ({name: p.querySelector('.name').innerText,price: p.querySelector('.price').innerText}))""")print(products)await browser.close()

登錄會話保持

# 保存登錄狀態
context = browser.new_context()
page = context.new_page()
page.goto("login_url")
page.fill("#username", "user")
page.fill("#password", "pass")
page.click("#login")# 保存cookies
context.storage_state(path="auth.json")# 后續使用保存的狀態
context = browser.new_context(storage_state="auth.json")
page = context.new_page()

性能優化技巧

瀏覽器上下文復用:

context = browser.new_context()
page1 = context.new_page()
page2 = context.new_page()

請求過濾:

await page.route("**/*.{png,jpg,jpeg}", lambda route: route.abort())

并行處理:

async with asyncio.TaskGroup() as tg:tg.create_task(scrape_page(page1, url1))tg.create_task(scrape_page(page2, url2))

常見問題解決方案

檢測規避:

# 修改WebGL供應商信息
await page.add_init_script("""const originalGetParameter = WebGLRenderingContext.prototype.getParameter;WebGLRenderingContext.prototype.getParameter = function(parameter) {if (parameter === 37445) return "Intel Open Source Technology Center";return originalGetParameter.call(this, parameter);};
""")

超時處理:

try:await page.wait_for_selector(".element", timeout=5000)
except TimeoutError:print("元素加載超時")

元素點擊問題:

await page.locator("button").dispatch_event("click")  # 直接觸發事件

與Puppeteer對比

特性PlaywrightPuppeteer
瀏覽器支持多引擎僅Chromium
語言支持多種主要JS
自動等待更智能基礎
選擇器引擎更強大標準
移動設備模擬完善有限
社區生態快速增長成熟穩定
3.2:反反爬蟲策略應對
  • 指紋偽裝:修改瀏覽器指紋特征
  • 行為模擬:模擬人類操作模式(鼠標移動、隨機延遲)
  • 代理輪換:結合代理IP池使用
  • WebGL/Canvas指紋處理:定制化渲染參數
3.3:高級技術應用

分布式無頭瀏覽器集群

調度中心
瀏覽器節點1
瀏覽器節點2
瀏覽器節點3
代理IP池

智能渲染策略

  • 按需渲染:根據目標網站特點定制渲染策略
  • 資源加載控制:選擇性加載CSS/JS/圖片
  • 預渲染緩存:對常見頁面進行預渲染

性能優化技術

  1. 瀏覽器實例復用:避免頻繁啟動關閉
  2. 頁面池管理:維護多個頁面實例
  3. 資源攔截:阻止不必要資源加載
  4. CDN緩存利用:合理設置緩存策略
挑戰解決方案
資源消耗大瀏覽器實例池化、資源限制
檢測風險高指紋偽裝、行為模擬
穩定性問題心跳檢測、自動恢復
性能瓶頸分布式架構、智能調度

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/90130.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/90130.shtml
英文地址,請注明出處:http://en.pswp.cn/web/90130.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

FPGA自學——存儲器模型

FPGA自學——存儲器模型 文章目錄FPGA自學——存儲器模型一、IP核二、ROM&#xff08;read only memory&#xff09;三、ROM的IP核調用四、RAM&#xff08;random access memory&#xff09;五、RAM的IP核調用總結1.不同波形的使用的存儲器2.塊與分布式的選擇3.FPGA與模塊的容量…

【C++】stack和queue拓展學習

目錄 1.反向迭代器思路及實現 1.1. 源碼及框架分析 1.2. 實現反向迭代器 2.stack和queue練習拓展-計算器實現 2.1. 后綴表達式概念 2.2. 后綴表達式運算規則 2.3. 中綴表達式轉后綴表達式 2.3.1 轉換思路 2.3.2 代碼實現 2.4. 計算器實現 1.反向迭代器思路及實現 1.1…

Web3與區塊鏈如何革新網絡安全——走在前沿

隨著互聯網技術的飛速發展&#xff0c;網絡安全問題日益成為全球關注的焦點。Web3和區塊鏈技術作為新興的技術力量&#xff0c;正在逐步改變網絡安全的格局。本文將探討Web3和區塊鏈技術如何革新網絡安全&#xff0c;走在技術前沿。 1. Web3技術概述 Web3&#xff0c;即第三代互…

網絡初級安全第三次作業

<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>用戶登錄</title><style>* {margin:…

CSS中用display實現元素的顯示/隱藏切換

** 通過display中的none和block ** 在前端開發中&#xff0c;display: none 和 display: block 是兩種常用的 CSS 顯示模式&#xff0c;核心區別在于&#xff1a;是否在頁面中保留元素的占位空間 1. 核心區別屬性display: nonedisplay: block占位空間元素完全從渲染樹中移除&am…

因果圖方法設計測試用例的價值與使用范圍

一、因果圖方法的核心原理 因果圖方法通過分析軟件規格說明中的輸入條件&#xff08;因&#xff09;和輸出結果&#xff08;果&#xff09;之間的邏輯關系&#xff0c;利用圖形化方式將這些關系清晰展現。它使用特定的符號表示因果關系&#xff08;如恒等、非、或、與&#xff…

智慧農服數字化平臺-數字科技賦能農業,開啟智慧三農新篇章

智慧農服數字化平臺數字科技賦能農業&#xff0c;開啟智慧三農新篇章平臺概覽在鄉村振興和農業現代化的時代背景下&#xff0c;我們推出了創新的農業服務數字化平臺——一個專為農業生產者打造的綜合性SaaS服務平臺。平臺以"科技助農、數據興農"為使命&#xff0c;通…

在線教育培訓課程視頻如何防下載、防盜錄?

在數字化學習日益普及的今天&#xff0c;高質量的在線課程已成為教育機構、知識付費平臺和講師的核心競爭力。如何在不影響學員正常學習體驗的前提下&#xff0c;有效防止課程視頻被惡意盜取&#xff1f;今天介紹在線教育課程防下載、防盜錄的10種視頻加密方法&#xff0c;看看…

圖像分析學習筆記(2):圖像處理基礎

圖像分析學習筆記&#xff1a;圖像處理基礎圖像增強方法圖像復原方法圖像分割方法形態學處理圖像增強方法 目的&#xff1a;改善視覺效果&#xff0c;例如增強對比度定義&#xff1a;為了改善視覺效果、便于人或計算機對圖像的分析理解&#xff0c;針對圖像的特點或存在的問題…

生存分析機器學習問題

研究目標&#xff1a; 開發一個機器學習模型&#xff0c;用于個性化預測XXX的總體生存期。 模型輸入&#xff1a;結合生存時間、治療方案、人口統計學特征和實驗室測試結果等多種特征。 模型輸出&#xff1a;預測二元結果&#xff08;活著 vs. 死亡&#xff09;。 應用場景&…

【華為機試】547. 省份數量

文章目錄547. 省份數量描述示例 1示例 2提示解題思路核心分析問題轉化算法選擇策略1. 深度優先搜索 (DFS)2. 廣度優先搜索 (BFS)3. 并查集 (Union-Find)算法實現詳解方法一&#xff1a;深度優先搜索 (DFS)方法二&#xff1a;廣度優先搜索 (BFS)方法三&#xff1a;并查集 (Union…

09_Spring Boot 整合 Freemarker 模板引擎的坑

09_Spring Boot 整合 Freemarker 模板引擎的坑 1.背景&#xff1a; springboot 版本&#xff1a;3.0.2 2. 引入依賴 在 pom.xml 中添加&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web<…

十七、【Linux系統yum倉庫管理】替換阿里源、搭建本地yum源

替換阿里源、搭建本地yum源本章學習目標內容簡介阿里外網源核心功能本地yum核心功能操作演示替換阿里外網源備份原有yum源清理沖突配置下載阿里源配置文件添加EPEL擴展源清理緩存重建索引驗證源狀態測試安裝軟件使用鏡像搭建本地倉庫準備ISO鏡像創建掛載點目錄掛載iso文件驗證掛…

家庭網絡怎么進行公網IP獲取,及內網端口映射外網訪問配置,附無公網IP提供互聯網連接方案

在家庭網絡中&#xff0c;我們常常需要通過公網IP來訪問內網中的設備&#xff0c;比如家庭NAS、Web服務器或監控攝像頭。要實現這個目標&#xff0c;首先要確保你的網絡具有一個可用的公網IP&#xff0c;然后通過路由器配置端口映射&#xff08;Port Forwarding&#xff09;。如…

(LeetCode 面試經典 150 題 ) 128. 最長連續序列 (哈希表)

題目&#xff1a;128. 最長連續序列 思路&#xff1a;哈希表&#xff0c;時間復雜度0(n)。 用集合set來實現哈希表的功能&#xff0c;記錄所有出現的元素。然后遍歷元素&#xff0c;細節看注釋。 C版本&#xff1a; class Solution { public:int longestConsecutive(vector&…

Altera Quartus:BAT批處理實現一鍵sof文件轉換為jic文件

sof文件是Quartus編譯默認生成的程序文件&#xff0c;用于通過JTAG口下載到FPGA內部RAM&#xff0c;斷電程序會丟失&#xff0c;jic文件是用于固化到外部Flash中的程序文件&#xff0c;斷電程序不會丟失。本文介紹如何通過批處理文件實現sof到jic的一鍵自動化轉換。 Quartus工程…

基于單片機嬰兒床/嬰兒搖籃/嬰兒車設計/嬰兒監護系統

傳送門 &#x1f449;&#x1f449;&#x1f449;&#x1f449;其他作品題目速選一覽表 &#x1f449;&#x1f449;&#x1f449;&#x1f449;其他作品題目功能速覽 概述 本設計實現了一種基于單片機的多功能智能嬰兒監護系統&#xff0c;集成于嬰兒床、搖籃或嬰兒車中…

Typora + 七牛云圖床終極配置教程

本文是一份超詳細的 Typora 七牛云圖床配置指南&#xff0c;旨在幫助你實現圖片“即插即用”的順滑寫作體驗。我們將一步步完成所有配置&#xff0c;并特別針對配置過程中最常見的三個錯誤&#xff1a;ENOTFOUND (找不到服務器)、401 (無權訪問) 和 Document not found (文件不…

高性能熔斷限流實現:Spring Cloud Gateway 在電商系統的實戰優化

一、為什么需要高性能熔斷限流&#xff1f; 在電商系統中&#xff0c;尤其是大促期間&#xff0c;系統面臨的流量可能是平時的數十倍甚至上百倍。 這樣的場景下&#xff0c;熔斷限流不再是可選功能&#xff0c;而是保障系統穩定的生命線。傳統方案的問題&#xff1a; 限流精度不…

計算機網絡1.1:計算機網絡在信息時代的作用

計算機網絡已由一種通信基礎設施發展成為一種重要的信息服務基礎設施。計算機網絡已經像水、電、煤氣這些基礎設施一樣&#xff0c;成為我們生活中不可或缺的一部分。