Django 用户认证 用户 邮箱登录 邮箱注册 ORM or,and,not form.py FORM ModelForm Paginator 分页 HTMl JQuery 定位元素 ajax django切片 restfulapi 跨域 Ubantu Python Mysql Scrapy 爬虫 导出 Python读写 Pycharm 破解 session re sqlit3 生成式 其他 Prism 富文本 CSS Nginx 部署 请求头 抓包 协议 selenium Ubuntu 宝塔 AI Comfy-ui ollama dify open-webui Git docker
利用 DrissionPage 绕过cloudflare验证
张建行 2025年2月7日 17:38 405 文章标签: Ubantu 爬虫 session 部署 请求头 抓包 协议 selenium

在当今的网络世界中,自动化操作网页、精准获取网页信息对于开发者和数据爱好者来说至关重要。今天就来给大家分享如何使用 DrissionPage 库巧妙地完成一系列操作,包括获取指定网页的 cookie 以及精心构造请求头信息,这在模拟浏览器行为、突破部分网站反爬限制等场景中十分实用。

一、前置准备

首先,确保已经安装了 DrissionPage 库,它为我们操控 Chromium 内核浏览器提供了强大的功能支持。像平常一样导入所需模块:

from DrissionPage import ChromiumPage, ChromiumOptions
import json

二、深入剖析 get_cookie 函数

(一)临时配置获取用户代理

函数 get_cookie 接收两个参数,网址 url 和系统类型标识 system_type。一开始,创建一个临时的 ChromiumOptions 对象 temp_options,并进行两项关键设置:

temp_options = ChromiumOptions()
temp_options.headless()  # 开启无头模式,浏览器默默在后台运行,不弹出界面,适合自动化脚本执行场景,避免不必要的图形界面开销。
temp_options.set_argument('--no-sandbox')  # 对于一些特定运行环境,如部分 Linux 系统,禁用沙盒模式能规避权限问题,确保程序顺利运行。

接着,利用这个临时配置实例化一个 ChromiumPage 对象 temp_page,宛如打开了一个隐形的浏览器窗口,然后通过运行 JavaScript 代码获取当前的用户代理字符串:

user_agent = temp_page.run_js("return navigator.userAgent")

获取完毕后,立即关闭这个临时页面,因为它的使命已经完成,接下来要创建正式 “作战” 的浏览器页面。

(二)正式配置页面访问与操作

重新创建一个正式的 ChromiumOptions 对象 options,同样开启无头模式,并选择性地注释掉一些可能有用的配置项(如禁用 GPU、绕过自动化检测标志等,开发者可按需启用),重点是将之前获取的用户代理字符串进行 “伪装”:

options = ChromiumOptions()
options.headless()
# options.set_argument('--disable-gpu')  # 特定环境下禁用 GPU 加速,防止因 GPU 问题报错。
# options.set_argument('--disable-blink-features=AutomationControlled')  # 尝试绕过网站对自动化浏览器的检测。
options.set_argument('--no-sandbox')
options.set_user_agent(user_agent.replace('Headless', ''))  # 把用户代理中的 'Headless' 字样去掉,让它看起来更像普通用户使用的浏览器,降低被网站识别为自动化脚本的风险。

使用这个精心配置的 options 创建真正用于操作的 ChromiumPage 对象 page,并打开目标网址:

page = ChromiumPage(options)
page.get(url)

(三)等待页面加载与标题监测

为了确保页面加载到期望状态,先获取初始页面标题并打印:

title = page.title
print(title)

然后等待页面标题变为 '壁纸',这背后可能是页面加载动态内容、重定向后更新标题等业务逻辑在起作用:

page.wait.title_change('壁纸')
print(page.title)

(四)拼接 cookie 与构建请求头

接下来就是关键的 cookie 处理环节,遍历页面获取到的所有 cookie 信息,将它们按照特定格式拼接成字符串:

cookies = ''
for i in page.cookies():
    name = i['name']
    value = i['value']
    cookies += f'{name}={value};'

再次通过运行 JavaScript 代码获取最新的用户代理(防止页面加载过程中用户代理有变化),最后构建包含用户代理和 cookie 信息的请求头字典:

user_agent = page.run_js("return navigator.userAgent")
headers = {'User-Agent': user_agent, 'Cookie': cookies}

(五)存储与收尾工作

假设存在外部的存储对象 r,将请求头字典转换为 JSON 字符串后存储到对应 system_type 的位置(具体存储逻辑依外部代码而定),并打印请求头信息用于调试:

r.set(system_type, json.dumps(headers))
print(headers)

最后,关闭浏览器页面,释放资源,并将构建好的请求头信息返回,以供外部代码后续使用:

page.quit()
return headers

三、总结与展望
 

通过 get_cookie 函数,我们利用 DrissionPage 库实现了一套完整的从配置浏览器、访问页面、等待页面就绪、抓取关键信息到构建请求头的流程。这不仅展示了该库在自动化网页交互方面的强大能力,也为大家在处理类似网络任务时提供了清晰的思路,无论是进行数据采集、模拟登录还是突破网站反爬机制,都有了可靠的技术手段。后续大家可以进一步探索 DrissionPage 更多高级功能,挖掘网络自动化的无限潜力。

from DrissionPage import ChromiumPage, ChromiumOptions
import json
# 定义函数,用于获取指定网址的cookie等相关信息,并进行一些页面操作和设置返回相关请求头信息
# 参数url表示要访问的网址,system_type用于后续设置相关存储时区分系统类型之类的用途(具体看代码外更完整的逻辑)
def get_cookie(url, system_type):
   # 创建一个临时的ChromiumOptions对象,用于一些初始化配置
   temp_options = ChromiumOptions()
   # 设置为无头模式,即浏览器在后台运行,不会显示界面,常用于自动化任务中不需要可视化界面的场景
   temp_options.headless()
   # 设置禁止沙盒模式,在某些环境(比如一些Linux环境下)运行时可能需要此配置来避免权限等相关问题
   temp_options.set_argument('--no-sandbox')
   # 使用配置好的临时选项创建一个ChromiumPage对象,可理解为一个浏览器页面实例,后续可以在这个页面上进行操作
   temp_page = ChromiumPage(temp_options)
   # 通过在这个临时页面上运行JavaScript代码获取当前的用户代理(User-Agent)字符串,它包含了浏览器相关标识等信息
   user_agent = temp_page.run_js("return navigator.userAgent")
   # 关闭这个临时页面,因为后续还要重新创建正式使用的页面,这里只是为了获取用户代理信息
   temp_page.quit()
   # 创建一个正式的ChromiumOptions对象,用于配置后续真正使用的浏览器页面
   options = ChromiumOptions()
   # 设置为无头模式
   options.headless()
   # 以下三行是一些可选的配置,这里被注释掉了,具体说明如下:
   # 禁用GPU(某些情况下需要),例如在一些无头环境中可能不需要GPU加速,或者GPU相关驱动有问题时可以禁用它来避免报错等情况
   # options.set_argument('--disable-gpu')
   # 禁用自动化标志,有些网站可能会检测浏览器是否被自动化控制,设置这个可以尝试绕过这种检测
   # options.set_argument('--disable-blink-features=AutomationControlled')
   # 禁用沙盒模式(适用于Linux),前面已经介绍过其作用,这里再次设置以确保配置生效
   options.set_argument('--no-sandbox')
   # 将之前获取到的用户代理字符串中的'Headless'字样替换掉,这样可以让用户代理看起来更像普通浏览器,可能有助于绕过部分网站检测
   options.set_user_agent(user_agent.replace('Headless', ''))
   # 使用配置好的选项创建一个真正用于操作的浏览器页面对象
   page = ChromiumPage(options)
   # 使用创建好的页面对象打开指定的网址
   page.get(url)
   # 获取当前页面的标题并打印,可用于查看页面是否正确加载等调试目的
   title = page.title
   print(title)
   # 等待页面标题变为'壁纸',这里可能是期望页面加载后会更新标题到'壁纸',比如页面有重定向或者加载完特定内容后标题改变等情况
   page.wait.title_change('壁纸')
   # 再次打印页面标题,查看是否已经按预期改变了标题
   print(page.title)
   # 初始化一个空字符串,用于拼接页面的cookie信息
   cookies = ''
   # 遍历页面获取到的所有cookie信息,每个cookie是一个字典形式,包含'name'(名称)和'value'(值)等字段
   for i in page.cookies():
       name = i['name']
       value = i['value']
       # 将每个cookie的名称和值按照'name=value;'的格式拼接起来
       cookies += f'{name}={value};'
   # 通过在页面上运行JavaScript代码再次获取当前的用户代理(User-Agent)字符串,可能页面加载过程中会有变化等情况需要重新获取
   user_agent = page.run_js("return navigator.userAgent")
   # 构建请求头字典,包含用户代理和拼接好的cookie信息,后续可以用于发送请求等操作,模拟浏览器请求时的头部信息
   headers = {'User-Agent': user_agent, 'Cookie': cookies}
   # 这里r应该是在代码外定义的某个对象(从代码来看可能是用于存储配置相关的对象),将包含请求头信息的字典转成JSON字符串后存储到对应system_type的位置(具体看外部完整逻辑)
   r.set(system_type, json.dumps(headers))
   # 打印请求头信息,可用于调试查看是否正确获取和构建了请求头
   print(headers)
   # 关闭浏览器页面,释放相关资源
   page.quit()
   # 返回构建好的请求头信息,供外部代码使用
   return headers