如何提取网页中无iframe且网络面板无请求的内嵌下载链接?
受保护LMS中隐藏下载链接的提取标准流程
针对这类点击<a>标签触发下载但真实链接无迹可寻的场景,可按以下流程提取:
1. 开启全量网络请求捕获,排查隐藏的下载请求
默认浏览器开发者工具的网络面板可能过滤了部分请求(如文档类或重定向请求),可通过Selenium配置浏览器日志,捕获所有请求细节:
- 配置Chrome浏览器的性能/网络日志,开启全量请求记录:
from selenium import webdriver from selenium.webdriver.chrome.options import Options import json chrome_options = Options() # 开启性能日志,包含全量网络请求信息 chrome_options.set_capability('goog:loggingPrefs', {'performance': 'ALL'}) driver = webdriver.Chrome(options=chrome_options) # 定位目标元素并触发点击 bigger_tag = driver.find_elements(By.XPATH, "//div[@class='activityinstance']//a[@class='aalink'][contains(@href, 'https://lms.nust.edu.pk/portal/mod/resource/view.php?') or contains(@href, 'https://lms.nust.edu.pk/portal/mod/url/view.php')]") for tag in bigger_tag: tag.click() # 解析性能日志,筛选下载相关请求 logs = driver.get_log('performance') for log in logs: message = json.loads(log['message'])['message'] # 定位返回PDF的请求 if 'response' in message['params'] and 'contentType' in message['params']['response']['headers']: if message['params']['response']['headers']['contentType'] == 'application/pdf': print("真实下载链接:", message['params']['response']['url']) - 重点关注
Content-Type为application/pdf或响应头包含Content-Disposition: attachment的请求,这类请求的URL即为真实下载链接。
2. 复用会话直接请求<a>标签的跳转地址
这类LMS的<a>标签href通常是权限验证页面,后端验证会话后会重定向到真实下载链接,可复用Selenium的会话直接请求该地址:
- 提取
<a>标签的href,用requests库带上Selenium的Cookies发送请求,跟踪重定向:import requests session = requests.Session() # 复制Selenium中的会话Cookies到requests for cookie in driver.get_cookies(): session.cookies.set(cookie['name'], cookie['value'], domain=cookie['domain']) for tag in bigger_tag: href = tag.get_attribute('href') response = session.get(href, allow_redirects=True) # 若最终响应为PDF,其URL即为真实下载链接 if response.headers.get('Content-Type') == 'application/pdf': print("真实下载链接:", response.url) # 或检查重定向链的最终地址 elif len(response.history) > 0: print("真实下载链接:", response.url)
3. 分析前端点击事件的JS逻辑
很多场景下<a>标签的点击被JS劫持,通过异步请求生成临时下载链接,可通过以下方式分析:
- 在浏览器开发者工具的Elements面板查看
<a>标签的onclick属性,或在Sources面板搜索该元素的事件监听函数,定位处理下载的JS代码; - 用Selenium直接执行对应的JS逻辑,获取生成的下载链接:
# 假设点击事件由名为getDownloadUrl的函数处理 download_url = driver.execute_script("return getDownloadUrl();") print("真实下载链接:", download_url)
4. 用流量拦截工具捕获下载请求
使用selenium-wire这类可拦截浏览器全量网络请求的工具,直接捕获下载请求的URL:
- 安装并配置selenium-wire,点击元素后遍历请求记录:
from seleniumwire import webdriver driver = webdriver.Chrome() # 定位并触发元素点击 for tag in bigger_tag: tag.click() # 遍历所有请求,筛选PDF下载请求 for request in driver.requests: if request.response and request.response.headers.get('Content-Type') == 'application/pdf': print("真实下载链接:", request.url) break
内容的提问来源于stack exchange,提问作者Geek
相关产品推荐
相关产品推荐

