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

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


1. 背景介绍

1.1 什么是动态 Referer 和 Sign

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

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

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

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

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


2. 实现思路

我们的目标是:

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

  2. 从页面中提取动态 Sign

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

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


3. 实现步骤

3.1 安装依赖

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

pip install requests selenium beautifulsoup4

3.2 提取动态 Referer

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

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

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

使用提取到的 Referer 和 Sign,构造请求并发送。

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

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 主逻辑

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

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. 使用 Selenium 和 BeautifulSoup 提取动态 Referer 和 Sign

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木觞清

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值