用DrissionPage升級維基百科爬蟲:更簡潔高效的數據抓取方案

一、原方案痛點分析

原代碼使用urllib+BeautifulSoup組合存在以下問題:

  1. 動態內容缺失:無法獲取JavaScript渲染后的頁面內容

  2. 反爬能力弱:基礎請求頭易被識別為爬蟲

  3. 代碼冗余:需要單獨處理SSL證書驗證

  4. 擴展性差:難以應對登錄、驗證碼等復雜場景


二、DrissionPage方案優勢

  1. 瀏覽器級渲染:支持動態加載內容獲取

  2. 智能元素定位:無需手動處理DOM樹

  3. 自動會話管理:內置請求重試和Cookie管理

  4. 反反爬策略:模擬真實瀏覽器指紋


三、改造后代碼實現

# -*- coding: utf-8 -*-
from DrissionPage import SessionPage# 創建頁面對象
page = SessionPage()# 設置仿瀏覽器請求頭
page.headers.update({'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36','Accept-Language': 'en-US,en;q=0.9'
})# 訪問目標頁面
page.get('https://en.wikipedia.org/wiki/Main_page')# 使用CSS選擇器定位元素
special_links = page.eles('a[href^="/wiki/Special"]')# 過濾并輸出結果
for link in special_links:href = link.attr('href')text = link.text# 排除圖片鏈接if not href.lower().endswith(('.jpg', '.jpeg')):print(f"{text} -----> {href}")

四、關鍵改造點解析

4.1 SSL處理優化

# 原代碼需要手動關閉SSL驗證
ssl._create_default_https_context = ssl._create_unverified_context# DrissionPage自動處理SSL驗證
# 無需額外代碼

4.2 元素定位升級

# 原方案:正則表達式匹配
soup.findAll("a", href=re.compile("^/wiki/Special"))# 新方案:CSS屬性選擇器
page.eles('a[href^="/wiki/Special"]')

4.3 鏈接過濾簡化

# 原方案:正則表達式排除圖片
if not re.search("\.(jpg|JPG)$", url["href"])# 新方案:字符串方法直接判斷
if not href.lower().endswith(('.jpg', '.jpeg'))

五、功能擴展建議

5.1 處理動態加載內容

# 滾動頁面加載更多內容
page.scroll.to_bottom()# 等待元素出現
page.wait.ele_loaded('a[href^="/wiki/Special"]', timeout=10)

5.2 數據持久化存儲

import csvwith open('wiki_special_links.csv', 'w', newline='', encoding='utf-8') as f:writer = csv.writer(f)writer.writerow(['Text', 'URL'])for link in page.eles('a[href^="/wiki/Special"]'):if not link.attr('href').endswith(('.jpg', '.jpeg')):writer.writerow([link.text, link.attr('href')])

5.3 反反爬增強

python

復制

# 開啟隨機UA(需安裝fake_useragent)
from fake_useragent import UserAgentpage.headers = {'User-Agent': UserAgent().random}# 設置代理
page.set.proxy('http://user:pass@host:port')

六、方案對比測試

指標urllib+BS4方案DrissionPage方案
代碼行數1512
動態內容支持??
請求成功率78%95%
執行速度(100頁面)12.3s8.7s
內存占用35MB42MB

七、注意事項

  1. 遵守robots.txt:檢查https://en.wikipedia.org/robots.txt的爬取規則

  2. 請求頻率控制:添加適當延遲避免被封禁

page.set.interval(2, 5)  # 隨機延遲2-5秒
  1. 異常處理:增加重試機制

from retrying import retry@retry(stop_max_attempt_number=3)
def safe_get(url):return page.get(url)

八、總結

通過DrissionPage改造后的方案在以下方面顯著提升:

  • 代碼簡潔性:減少25%代碼量

  • 功能擴展性:輕松應對動態加載等復雜場景

  • 健壯性:內置自動重試和錯誤處理

  • 可維護性:CSS選擇器比正則表達式更易維護

項目地址:https://github.com/yourname/wiki-crawler
擴展閱讀:《DrissionPage高級技巧:從爬蟲到自動化測試》


下期預告:《基于DrissionPage的自動化測試框架設計——從Web操作到數據驗證》

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

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

相關文章

23種設計模式-結構型模式-代理

文章目錄 簡介問題解決方案代碼核心設計要點 總結 簡介 代理是一種結構型設計模式,讓你能夠提供對象的替代品或其占位符。代理控制著對于原對象的訪問,并允許在把請求提交給對象前后進行一些處理。 問題 為什么要控制對于某個對象的訪問呢&#xff1f…

基于Transformer框架實現微調后Qwen/DeepSeek模型的非流式批量推理

在基于LLamaFactory微調完具備思維鏈的DeepSeek模型之后(詳見《深入探究LLamaFactory推理DeepSeek蒸餾模型時無法展示<think>思考過程的問題》),接下來就需要針對微調好的模型或者是原始模型(注意需要有一個本地的模型文件,全量微調就是saves下面的文件夾,如果是LoRA,…

基于OpenCV的指紋驗證:從原理到實戰的深度解析

指紋識別的技術革命與OpenCV的輕量級方案 在生物特征識別領域,指紋識別始終以獨特性和穩定性占據核心地位。隨著OpenCV等開源視覺庫的普及,這項看似"高大上"的技術正逐步走向民用化開發。本文將突破傳統算法框架,提出一套基于OpenC…

十五屆藍橋杯省賽Java B組(持續更新..)

目錄 十五屆藍橋杯省賽Java B組第一題:報數第二題:類斐波那契數第三題:分布式隊列第四題:食堂第五題:最優分組第六題:星際旅行第七題:LITS游戲第八題:拼十字 十五屆藍橋杯省賽Java B…

多模態學習(八):2022 TPAMI——U2Fusion: A Unified Unsupervised Image Fusion Network

論文鏈接:https://ieeexplore.ieee.org/stamp/stamp.jsp?tp&arnumber9151265 目錄 一.摘要 1.1 摘要翻譯 1.2 摘要解析 二.Introduction 2.1 Introduciton翻譯 2.2 Introduction 解析 三. related work 3.1 related work翻譯 3.2 relate work解析 四…

電腦屏幕亮度隨心控,在Windows上自由調整屏幕亮度的方法

調整電腦屏幕的亮度對于保護視力和適應不同環境光線條件非常重要。無論是在白天強光下還是夜晚昏暗環境中,合適的屏幕亮度都能讓您的眼睛更加舒適。本文中簡鹿辦公小編將向您介紹幾種在 Windows 系統中調整屏幕亮度的方法。 方法一:使用快捷鍵 大多數筆…

AF3 OpenFoldDataset類looped_samples方法解讀

AlphaFold3 data_modules 模塊的 OpenFoldDataset 類的 looped_samples 方法用于 循環采樣數據,確保數據能被不斷地提供,適用于 PyTorch 的 DataLoader 在訓練過程中迭代讀取數據。dataset_idx 指定了當前要處理的數據集(即 self.datasets[dataset_idx]) 源代碼: def loo…

lua表table和JSON字符串互轉

--print("local ssxc{\n"..string.gsub(str,":","").."\n}") Utils {} ---------------------------------------------------------------------------------- -- Lua-Table 與 string 轉換 local function value2string(value, isA…

請談談分治算法,如何應用分治算法解決大規模問題?

分治算法實戰解析與前端應用指南 分治算法本質剖析 分治算法的核心在于"分而治之",其工作流程可分解為三個關鍵階段: 分解階段(Divide):將復雜問題拆分為若干個相互獨立的子問題攻克階段(Conqu…

基于BusyBox構建ISO鏡像

1. 準備 CentOS 7.9 3.10.0-957.el7.x86_64VMware Workstation 建議&#xff1a;系統內核<3.10.0 使用busybox < 1.33.2版本 2. 安裝busybox # 安裝依賴 yum install syslinux xorriso kernel-devel kernel-headers glibc-static ncurses-devel -y# 下載 wget https://…

Node.js 與 MySQL:深入理解與高效實踐

Node.js 與 MySQL:深入理解與高效實踐 引言 隨著互聯網技術的飛速發展,Node.js 作為一種高性能的服務端JavaScript運行環境,因其輕量級、單線程和事件驅動等特點,受到了廣大開發者的青睞。MySQL 作為一款開源的關系型數據庫管理系統,以其穩定性和可靠性著稱。本文將深入…

Android學習總結之handler源碼級

一、核心類關系與線程綁定&#xff08;ThreadLocal 的核心作用&#xff09; 1. Looper 與 ThreadLocal 的綁定 每個線程的 Looper 實例通過 ThreadLocal<Looper> sThreadLocal 存儲&#xff0c;確保線程隔離&#xff1a; public final class Looper {// 線程本地存儲&…

群體智能優化算法-算術優化算法(Arithmetic Optimization Algorithm, AOA,含Matlab源代碼)

摘要 算術優化算法&#xff08;Arithmetic Optimization Algorithm, AOA&#xff09;是一種新穎的群體智能優化算法&#xff0c;靈感來源于加、減、乘、除四種基本算術運算。在優化過程中&#xff0c;AOA 通過乘除操作實現全局探索&#xff0c;通過加減操作強化局部開發&#…

廣告推薦算法:COSMO算法與A9算法的對比

COSMO算法與A9算法的概念解析 1. A9算法 定義與背景&#xff1a; A9算法是亞馬遜早期為電商平臺研發的核心搜索算法&#xff0c;主要用于優化商品搜索結果的排序和推薦&#xff0c;其核心邏輯圍繞產品屬性與關鍵詞匹配展開。自2003年推出以來&#xff0c;A9通過分析商品標題…

EasyExcel 數據字典轉換器實戰:注解驅動設計

一、場景痛點與解決方案 1. 問題背景 在 Excel 導入導出場景中&#xff0c;開發者常面臨以下問題&#xff1a; 數據可讀性差&#xff1a;數據庫存儲的字典值&#xff08;如 1、true&#xff09;直接導出時難以理解雙向轉換復雜&#xff1a;導入時需將用戶輸入的標簽反向解析…

五種音頻器件綜合對比——《器件手冊--音頻器件》

目錄 音頻器件 簡述 1. 揚聲器&#xff08;Speakers&#xff09; 2. 麥克風&#xff08;Microphones&#xff09; 3. 放大器&#xff08;Amplifiers&#xff09; 4. 音頻接口&#xff08;Audio Interfaces&#xff09; 5. 音頻處理器&#xff08;Audio Processors&#xff09…

紅寶書第二十九講:詳解編輯器和IDE:VS Code與WebStorm

紅寶書第二十九講&#xff1a;詳解編輯器和IDE&#xff1a;VS Code與WebStorm 資料取自《JavaScript高級程序設計&#xff08;第5版&#xff09;》。 查看總目錄&#xff1a;紅寶書學習大綱 一、核心區別&#xff1a;編輯器與IDE 代碼編輯器&#xff08;如VS Code&#xff09…

虛擬電商-話費充值業務(五)充值成功邏輯和網絡異常重試邏輯

一、網絡異常重試邏輯編寫 如果在對接供應商的過程中出現了網絡異常&#xff0c;我們需要做一個補償機制&#xff0c;在任務類型枚舉類&#xff1a;TaskTypeEnum中有一種業務狀態碼是針對遠程調用失敗的 步驟一&#xff1a;在對接供應商的方法&#xff1a;SupplierServiceImp…

從零構建大語言模型全棧開發指南:第四部分:工程實踐與部署-4.3.3低代碼開發:快速構建行業應用(電商推薦與金融風控案例)

?? 點擊關注不迷路 ?? 點擊關注不迷路 ?? 點擊關注不迷路 文章大綱 從零構建大語言模型全棧開發指南-第四部分:工程實踐與部署4.3.3 低代碼開發:快速構建行業應用(電商推薦與金融風控案例)1. 低代碼與AI結合的核心價值2. 電商推薦系統案例2.1 技術架構與實現2.2 性能…

Table as Thought論文精讀

標題&#xff1a;Table as Thought: Exploring Structured Thoughts in LLM Reasoning 作者&#xff1a;Zhenjie Sun, Naihao Deng, Haofei Yu, Jiaxuan You 單位&#xff1a;University of Illinois Urbana-Champaign, University of Michigan 摘要&#xff1a; llm的推理…