使用 Selenium 和 Requests 自动化获取动态 Referer 和 Sign 的完整指南

在现代网络爬虫和自动化任务中,动态生成的参数(如 RefererSign)常常是绕过反爬虫机制的关键。本文将详细介绍如何使用 Python 的 SeleniumRequests 库,从目标网页中提取动态 RefererSign,并完成后续的请求和解密操作。


1. 背景介绍

1.1 什么是动态 RefererSign

  • Referer :HTTP 请求头的一部分,用于指示请求是从哪个页面发起的。某些网站会检查 Referer 是否合法,以防止跨站请求伪造(CSRF)或未经授权的访问。

  • Sign :一种动态生成的参数,通常用于验证请求的合法性。Sign 可能是通过 JavaScript 动态生成的,或者基于某种规则(如时间戳、随机数等)生成。

1.2 为什么需要动态获取这些参数?

  • 反爬虫机制:许多网站会使用动态参数来防止自动化脚本的访问。

  • 请求合法性 :某些 API 或接口要求提供正确的 RefererSign,否则会返回错误。


2. 实现思路

我们的目标是:

  1. 使用 Selenium 打开目标网页,提取动态 Referer

  2. 从页面中提取动态 Sign

  3. 使用 Requests 发送请求,获取加密的 URL。

  4. 使用 Selenium 执行 JavaScript 解密逻辑,获取最终的 URL。


3. 实现步骤

3.1 安装依赖

首先,确保安装了以下 Python 库:

bash 复制代码
pip install requests selenium beautifulsoup4

3.2 提取动态 Referer

我们使用 Selenium 打开目标网页,并通过 BeautifulSoup 解析页面内容,提取 iframesrc 属性作为 Referer

python 复制代码
from selenium import webdriver
from bs4 import BeautifulSoup
import requests

def get_dynamic_referer():
    # 初始化浏览器
    driver = webdriver.Edge()  # 使用 Edge 浏览器
    driver.get("https://wwou.lanzoue.com/ib7ll2dcgiqd")  # 打开目标页面

    # 等待页面加载
    time.sleep(5)

    # 使用 BeautifulSoup 解析页面
    url = "https://wwou.lanzoue.com/ib7ll2dcgiqd"
    response = requests.get(url)
    soup = BeautifulSoup(response.text, "html.parser")

    # 查找 iframe 标签
    iframe = soup.find("iframe", class_="ifr2")
    if iframe and iframe.has_attr("src"):
        src = iframe["src"]
        referer = "https://wwou.lanzoue.com" + src
        print("提取到的 Referer:", referer)
    else:
        # 如果未找到 iframe,使用 Selenium 动态加载
        iframe = driver.find_element(By.CSS_SELECTOR, "iframe.ifr2")
        src = iframe.get_attribute("src")
        referer = "https://wwou.lanzoue.com" + src
        print("提取到的 Referer:", referer)

    driver.quit()  # 关闭浏览器
    return referer

3.3 提取动态 Sign

从页面中提取 Sign,通常需要分析 JavaScript 代码或页面元素。我们可以使用正则表达式从 script 标签中提取 Sign

python 复制代码
import re

def extract_sign(referer):
    response = requests.get(referer)
    soup = BeautifulSoup(response.text, "html.parser")

    # 查找所有 script 标签
    scripts = soup.find_all("script", type="text/javascript")

    # 遍历 script 标签,查找 sign
    sign = None
    for script in scripts:
        if script.string and "'sign':" in script.string:
            match = re.search(r"'sign':'([^']+)'", script.string)
            if match:
                sign = match.group(1)
                break

    if sign:
        print("提取到的 Sign:", sign)
    else:
        print("未找到 Sign")
    return sign

3.4 发送请求并获取加密 URL

使用提取到的 RefererSign,构造请求并发送。

python 复制代码
def send_request(referer, sign):
    api_url = "https://wwou.lanzoue.com/ajaxm.php?file=205542423"
    payload = {
        "action": "downprocess",
        "signs": "?ctdf",
        "sign": sign,  # 使用动态 Sign
        "websign": "",
        "websignkey": "VoaW",
        "ves": 1,
        "kd": 1
    }

    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
        "Referer": referer,  # 使用动态 Referer
        "Content-Type": "application/x-www-form-urlencoded"
    }

    response = requests.post(api_url, data=payload, headers=headers)
    return response

3.5 解密 URL

如果返回的 URL 是加密的,可以使用 Selenium 执行 JavaScript 解密逻辑。

python 复制代码
def decrypt_url(encrypted_url):
    driver = webdriver.Edge()  # 使用 Edge 浏览器
    driver.get("about:blank")  # 打开空白页

    # 注入解密逻辑(替换为实际逻辑)
    driver.execute_script("""
        window.decryptFunction = function(encryptedUrl) {
            // 示例解密逻辑(替换为实际逻辑)
            return encryptedUrl.replace("encrypted_", "decrypted_");
        };
    """)

    # 调用解密函数
    decrypted_url = driver.execute_script(f"""
        return decryptFunction("{encrypted_url}");
    """)

    driver.quit()  # 关闭浏览器
    return decrypted_url

3.6 主逻辑

将以上步骤整合到主逻辑中。

python 复制代码
try:
    # 获取动态 Referer
    referer = get_dynamic_referer()
    print("Dynamic Referer:", referer)

    if not referer:
        raise ValueError("Failed to get dynamic Referer.")

    # 提取动态 Sign
    sign = extract_sign(referer)
    if not sign:
        raise ValueError("Failed to extract Sign.")

    # 发送请求
    response = send_request(referer, sign)
    print("Status Code:", response.status_code)
    print("Response Content:", response.text)

    # 解析响应
    try:
        data = response.json()
        if data.get("zt") == 1 and data.get("url"):  # 检查状态和 URL
            encrypted_url = data["url"]
            print("Encrypted URL:", encrypted_url)

            # 解密 URL
            decrypted_url = decrypt_url("https://developer-oss.lanrar.com/file/" + encrypted_url)
            print("Decrypted URL:", decrypted_url)
        else:
            print("Failed to get a valid URL. Error:", data.get("inf"))
    except requests.exceptions.JSONDecodeError:
        print("Failed to decode JSON. Response content:")
        print(response.text)
except Exception as e:
    print("An error occurred:", str(e))

4. 总结

通过本文的代码示例,你可以:

  1. 使用 SeleniumBeautifulSoup 提取动态 RefererSign

  2. 使用 Requests 发送请求并获取加密 URL。

  3. 使用 Selenium 执行 JavaScript 解密逻辑。

这种方法适用于需要处理动态参数的自动化任务,如爬虫、数据抓取等。如果你有更多问题或需要进一步的帮助,请随时联系我!

相关推荐
聆风吟º1 天前
CANN开源项目实战指南:使用oam-tools构建自动化故障诊断与运维可观测性体系
运维·开源·自动化·cann
NPE~1 天前
自动化工具Drissonpage 保姆级教程(含xpath语法)
运维·后端·爬虫·自动化·网络爬虫·xpath·浏览器自动化
极客小云1 天前
【ComfyUI API 自动化利器:comfyui_xy Python 库使用详解】
网络·python·自动化·comfyui
不会代码的小测试1 天前
UI自动化-POM封装
开发语言·python·selenium·自动化
兜兜转转了多少年1 天前
从脚本到系统:2026 年 AI 代理驱动的 Shell 自动化
运维·人工智能·自动化
L543414461 天前
告别代码堆砌匠厂架构让你的系统吞吐量翻倍提升
大数据·人工智能·架构·自动化·rpa
码农阿豪1 天前
多服务器批量指令管理:从Xshell到自动化运维
运维·服务器·自动化
网络安全-杰克1 天前
Jmeter压力测试工具安装与使用
自动化测试·软件测试·测试工具·jmeter·职场和发展
2501_941982051 天前
别再手动发群消息了!企业微信外部群自动化推送的架构设计与实现
运维·自动化·企业微信
Wpa.wk1 天前
接口自动化 - 接口鉴权处理常用方法
java·运维·测试工具·自动化·接口自动化