在现代网络爬虫和自动化任务中,动态生成的参数(如 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. 实现思路
我们的目标是:
-
使用
Selenium
打开目标网页,提取动态Referer
。 -
从页面中提取动态
Sign
。 -
使用
Requests
发送请求,获取加密的 URL。 -
使用
Selenium
执行 JavaScript 解密逻辑,获取最终的 URL。
3. 实现步骤
3.1 安装依赖
首先,确保安装了以下 Python 库:
bash
pip install requests selenium beautifulsoup4
3.2 提取动态 Referer
我们使用 Selenium
打开目标网页,并通过 BeautifulSoup
解析页面内容,提取 iframe
的 src
属性作为 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
使用提取到的 Referer
和 Sign
,构造请求并发送。
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. 总结
通过本文的代码示例,你可以:
-
使用
Selenium
和BeautifulSoup
提取动态Referer
和Sign
。 -
使用
Requests
发送请求并获取加密 URL。 -
使用
Selenium
执行 JavaScript 解密逻辑。
这种方法适用于需要处理动态参数的自动化任务,如爬虫、数据抓取等。如果你有更多问题或需要进一步的帮助,请随时联系我!