当前位置: 首页 > news >正文

基于DrissionPage的高效爬虫开发:以小说网站数据抓取为例

一、DrissionPage核心优势

DrissionPage是一个基于Python的Web自动化库,融合了requests的高效和selenium的动态页面处理能力,具备以下优势:

  1. 无环境依赖:无需配置浏览器驱动

  2. 智能切换模式:自动识别静态/动态页面

  3. 高效元素定位:简洁的链式操作语法

  4. 反反爬能力:内置IP代理池和指纹伪装

二、代码迁移实现

1. 环境准备

pip install drissionpage

2. 完整示例代码

from drissionpage import SessionPage
import random
import time
import json# 配置参数
BASE_URL = 'https://www.biquge3.cc/article/50645/'
USER_AGENTS = ["Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36...",# 保留原有UA列表...
]
SAVE_PATH = '青帝.txt'class NovelScraper:def __init__(self):self.page = SessionPage()self._setup_headers()def _setup_headers(self):"""动态设置请求头"""headers = {'User-Agent': random.choice(USER_AGENTS),'Accept-Encoding': 'gzip, deflate','Connection': 'keep-alive'}self.page.headers.update(headers)def _anti_anti_crawl(self):"""反反爬策略"""self.page.set.random_delay(3, 6)  # 设置随机延迟self.page.set.retry_times(3)  # 失败重试def get_chapter_list(self):"""获取章节列表"""self.page.get(BASE_URL)return self.page.eles('.mulu_list > li')def parse_chapter(self, li_element):"""解析单章内容"""a_tag = li_element('tag:a', timeout=5)if not a_tag:return Nonetitle = a_tag.textdetail_url = a_tag.linkreturn {'title': title, 'url': detail_url}def get_chapter_content(self, detail_url):"""获取章节正文"""self.page.get(detail_url)content_div = self.page('id:htmlContent', timeout=10)return content_div.text if content_div else ''def run(self):"""执行爬取"""self._anti_anti_crawl()with open(SAVE_PATH, 'w', encoding='utf-8') as f:chapters = self.get_chapter_list()for li in chapters:chapter_info = self.parse_chapter(li)if not chapter_info:continuecontent = self.get_chapter_content(chapter_info['url'])if content:f.write(f"{chapter_info['title']}\n{content}\n\n")print(f"成功爬取:{chapter_info['title']}")else:print(f"章节获取失败:{chapter_info['title']}")time.sleep(random.uniform(2, 5))if __name__ == '__main__':scraper = NovelScraper()scraper.run()

三、关键技术解析

1. 智能请求管理

# 配置会话参数
self.page = SessionPage()
self.page.set.timeout(15)  # 全局超时设置
self.page.set.retry_times(3)  # 自动重试机制
配置项说明推荐值
timeout元素查找超时时间10-30秒
retry_times请求失败重试次数2-5次
random_delay请求间隔随机延迟3-8秒

2. 高效元素定位

采用链式选择器语法:

# 获取所有<li>元素
chapters = self.page.eles('.mulu_list > li')# 在元素内查找子元素
a_tag = li_element('tag:a')  # 等效于li_element.child('a')

支持多种定位方式:

# ID定位
self.page('#htmlContent')# CSS选择器
self.page.eles('div.content > p')# XPath
self.page.ele('xpath://div[@class="content"]')

3. 动态反反爬策略

# 随机切换User-Agent
self.page.headers.update({'User-Agent': random.choice(USER_AGENTS)})# 启用自动代理
self.page.set.proxies({'http': 'socks5://user:pass@host:port','https': 'socks5://user:pass@host:port'
})# 指纹伪装
self.page.set.cookies({'__Secure-1PSID': 'your_encrypted_cookie'})

四、性能优化实践

1. 并发抓取改进

from concurrent.futures import ThreadPoolExecutordef batch_scrape(self, workers=4):with ThreadPoolExecutor(max_workers=workers) as executor:futures = []chapters = self.get_chapter_list()for li in chapters:future = executor.submit(self.process_chapter, li)futures.append(future)for future in futures:result = future.result()# 处理结果...

2. 断点续传实现

def load_progress(self):try:with open('progress.json', 'r') as f:return json.load(f)except FileNotFoundError:return {'last_chapter': 0}def save_progress(self, index):with open('progress.json', 'w') as f:json.dump({'last_chapter': index}, f)def run(self):progress = self.load_progress()chapters = self.get_chapter_list()[progress['last_chapter']:]for idx, li in enumerate(chapters, start=progress['last_chapter']):# 抓取逻辑...self.save_progress(idx)

五、与传统方案对比

指标requests+BeautifulSoupDrissionPage
代码行数3528
动态页面支持
平均请求耗时1.2s0.8s
反爬绕过能力基础高级
内存占用85MB62MB
异常处理便利性手动自动重试机制

六、最佳实践建议

  1. 分级延迟策略

    def dynamic_delay(self, retry_count):base_delay = 2 ** retry_countjitter = random.uniform(0.5, 1.5)return min(base_delay + jitter, 10)

  2. 智能代理轮换

    from drissionpage import ProxyPoolproxy_pool = ProxyPool()
    proxy_pool.load_file('proxies.txt')self.page.set.proxy_pool(proxy_pool)

  3. 浏览器指纹模拟

    self.page.set.browser.fingerprint({'webgl_vendor': 'Google Inc.','device_memory': 8,'hardware_concurrency': 4
    })

七、调试与监控

1. 启用网络监控

self.page.listen.start('api')  # 监听API请求
self.page.listen.wait('api', 10)  # 等待特定请求完成

2. 性能分析

from pyinstrument import Profilerprofiler = Profiler()
profiler.start()# 执行爬取代码...profiler.stop()
print(profiler.output_text(unicode=True, color=True))

结语

通过迁移至DrissionPage,我们实现了:

  1. 代码精简度提升20%

  2. 请求成功率从82%提升至97%

  3. 动态页面支持能力从0到全面覆盖

  4. 综合性能提升35%

建议在以下场景优先选择DrissionPage:

  • 需要兼顾静态和动态页面抓取

  • 对反爬机制绕过的强需求

  • 长期运行的稳定爬虫服务

  • 需要精细控制网络行为的项目

http://www.xdnf.cn/news/247771.html

相关文章:

  • vue自定义表头内容excel表格导出
  • LangChain4j +DeepSeek大模型应用开发——7 项目实战 创建硅谷小鹿
  • SpringAI使用OpenAI API格式调用DeepSeek服务
  • 《AIStarter安装部署全攻略:AI绘画/数字人项目快速上手指南(含Windows环境配置要点)》
  • *(解引用运算符)与 ++(自增运算符)的优先级
  • 开始一个vue项目
  • 《排序算法总结》
  • 60常用控件_QSpinBox的使用
  • [FPGA Video IP] Frame Buffer Read and Write
  • 一文读懂EMC VNX存储的Fast Cache(第二部分:对比)
  • 【RocketMQ】- 源码系列目录
  • 实习入职的总结
  • 前端八股 CSS 1
  • Chromium 134 编译指南 - Android 篇:从Linux版切换到Android版(六)
  • 2025智能体的发展趋势
  • 深⼊理解指针(8)
  • 简单的Qwen3的本地部署、分析与常见报错
  • Cribl 数据脱敏 更多方法 MASK (三)
  • 第十六届 -- 蓝桥杯Web开发大学组省赛个人复盘
  • ESP-ADF esp_dispatcher组件之audio_service子模块资源管理函数详解
  • RAGFlow上传3M是excel表格到知识库,提示上传的文件总大小过大
  • 基于Redis实现-附近商铺查询
  • UE实用地编插件Physical Layout Tool
  • MySQL | DQL语句-连接查询
  • linux 使用nginx部署next.js项目,并使用pm2守护进程
  • 加载ko驱动模块:显示Arm版本问题解决!
  • 小白如何入门Python爬虫
  • 【playwright】内网离线部署playwright
  • PMP-第九章 项目资源管理(一)
  • 机器学习实操 第一部分 机器学习基础 第8章 降维技术