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

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

相关推荐
云飞云共享云桌面2 小时前
昆山精密机械公司8个Solidworks共用一台服务器
运维·服务器·网络·3d·自动化·制造
程序员三藏5 小时前
2025最新的软件测试面试八股文(800+道题)
自动化测试·软件测试·python·功能测试·测试工具·面试·职场和发展
Kyln.Wu7 小时前
【python实用小脚本-211】[硬件互联] 桌面壁纸×Python梦幻联动|用10行代码实现“开机盲盒”自动化改造实录(建议收藏)
开发语言·python·自动化
大路谈数字化7 小时前
生产制造自动化
自动化·制造
Adorable老犀牛7 小时前
阿里云 & 腾讯云 API 自动化查询指南
阿里云·自动化·腾讯云
泽众云测试11 小时前
RPA-4.0.0.0_SAAS新版本已上线,Edge扩展自动安装,快速实现RPA流程自动化
自动化·rpa
q5673152311 小时前
自动化拨号爬虫体系:虚拟机集群部署与增量管理
运维·爬虫·网络协议·自动化
禁默12 小时前
第六届机器学习与计算机应用国际学术会议
运维·人工智能·机器学习·自动化
xx.ii13 小时前
43.shell脚本循环与函数
linux·运维·自动化
云飞云共享云桌面16 小时前
1台电脑10个画图设计用怎么实现
linux·运维·服务器·网络·数据库·自动化·电脑