在当今的网络世界中,自动化操作网页、精准获取网页信息对于开发者和数据爱好者来说至关重要。今天就来给大家分享如何使用 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
信息,将它们按照特定格式拼接成字符串:
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