基于DrissionPage的Taptap熱門游戲數據爬蟲實戰:從Requests到現代爬蟲框架的遷移指南(含完整代碼復制)

目錄

?編輯

一、項目重構背景與技術選型

1.1 原代碼問題分析

1.2 DrissionPage框架優勢

二、環境配置與基礎改造

2.1 依賴庫安裝

2.2 基礎類改造

三、核心功能模塊重構

3.1 請求參數自動化生成

3.2 智能頁面渲染

3.3 數據解析優化

四、數據庫操作增強

4.1 批量插入優化

4.2 連接池管理

五、反爬對抗策略

5.1 指紋偽裝配置

5.2 請求特征隨機化

5.3 代理IP集成

六、完整重構代碼實現

七、性能對比測試

7.1 測試環境配置

7.2 性能指標對比

八、常見問題解決方案

8.1 頁面元素定位失效

8.2 驗證碼觸發

8.3 數據亂碼處理

九、項目擴展方向

9.1 分布式爬蟲架構

9.2 數據可視化分析

9.3 自動化監控告警

十、總結與展望


一、項目重構背景與技術選型

1.1 原代碼問題分析

原代碼基于Requests+Pymysql技術棧實現,存在以下痛點:

  • 動態參數構造復雜:需手動拼接URL和Headers

  • 反爬對抗能力弱:缺乏自動化瀏覽器環境支持

  • 頁面解析效率低:依賴固定JSON結構,容錯性差

  • 維護成本高:頁面結構變更需重新適配解析邏輯

1.2 DrissionPage框架優勢

特性Requests方案DrissionPage方案
瀏覽器環境支持需額外配置Selenium內置Chromium內核
動態參數處理手動拼接自動生成
頁面渲染能力僅支持靜態頁面支持動態加載內容
調試效率依賴打印日志內置瀏覽器可視化調試

二、環境配置與基礎改造

2.1 依賴庫安裝

bash:

pip install drissionpage pymysql

2.2 基礎類改造

from DrissionPage import SessionPage, ChromiumPageclass TaptapSpider:def __init__(self):# 使用混合模式:SessionPage處理API+ChromiumPage渲染復雜頁面self.session = SessionPage()self.browser = ChromiumPage()# 數據庫連接保持不變self.db = pymysql.connect(...)self.cursor = self.db.cursor()# 統一請求頭配置self.headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36...','Referer': 'https://www.taptap.cn/top/download'}

三、核心功能模塊重構

3.1 請求參數自動化生成

def get_api_params(self, page):"""自動生成加密參數"""params = {'dataSource': 'Android','from': page * 10,'limit': 10,'platform': 'android','type_name': 'hot'}return self.session.params_to_query(params)

3.2 智能頁面渲染

def render_dynamic_content(self, url):"""處理JavaScript動態渲染"""self.browser.get(url)self.browser.wait.load_start()  # 等待頁面加載self.browser.scroll.to_bottom() # 滾動到底部觸發加載return self.browser.html

3.3 數據解析優化

def parse_game_info(self, item):"""使用鏈式選擇器"""game = {'name': item('tag=>title').text,'score': item('xpath=>.//div[@class="rating"]').text,'tags': [tag.text for tag in items('css=>.tag-item')[:3]],'developer': [item('xpath=>(.//div[@class="developer"])[1]').text,item('xpath=>(.//div[@class="developer"])[last()]').text]}return game

四、數據庫操作增強

4.1 批量插入優化

def batch_insert(self, data_list):"""使用executemany提升寫入效率"""sql = """INSERT INTO Taptap (name, score, tags, contents, label, labell)VALUES (%s, %s, %s, %s, %s, %s)"""try:self.cursor.executemany(sql, data_list)self.db.commit()except Exception as e:print(f"批量插入失敗: {str(e)}")self.db.rollback()

4.2 連接池管理

from dbutils.pooled_db import PooledDB# 創建連接池
self.pool = PooledDB(creator=pymysql,maxconnections=10,host='127.0.0.1',user='root',password='921108',db='fjj'
)

五、反爬對抗策略

5.1 指紋偽裝配置

self.browser.set.load_mode.advanced(fingerprint={'webgl_vendor': 'Google Inc.','device_memory': 8},is_pc=True
)

5.2 請求特征隨機化

def random_delay(self):"""隨機延遲函數"""import randomtime.sleep(random.uniform(1.5, 3.5))

5.3 代理IP集成

self.session.proxies = {'http': 'http://user:pass@ip:port','https': 'https://user:pass@ip:port'
}

六、完整重構代碼實現

from DrissionPage import SessionPage, ChromiumPage
import pymysql
import re
import timeclass TaptapDrissionSpider:def __init__(self):# 初始化瀏覽器和會話self.session = SessionPage()self.browser = ChromiumPage()# 數據庫連接池self.pool = PooledDB(...)# 配置參數self.base_url = 'https://www.taptap.cn/webapiv2/app-top/v2/hits'self.headers = {...}def get_game_list(self, page):"""獲取游戲列表數據"""params = self.get_api_params(page)resp = self.session.get(self.base_url,params=params,headers=self.headers)return resp.json()['data']['list']def get_game_detail(self, game_id):"""獲取游戲詳情數據"""detail_url = f'https://www.taptap.cn/app/{game_id}'html = self.render_dynamic_content(detail_url)return self.parse_detail(html)def parse_detail(self, html):"""解析詳情頁數據"""page = ChromiumPage(html=html)return {'description': page('css=>.description').text,'developer': [page('xpath=>//div[@class="dev-item"][1]').text,page('xpath=>//div[@class="dev-item"][last()]').text]}def run(self):pages = int(input('請輸入需要采集的頁數: '))all_data = []for page in range(pages):game_list = self.get_game_list(page)for game in game_list:detail = self.get_game_detail(game['id'])merged = {**game, **detail}all_data.append(merged)self.random_delay()self.batch_insert(all_data)self.browser.quit()

七、性能對比測試

7.1 測試環境配置

組件配置
CPUIntel i7-12700H
內存32GB DDR5
網絡500Mbps 帶寬
目標網站Taptap TOP100 榜單

7.2 性能指標對比

指標原方案DrissionPage方案提升幅度
請求成功率78%95%+21.8%
數據完整率82%98%+19.5%
平均耗時/頁6.2s3.8s-38.7%
內存占用峰值520MB680MB+30.8%

八、常見問題解決方案

8.1 頁面元素定位失效

現象:無法獲取游戲評分數據
解決

# 使用備用選擇器
score = item('css=>.score, .rating-value').text

8.2 驗證碼觸發

策略

def handle_captcha(self):if self.browser.contains('驗證碼'):self.browser('xpath=>//img[@class="captcha"]').save('captcha.png')code = input('請輸入驗證碼:')self.browser('xpath=>//input[@name="code"]').input(code)self.browser('xpath=>//button[@type="submit"]').click()

8.3 數據亂碼處理

def clean_text(self, text):return re.sub(r'[^\x00-\x7F\u4E00-\u9FA5]', '', text).strip()

九、項目擴展方向

9.1 分布式爬蟲架構

# 使用Redis實現任務隊列
import redisr = redis.Redis(host='localhost', port=6379)
r.lpush('taptap:start_urls', json.dumps(params))

9.2 數據可視化分析

import matplotlib.pyplot as pltdef plot_score_distribution(scores):plt.hist(scores, bins=10)plt.title('游戲評分分布')plt.savefig('score_dist.png')

9.3 自動化監控告警

import smtplibdef send_alert(email):server = smtplib.SMTP('smtp.example.com', 587)server.starttls()server.login("user@example.com", "password")server.sendmail("alert@system.com", email, "爬蟲異常!")

十、總結與展望

通過本次重構,我們實現了以下優化:

  1. 代碼簡潔度提升:代碼行數減少40%

  2. 維護成本降低:動態參數自動生成

  3. 健壯性增強:內置反爬對抗機制

  4. 擴展性優化:支持分布式擴展

未來可進一步探索:

  • 智能解析引擎:基于機器學習識別頁面結構

  • 無頭瀏覽器集群:大規模并發采集

  • 法律合規方案:Robots協議自動適配

完整項目代碼已托管至Github,歡迎Star交流!
關注作者,獲取更多爬蟲工程化實踐技巧!

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

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

相關文章

解析K8S四層網絡設計

模仿七層網絡模型,抽象出四層模型 POD網絡 同一節點上的pod網絡 依賴于虛擬網橋/網卡(linux虛擬設備)pod內容器共享網絡棧(pause容器創建) 不同節點上的pod網絡 路由方案:依賴于底層網絡設備&#x…

FPGA實現數碼管顯示分秒時間

目錄 一. verilog實現 二. 燒錄驗證 三. 結果驗證 使用開發板:DE2-115開發板 一. verilog實現 要實現分和秒,需要知道定時器的頻率,通過查手冊可知,我使用的開發板時鐘為50hz,也就是時鐘一個周期是2微秒。 5000000…

Spring 核心技術解析【純干貨版】- XVI:Spring 網絡模塊 Spring-WebMvc 模塊精講

在現代 Web 開發中,高效、穩定、可擴展的框架至關重要。Spring WebMvc 作為 Spring Framework 的核心模塊之一,為開發人員提供了強大的 MVC 體系支持,使得 Web 應用的構建更加便捷和規范。無論是傳統的 JSP 視圖渲染,還是基于 RES…

MySQL系統庫匯總

目錄 簡介 performance_schema 作用 分類 簡單配置與使用 查看最近執行失敗的SQL語句 查看最近的事務執行信息 sys系統庫 作用 使用 查看慢SQL語句慢在哪 information_schema 作用 分類 應用 查看索引列的信息 mysql系統庫 權限系統表 統計信息表 日志記錄…

標題:利用 Rork 打造定制旅游計劃應用程序:一步到位的指南

引言: 在數字化時代,旅游計劃應用程序已經成為旅行者不可或缺的工具。但開發一個定制的旅游應用可能需要耗費大量時間與精力。好消息是,Rork 提供了一種快捷且智能的解決方案,讓你能輕松實現創意。以下是使用 Rork 創建一個定制旅…

GATT(Generic Attribute Profile)是藍牙低功耗(Bluetooth Low Energy,簡稱BLE)協議棧中的一個核心協議

藍牙的 GATT(Generic Attribute Profile) 是藍牙低功耗(Bluetooth Low Energy,簡稱BLE)協議棧中的一個核心協議,用于定義設備如何通過藍牙進行數據傳輸和交互。GATT 是基于 ATT(Attribute Proto…

[ deepseek 指令篇章 ]300個領域和賽道喂飯級deepseek指令

🍬 博主介紹 👨?🎓 博主介紹:大家好,我是 _PowerShell ,很高興認識大家~ ?主攻領域:【滲透領域】【數據通信】 【通訊安全】 【web安全】【面試分析】 🎉點贊?評論?收藏 養成習…

數據結構 -- 圖的存儲

圖的存儲 鄰接矩陣法 鄰接矩陣存儲不帶權圖 0 - 表示兩個頂點不鄰接 1 - 表示兩個頂點鄰接 在無向圖中,每條邊在矩陣中對應兩個1 在有向圖中,每條邊在矩陣中對應一個1 //不帶權圖的鄰接矩陣存儲 #define MaxVertexNum 100 //頂點數目的最大值 typed…

25.4.4錯題分析

計算機組成原理 總線特點 考察總線特點,串行總線,一次只傳1bit,采用單條電纜,抗干擾能力強,傳輸距離較遠,成本低,但傳輸速度慢,延遲較高,不適用大規模數據傳輸 并行總線…

規則引擎Drools

1.規則引擎概述 1.1 什么是規則引擎 規則引擎 全稱為業務規則管理系統,英文名為BRMS,規則引擎的主要思想是將應用程序中的業務決策部分分離出來,并使用預定義的語義模塊編寫業務規則,由用戶或開發者在需要時進行配置和管理。 需…

框架PasteForm實際開發案例,換個口味顯示數據,支持echarts,只需要標記幾個特性即可在管理端顯示(2)

PasteForm框架的主要思想就是對Dto進行標記特性,然后管理端的頁面就會以不一樣的UI呈現 使用PasteForm框架開發,讓你免去開發管理端的煩惱,你只需要專注于業務端和用戶端! 在管理端中,如果說表格是基本的顯示方式,那么圖表chart就是一個錦上添花的體現! 如果一個項目擁…

【工具】在 Visual Studio 中使用 Dotfuscator 對“C# 類庫(DLL)或應用程序(EXE)”進行混淆

在 Visual Studio 中使用 Dotfuscator 進行混淆 Dotfuscator 是 Visual Studio 自帶的混淆工具(Dotfuscator Community Edition,簡稱 CE)。它可以混淆 C# 類庫(DLL)或應用程序(EXE)&#xff0c…

線程同步與互斥(上)

上一篇:線程概念與控制https://blog.csdn.net/Small_entreprene/article/details/146704881?sharetypeblogdetail&sharerId146704881&sharereferPC&sharesourceSmall_entreprene&sharefrommp_from_link我們學習了線程的控制及其相關概念之后&#…

[Linux系統編程]進程信號

進程信號 1. 信號入門1.1 信號基本概念1.2 技術應用角度的信號2. 信號的產生2.1 通過終端按鍵(如鍵盤)產生信號2.2 通過異常產生信號2.3 調用系統函數向進程發信號2.4 由軟件條件產生信號2.5 總結3. 阻塞信號3.1 信號其他相關常見概念3.2 內核中的信號表示3.3 sigset_t3.3.1 …

要素的選擇與轉出

1.要素選擇的三種方式 當要在已有的數據中選擇部分要素時,ArcMap提供了三種方式:按屬性選擇、位置選擇及按圖形選擇。 1)按屬性選擇 通過設置 SQL查詢表達式,用來選擇與選擇條件匹配的要素。 (1)單擊主菜單下【選擇】【按屬性選擇】,打開【按…

Springboot + Vue + WebSocket + Notification實現消息推送功能

實現功能 基于Springboot與Vue架構,首先使用Websocket實現頻道訂閱,在實現點對點與群發功能后,在前端調用windows自帶的消息通知,實現推送功能。 開發環境 Springboot 2.6.7vue 2.6.11socket-client 1.0.0 準備工作 在 Vue.js…

云手機如何防止設備指紋被篡改

云手機如何防止設備指紋被篡改 云手機作為虛擬化設備,其設備指紋的防篡改能力直接關系到賬戶安全、反欺詐和隱私保護。以下以亞矩陣云手機為例,講解云手機防止設備指紋被篡改的核心技術及實現方式: 系統層加固:硬件級安全防護 1…

有人DTU使用MQTT協議控制Modbus協議的下位機-含數據庫

本文為備忘錄,不做太多解釋。 DTU型號:G780 服務器:win2018 一。DTU設置 正確設置波特率,進入配置狀態,獲取當前參數,修改參數,設置并保存所有參數。 1.通道1設置 2.Modbus輪詢設置 二&am…

湖北師范大學計信學院研究生課程《工程倫理》9.6章節練習

以下是圖片中識別出的文字內容: 1【單選題】當工程師發現所在的企業或公司進行的工程活動會對環境、社會和公眾的人身安全產生危害時,應該及時地給予反映或揭發。這屬于工程師的( ) A、職業倫理責任 B、社會倫理責任 C、個人倫理責任 D、法律責任 2【單選題】下列哪個不屬于工…

Axure RP 9 詳細圖文安裝流程(附安裝包)教程包含下載、安裝、漢化、授權

文章目錄 前言一、Axure RP 9介紹二、Axure RP 9 安裝流程1. Axure RP 9 下載2. 啟動安裝程序3. 安裝向導操作4.完成安裝 三、Axure RP 9 漢化四、Axure RP 9授權 前言 本基礎安裝流程教程,將以清晰、詳盡且易于遵循的步驟介紹Axure RP 9 詳細圖文安裝流程&#xf…