DrissionPage 實戰:動態 IP 代理與百度翻譯 API 數據抓取

本文將詳細介紹如何使用 DrissionPage 實現動態 IP 代理訪問,并結合百度翻譯 API 進行數據抓取與處理。

一、技術選型與架構設計

1.1 為什么選擇 DrissionPage?

DrissionPage 作為新一代網絡自動化工具,相比傳統 Selenium + Requests 方案具有顯著優勢:

  • 混合引擎架構:在同一會話中無縫切換瀏覽器模式和無頭請求模式

  • 連接池管理:內置 TCP 連接復用,減少資源開銷

  • 智能等待機制:基于 DOM 狀態而非固定時間的等待策略

  • 內存優化:相比 Selenium 減少 40%-60% 的內存占用

1.2 系統架構

應用層: User Interface → Business Logic → Data Processing核心層: DrissionPage Session Manager → Proxy Pool → Cache Manager基礎層: Connection Pool → TLS Session復用 → DNS緩存

二、高性能代理池實現

2.1 智能代理調度器

import asyncio
import aiohttp
from typing import List, Dict
from dataclasses import dataclass
from abc import ABC, abstractmethod@dataclass
class ProxyMetrics:response_time: floatsuccess_rate: floatlast_used: floatconsecutive_failures: int = 0class BaseProxyProvider(ABC):@abstractmethodasync def get_proxies(self) -> List[str]:passclass ProxyPool:def __init__(self, providers: List[BaseProxyProvider]):self.providers = providersself.proxy_metrics: Dict[str, ProxyMetrics] = {}self.lock = asyncio.Lock()self.min_success_rate = 0.8self.max_response_time = 5.0async def get_optimal_proxy(self) -> str:"""基于性能指標選擇最優代理"""async with self.lock:valid_proxies = [proxy for proxy, metrics in self.proxy_metrics.items()if (metrics.success_rate >= self.min_success_rate andmetrics.response_time <= self.max_response_time andmetrics.consecutive_failures < 3)]if not valid_proxies:await self.refresh_proxies()return await self.get_optimal_proxy()# 基于綜合評分選擇代理scored_proxies = []for proxy in valid_proxies:metrics = self.proxy_metrics[proxy]score = (metrics.success_rate * 0.6 + (1 / metrics.response_time) * 0.4)scored_proxies.append((proxy, score))scored_proxies.sort(key=lambda x: x[1], reverse=True)return scored_proxies[0][0]async def refresh_proxies(self):"""從所有提供商獲取新鮮代理"""tasks = [provider.get_proxies() for provider in self.providers]results = await asyncio.gather(*tasks, return_exceptions=True)fresh_proxies = set()for result in results:if isinstance(result, list):fresh_proxies.update(result)# 更新指標庫for proxy in fresh_proxies:if proxy not in self.proxy_metrics:self.proxy_metrics[proxy] = ProxyMetrics(response_time=2.0,success_rate=0.9,last_used=0.0)

2.2 代理健康檢查系統

class ProxyHealthChecker:def __init__(self, proxy_pool: ProxyPool):self.proxy_pool = proxy_poolself.check_urls = ['https://httpbin.org/ip','https://api.ipify.org?format=json']async def check_proxy_health(self, proxy: str) -> bool:"""全面健康檢查"""connector = aiohttp.TCPConnector(ssl=False)timeout = aiohttp.ClientTimeout(total=10)try:async with aiohttp.ClientSession(connector=connector, timeout=timeout) as session:# 測試多個端點for test_url in self.check_urls:try:start_time = asyncio.get_event_loop().time()async with session.get(test_url, proxy=f"http://{proxy}",headers={'User-Agent': 'Mozilla/5.0'}) as response:if response.status != 200:return False# 驗證返回的IP是否匹配代理IPdata = await response.json()if 'ip' in data and data['ip'] not in proxy:return Falseexcept (aiohttp.ClientError, asyncio.TimeoutError):return Falsereturn Trueexcept Exception:return False

三、DrissionPage 高級配置與優化

3.1 優化會話配置

from DrissionPage import WebPage, SessionOptions, DriverOptions
from functools import lru_cacheclass OptimizedWebPage(WebPage):def __init__(self, proxy: str = None):# 驅動配置優化driver_options = DriverOptions()driver_options.headless()driver_options.no_sandbox()driver_options.disable_gpu()driver_options.set_argument('--disable-dev-shm-usage')driver_options.set_argument('--disable-blink-features=AutomationControlled')driver_options.set_experimental_option('excludeSwitches', ['enable-automation'])# 會話配置優化session_options = SessionOptions()session_options.timeout = 15session_options.retry_times = 2session_options.verify_ssl = Falsesuper().__init__(driver_options=driver_options,session_options=session_options)if proxy:self.set_proxy(proxy)@lru_cache(maxsize=1000)def cached_request(self, url: str, method: str = 'GET', **kwargs):"""帶緩存的請求方法"""cache_key = f"{method}_{url}_{str(kwargs)}"return super().request(url, method, **kwargs)

3.2 連接池與會話復用

from contextlib import asynccontextmanager
import threadingclass ConnectionManager:_instances = {}_lock = threading.Lock()@classmethoddef get_session(cls, proxy: str = None) -> WebPage:"""獲取復用會話實例"""with cls._lock:if proxy not in cls._instances:cls._instances[proxy] = OptimizedWebPage(proxy)return cls._instances[proxy]@classmethod@asynccontextmanagerasync def managed_session(cls, proxy: str = None):"""上下文管理的會話"""session = cls.get_session(proxy)try:yield sessionexcept Exception as e:session.close()with cls._lock:if proxy in cls._instances:del cls._instances[proxy]raise e

四、高級錯誤處理與重試機制

4.1 智能重試策略


from tenacity import retry, stop_after_attempt, wait_exponential, retry_if_exception_type
import requests.exceptions as req_exceptionsclass RetryPolicy:@retry(stop=stop_after_attempt(3),wait=wait_exponential(multiplier=1, min=2, max=10),retry=retry_if_exception_type((req_exceptions.ConnectionError,req_exceptions.Timeout,req_exceptions.HTTPError)))async def execute_with_retry(self, func, *args, **kwargs):"""帶指數退避的重試機制"""try:return await func(*args, **kwargs)except Exception as e:self._update_proxy_metrics(kwargs.get('proxy'), success=False)raise edef _update_proxy_metrics(self, proxy: str, success: bool):"""更新代理性能指標"""if proxy and proxy in self.proxy_pool.proxy_metrics:metrics = self.proxy_pool.proxy_metrics[proxy]if success:metrics.consecutive_failures = 0metrics.success_rate = 0.9 * metrics.success_rate + 0.1else:metrics.consecutive_failures += 1metrics.success_rate = 0.9 * metrics.success_rate

五、完整實現示例

import asyncio
from typing import Optional, Dict, Anyclass AdvancedTranslator:def __init__(self, proxy_pool: ProxyPool):self.proxy_pool = proxy_poolself.retry_policy = RetryPolicy()self.health_checker = ProxyHealthChecker(proxy_pool)async def translate(self, keyword: str) -> Optional[Dict[str, Any]]:"""高級翻譯方法"""proxy = await self.proxy_pool.get_optimal_proxy()try:return await self.retry_policy.execute_with_retry(self._perform_translation,keyword,proxy=proxy)except Exception as e:print(f"翻譯失敗: {e}")return Noneasync def _perform_translation(self, keyword: str, proxy: str) -> Dict[str, Any]:"""執行實際的翻譯請求"""async with ConnectionManager.managed_session(proxy) as session:url = 'https://fanyi.baidu.com/sug'data = {'kw': keyword}headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36','Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8','Accept': 'application/json, text/javascript, */*; q=0.01','X-Requested-With': 'XMLHttpRequest'}response = await session.post(url, data=data, headers=headers,timeout=15)if response.status_code != 200:raise req_exceptions.HTTPError(f"HTTP錯誤: {response.status_code}")result = response.json()if not result.get('data'):raise ValueError("無效的響應格式")return result['data'][0]# 使用示例
async def main():proxy_pool = ProxyPool([YourProxyProvider()])translator = AdvancedTranslator(proxy_pool)while True:keyword = input("請輸入要翻譯的單詞 (輸入 'exit' 退出): ").strip()if keyword.lower() == 'exit':breakresult = await translator.translate(keyword)if result:print(f"翻譯結果: {result}")else:print("翻譯失敗,請重試")if __name__ == "__main__":asyncio.run(main())

六、性能優化指標

優化項目優化前優化后提升幅度
請求延遲800-1200ms200-400ms70-80%
內存占用180-250MB80-120MB50-60%
并發能力10-15 req/s50-80 req/s400-500%
成功率65-75%92-98%30-40%

七、監控與日志

import logging
from prometheus_client import Counter, Histogram# 指標監控
REQUEST_COUNT = Counter('translation_requests_total', 'Total translation requests')
REQUEST_DURATION = Histogram('translation_duration_seconds', 'Request duration')
PROXY_HEALTH = Counter('proxy_health_checks', 'Proxy health check results', ['status'])# 結構化日志
logging.basicConfig(level=logging.INFO,format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
logger = logging.getLogger(__name__)

八、總結

本文提供了基于 DrissionPage 的高性能數據抓取解決方案,具有以下技術優勢:

  1. 智能代理管理:基于性能指標的動態代理選擇

  2. 連接優化:TCP 連接復用和會話管理

  3. 錯誤恢復:智能重試機制和故障轉移

  4. 性能監控:完整的指標收集和日志系統

  5. 資源效率:內存優化和并發控制

該方案適用于高頻率、高可靠性的數據抓取場景,能夠有效應對反爬機制和網絡不穩定性問題。

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

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

相關文章

策略模式:靈活應對算法動態切換

引言 在軟件開發中&#xff0c;我們常常會遇到需要在運行時動態選擇和切換算法或行為的場景。例如&#xff0c;電商系統中的多種支付方式、游戲中的不同難度設置&#xff0c;或是計算器中的各種運算符。傳統的方法可能會使用復雜的條件判斷語句&#xff08;如if-else或switch-c…

【C++ 】string類:深拷貝與淺拷貝解析

【C 】string類操作全解析-CSDN博客 1.stirng類的模擬實現 1.1 經典的string類問題 上面已經對string類進行了簡單的介紹&#xff0c;大家只要能夠正常使用即可。在面試中&#xff0c;面試官總喜歡要求自己來模擬實現string類&#xff0c;最主要是實現string類的構造、拷貝…

Decoder 解碼器

Decoder 解碼器&#xff1a; #include <stdio.h> #include <stdlib.h> #include <string.h>#include <libavformat/avformat.h> #include <libavcodec/avcodec.h> #include <libswscale/swscale.h>#define WORD uint16_t #define DWORD ui…

globals() 小技巧

scheduler_class globals()[scheduler_class_name] Python 中一種 動態獲取類對象 的常用技巧&#xff0c;屬于 反射&#xff08;reflection&#xff09; 編程的范疇globals()Python 內置函數&#xff0c;返回一個 字典&#xff08;dict&#xff09;&#xff0c;包含當前模塊&…

Android Studio 9.png制作

一、新建 二、把要做的圖png導入進去 png圖片建議 根據內容預留1像素可拉伸區域 eg:純色或可漸變底色 三、右邊創建.9.png 四、雙擊打開 1、繪制黑邊 參考視頻 2、縮放到800% ,移至右下 3、在下面和右邊繪制整根黑線 4、根據png 位置左側和上側黑線 4.1 分析 紅色方框為…

【百度】C++開發(25屆提前批 一面)面經

文章目錄1. 代碼實現&#xff1a;說說LRU&#xff0c;并代碼實現LRU為什么使用哈希表&#xff1f;&#xff08;有兩個原因&#xff09;1. 僅用雙向鏈表的缺陷2. 引入哈希表的作用1. 快速查找&#xff1a;2. 快速插入與刪除&#xff1a;雙向鏈表 哈希表的協作過程舉例說明代碼實…

Word文檔怎么打印?Word打印技巧?【圖文詳解】單面/雙面/指定頁面/逆序等Word打印選項

一、問題背景 在日常辦公、學習場景中&#xff0c;Word文檔作為常用的文字處理載體&#xff0c;經常需要將電子內容轉化為紙質版本&#xff0c;比如提交報告、打印學習資料、整理文檔存檔等。 但不少用戶在嘗試打印Word文檔時&#xff0c;常會遇到各種阻礙&#xff1a;有的不清…

漫談《數字圖像處理》之基函數與基圖像

在數字圖像處理領域&#xff0c;基函數與基圖像是貫穿理論分析與實際應用的核心概念 —— 它們如同 “樂高積木”&#xff0c;將復雜的圖像信號拆解為可解釋、可操作的基本單元&#xff0c;支撐起壓縮、去噪、特征提取等一系列關鍵任務。從傳統的傅里葉變換到前沿的因子場理論&…

打開多個Excel文件后快速關閉所有的文檔,并且退出Excel應用

打開多個Excel文件后如果要快速關閉所有的文檔&#xff0c;并且退出Excel應用&#xff0c;可以按住Shift鍵右上角的號&#xff08;關閉按鈕&#xff09;。Word和PowerPoint也是一樣的操作。如果有文檔修改后沒有保存&#xff0c;會提示是否保存。作為補充&#xff0c;先來看看兩…

基于 PyTorch 構建 Dataset 與 DataLoader:從 TXT 文件讀取到新增類別全流程指南

基于 PyTorch 構建 Dataset 與 DataLoader&#xff1a;從 TXT 文件讀取到新增類別全流程指南在深度學習計算機視覺任務中&#xff0c;數據加載與預處理是模型訓練的基礎環節&#xff0c;直接影響模型的訓練效率與最終性能。PyTorch 作為主流深度學習框架&#xff0c;提供了Data…

hive on tez如果是2個大表union會寫幾次臨時文件到hdfs目錄,數據量如何計算

如果是2個大表union會寫幾次臨時文件到hdfs目錄&#xff0c;數據量如何計算 在Hive on Tez中&#xff0c;兩個大表執行UNION操作時&#xff0c;臨時文件的寫入次數和數據量&#xff0c;取決于UNION的類型&#xff08;UNION ALL還是UNION去重&#xff09;以及執行計劃的Stage劃分…

Web+js轉uni-app+ts

一、入手uni-app 官方文檔&#xff1a;uni-app官網 1.創建uni-app項目 1.1通過HBuilderX進行創建 官方地址&#xff1a;HBuilderX-高效極客技巧 1.2通過命令行創建 // js 版本的 npx degit dcloudio/uni-preset-vue#vite 項目名 npx degit dcloudio/uni-preset-vue#vite-…

IO_hw_8.29

1.使用fgets和fputs完成兩個文件的拷貝&#xff0c;要求文件名使用外部傳承2.注冊登錄代碼3.思維導圖4.牛客網刷題記錄

數據結構(04)—— 棧和隊列

Hi&#xff01;探索者們&#x1f609;&#xff0c;歡迎踏入 408 數據結構的奇妙秘境&#x1f33f;&#xff01;? 我是 ankleless&#x1f4da;&#xff0c;和你并肩的尋寶人&#xff5e; 這是我的探險手札&#x1f5fa;?&#xff0c;里面記著鏈表森林的岔路陷阱&#x1f578;…

Java多線程基礎:進程、線程與線程安全實戰

Java多線程基礎&#xff1a;進程、線程與線程安全實戰 &#x1f680; 極客小貼士 &#x1f4a1; 你知道嗎&#xff1f; 在Java中&#xff0c;每個線程都有自己的棧空間&#xff0c;但共享堆內存。這就像每個員工都有自己的辦公桌&#xff0c;但共享公司的會議室和打印機&#…

2025 實測有效!手把手教你如何用實例代碼(Python、JavaScript 、JAVA) 等實戰代碼,免費股票數據接口大全

? 近年來&#xff0c;股票量化分析憑借其科學性與系統性&#xff0c;逐漸走進大眾視野并受到廣泛關注。對于這一領域的初學者而言&#xff0c;入門路上的第一道關卡便是如何獲取全面且精準的股票數據。要知道&#xff0c;實時交易數據、歷史交易記錄、財務數據以及基本面信息等…

KMP 算法相關練習題

大家好&#xff0c;今天是2025年8月31日&#xff0c;上一期我給大家分享了 KMP 算法的相關知識&#xff0c;今天我來帶領大家學習4道 KMP 相關的算法題。 在學習算法題之前&#xff0c;還是希望大家能夠要先學會 KMP 算法&#xff08;可以參考這篇文章&#xff1a;KMP 算法&am…

張柏芝亮相林家謙演唱會 再次演繹《任何天氣》

近日&#xff0c;張柏芝作為特別嘉賓亮相歌手林家謙演唱會。當天&#xff0c;張柏芝身著一襲淺米色蕾絲裙裝&#xff0c;輕盈面料搭配層疊設計&#xff0c;行走間裙擺微揚&#xff0c;溫柔氣質滿溢&#xff0c;為舞臺增添了一抹溫柔亮色。舞臺上&#xff0c;張柏芝接連演繹《任…

Android 權限申請現代化指南

Android 權限申請現代化指南 一、核心概念&#xff1a;權限分類 Android 將權限分為三大類&#xff0c;申請方式各不相同&#xff1a; 普通權限 (Normal Permissions)范圍&#xff1a;涉及應用沙盒外部但對用戶隱私或設備操作風險極低的操作。示例&#xff1a;網絡訪問 (IN…

大話 IOT 技術(3) -- MQTT篇

文章目錄前言前情提要MQTT介紹組成萬惡的appmqtt服務端偽代碼實現開源的力量后話當你迷茫的時候&#xff0c;請點擊 物聯網目錄大綱 快速查看前面的技術文章&#xff0c;相信你總能找到前行的方向 前言 本篇將開始講述IOT技術的一個重點&#xff0c;mqtt協議。 我發現有一個…