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

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

相关推荐
_落纸16 小时前
《自动控制原理》第 3 章 线性控制系统的运动分析:3.6、3.7
笔记·自动化
平淡是真_18 小时前
软件测试(五)--自动化测试Selenium(一)
selenium·测试工具
Run Freely93719 小时前
selenium_web自动化测试_02_元素操作
selenium·测试工具
蓝蜂物联网21 小时前
蓝蜂 MQTT 网关打通 120 台设备数据,助汽车零部件厂降本 40%
物联网·自动化·仪表
newxtc21 小时前
【重庆政务服务网-注册_登录安全分析报告】
人工智能·selenium·测试工具·安全·政务
●VON1 天前
初识影刀--一款 AI 驱动的 RPA 自动化软件
运维·自动化·rpa·影刀
安冬的码畜日常1 天前
【JUnit实战3_09】第五章:软件测试的基本原则简介
功能测试·测试工具·junit·单元测试·junit5
黄思搏1 天前
Python + uiautomator2 手机自动化控制教程
python·智能手机·自动化