drissionpage知识整理与某数等反爬产品绕过实战

概述

DrissionPage是一个基于 Python 的网页自动化工具。既能控制浏览器,也能收发数据包,还能把两者合而为一。可兼顾浏览器自动化的便利性和 requests 的高效率。功能强大,语法简洁优雅,代码量少,对新手友好。

入门文档

drissionpage作者提供了详细的入门教程,这里就列出用法了,需要时直接到官方文档查询即可。

官方文档还提供了几个大佬录制的视频教程,方便食用
在这里插入图片描述

主页面对象

主页面对象有 3 种,它们通常是程序的入口:

  • ChromiumPage:单纯用于操作浏览器的页面对象
  • WebPage:整合浏览器控制和收发数据包于一体的页面对象
  • SessionPage:单纯用于收发数据包的页面对象

我的理解是:
WebPage其实整合了ChromiumPage和SessionPage两个页面对象
在这里插入图片描述

而ChromiumPage跟selenium、playwright应用上差不多,可操控浏览器
SessionPage是一个使用使用Session(requests 库)对象的页面,是一个使用使用Session(requests 库)对象的页面,它使用 POM 模式封装了网络连接和 html 解析功能,收发数据包效果跟requests相同,不过它提供了丰富的功能。

采集案例

某书搜索列表页

刚遇到问题,就是某书的搜索列表页是没有滚动条的,一般情况下只能鼠标滚轮滚动
大家估计都会使用下面这种方式来实现翻页

wp = WebPage()
wp.get('url')
wp.listen.start('web/v1/search/notes')
ac = Actions(wp)
packet = wp.listen.wait()
ac.scroll(delta_y=1500)

但是这种方式循环滚动两次后,会发现一直卡在第三次循环,这是啥原因呢

这是因为此时的scroll是对driver对象进行操作的,那它只会滚动到浏览器界面的最大值,不会再重置后继续滚动了,也就导致了程序一直处于wp.listen.wait()这一步。

这时其实可以使用执行JavaScript代码的方式实现屏幕滚动,下面代码既可以解决问题

wp.run_js('''
// 滚动函数
function scrollDown() {
   
   
  window.scrollBy(0, 2000); // 向下滚动2000像素
}
 
// 设置定时器,每隔1秒调用一次滚动函数
setInterval(scrollDown, 1000);
''')

说到底scroll方法操作的对象是元素。

某瓣小说封面

简单采集某瓣小说封面,更多案例可以看官方文档提供的。

import os.path

from DrissionPage import ChromiumPage, ChromiumOptions
from DrissionPage import SessionPage


def download():
    dp = ChromiumOptions().set_paths(browser_path=r'C:\Program Files\Google\Chrome\Application\chrome.exe')
    page = ChromiumPage(dp)

    page.get('https://book.douban.com/tag/小说?start=0&type=T', retry=3, interval=2, timeout=15)

    for _ in range(2):
        for book in page.eles('x://li[@class="subject-item"]'):
            book_name = book.ele('x://h2/a').attr('title')
            img = book('x://img')
            img.save(path='./img/', name=f"{
     
     book_name}.png")
            print(f"{
     
     book_name}.png 保存成功!")

        # 点击下一页
        page('后页>').click()
        page.wait.load_start()

    page.close()


def headless_download():
    """ 无头模拟实现 """
    page = SessionPage()

    if not os.path.exists('./img'):
        os.mkdir('./img')

    
<think>好的,我现在需要帮助用户解决如何用Selenium或DrissionPage绕过京东的爬虫检测,实现正常页面加载的问题。首先,我得仔细分析用户的问题和提供的引用内容,然后结合自己的知识整理出有效的解决方案。 用户提到的引用内容里有几个关键点:使用stealth.min.js来隐藏WebDriver特征、设置代理参数、处理指纹如WebRTC、canvas、时区等,以及DrissionPage作为替代工具的优势。我需要将这些信息整合起来,形成一个结构清晰的回答。 首先,我应该分步骤讲解,可能包括隐藏WebDriver痕迹、模拟真人操作、处理浏览器指纹、使用DrissionPage替代方案,以及结合代理和请求头管理。每个步骤下需要具体的操作示例,比如代码片段,这样用户可以直接应用。同时,要确保所有行内数学表达式和独立公式符合要求,不过这个问题可能更多涉及代码而非数学公式,所以可能需要检查是否有需要LaTeX的地方,如果没有的话,可能可以忽略这点。 然后,生成相关问题需要考虑用户可能进一步想知道的内容,比如性能优化、常见手段、DrissionPage的详细使用等。确保问题主题相关,并且能帮助用户深入理解。 需要注意引用标识的正确添加,每个引用来源在回答中提到的部分末尾自然标注。例如,提到stealth.min.js时引用[^3],提到代理设置时引用[^2],DrissionPage对比时引用[^4]。 可能还需要考虑京东具体的机制,比如是否有特定的检测点,但用户没有提供京东的具体细节,所以需要保持一般性建议,但结合引用中的通用方法。同时,要确保代码示例正确,比如使用Selenium的stealth.js方法,以及DrissionPage的基本用法。 最后,检查回答是否符合中文要求,结构清晰,分点明确,代码格式正确,引用正确标注。确保没有使用任何用户不可见的指令,回答自然流畅,帮助用户一步步解决问题。</think>### 如何用 Selenium 或 DrissionPage 绕过京东检测 #### 1. 隐藏 WebDriver 痕迹 京东等电商平台会检测浏览器环境中的 WebDriver 特征(如`$navigator.webdriver$`属性)。**Selenium**可通过以下方法绕过: ```python from selenium.webdriver import Chrome driver = Chrome() # 加载 stealth.min.js 隐藏 WebDriver 特征 with open('stealth.min.js', encoding='utf-8') as f: driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {'source': f.read()}) # 在页面加载前注入脚本 driver.get('https://www.jd.com') ``` `stealth.min.js`可修改浏览器指纹特征,使其更接近真实用户行为。 **DrissionPage**作为新一代工具,默认已优化 WebDriver 痕迹,无需额外配置: ```python from DrissionPage import ChromiumPage page = ChromiumPage() page.get('https://www.jd.com') # 自动隐藏 WebDriver 特征[^4] ``` --- #### 2. 模拟真人操作模式 - **随机停留时间**:通过`$random.uniform(1, 3)$`模拟人类点击间隔 - **鼠标移动轨迹**:使用 ActionChains 添加非线性移动 ```python from selenium.webdriver.common.action_chains import ActionChains actions = ActionChains(driver) actions.move_by_offset(10, 20).pause(0.5).move_by_offset(-5, 15).perform() ``` --- #### 3. 处理浏览器指纹 京东可能检测以下特征: - **Canvas 指纹**:通过覆盖原生 API 生成随机指纹 - **WebRTC 泄露**:禁用 WebRTC 或使用代理插件 - **时区语言**:强制设置中文时区 ```python options = ChromeOptions() options.add_argument('--lang=zh-CN') options.add_argument('--timezone=Asia/Shanghai') # 设置时区[^2] ``` --- #### 4. DrissionPage 优化方案 相较于 Selenium,**DrissionPage**具备以下优势: 1. 无需单独安装浏览器驱动 2. 默认优化指纹特征(如 WebGL、字体列表等) 3. 支持混合模式(同时操作浏览器和请求) ```python page = ChromiumPage() page.get('https://item.jd.com/100038348832.html') # 直接访问商品页 print(page.ele('tag:h2').text) # 智能定位元素 ``` --- #### 5. 代理请求头管理 必须配合代理 IP 和 Header 随机化: ```python # Selenium 代理设置(需同时设置 capabilities) options.add_argument('--proxy-server=http://127.0.0.1:8080') driver = Chrome(options=options) # DrissionPage 代理设置 page.set.proxy('http://127.0.0.1:8080') # 简化的代理配置 ``` 注意需定期更换 User-Agent,推荐使用`$fake_useragent`库生成随机头部[^2]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

九月镇灵将

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值