使用 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 解密逻辑。

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

相关推荐
中杯可乐多加冰9 小时前
采用Bright Data+n8n+AI打造自动化新闻助手:每天5分钟实现内容日更
运维·人工智能·自动化·大模型·aigc·n8n
水银嘻嘻9 小时前
03 APP 自动化-定位元素工具&元素定位
python·appium·自动化
东临碣石829 小时前
【AI论文】SWE-rebench:一个用于软件工程代理的任务收集和净化评估的自动化管道
运维·自动化
m0_5557629011 小时前
网页自动化部署(webhook方法)
运维·自动化
Freshman小白11 小时前
基于python脚本进行Maxwell自动化仿真
python·自动化
先做个垃圾出来………12 小时前
接口自动化常用断言方式
数据库·自动化·lua
爱吃番茄炒蛋*15 小时前
工业自动化实战:基于 VisionPro 与 C# 的机器视觉 PLC 集成方案
数码相机·计算机视觉·c#·自动化·vision pro
struggle202516 小时前
Vuer开源程序 是一个轻量级的可视化工具包,用于与动态 3D 和机器人数据进行交互。它支持 VR 和 AR,可以在移动设备上运行。
机器人·自动化·ar·交互·vr
Tom Boom16 小时前
43. 远程分布式测试实现
分布式·测试开发·自动化·webdriver·自动化测试框架开发·分布式测试
Feng.Lee17 小时前
聊一聊接口测试中缓存处理策略
功能测试·测试工具·缓存