能否不使用Selenium,用Requests或Scrapy提取隐藏的大纲下载链接?
不用Selenium提取大纲下载链接的方法
核心思路
这类隐藏的下载链接通常是前端JavaScript动态生成的,点击时触发JS逻辑获取真实链接并跳转。不用Selenium的话,关键是逆向分析页面的JS代码,找到链接生成规则或调用的接口。
具体步骤
1. 抓取页面源码并分析JS逻辑
先用requests获取页面完整源码:
import requests url = "https://www.simplilearn.com/big-data-and-analytics/python-for-data-science-training" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" } response = requests.get(url, headers=headers) html = response.text
在源码里搜索和下载大纲相关的关键词,比如syllabus、download、outline,重点找按钮的点击事件绑定代码。比如可能会找到类似片段:
document.querySelector('.syllabus-download-btn').addEventListener('click', function() { const courseId = 'PY0123'; const realUrl = `https://www.simplilearn.com/assets/syllabi/${courseId}.pdf`; window.open(realUrl, '_blank'); });
2. 提取页面内的核心标识
多数教育网站的下载链接依赖课程/产品ID,这个ID通常会藏在页面源码的这些位置:
- Meta标签:
<meta name="course-id" content="PY0123"> - 隐藏输入框:
<input type="hidden" id="courseId" value="PY0123"> - JS全局变量:
window.courseInfo = {id: 'PY0123'}
用正则表达式提取这个ID:
import re # 匹配meta标签里的课程ID course_id = re.search(r'meta name="course-id" content="(.*?)"', html).group(1) # 或者匹配JS全局变量 course_id = re.search(r'window\.courseInfo.*?id:\s*"(\w+)"', html).group(1)
3. 构造真实下载链接或调用接口
如果链接是直接拼接的,用提取到的ID构造URL即可:
download_url = f"https://www.simplilearn.com/assets/syllabi/{course_id}.pdf"
如果是通过接口获取链接,找到接口地址后用requests请求:
api_url = f"https://www.simplilearn.com/api/courses/{course_id}/syllabus" api_response = requests.get(api_url, headers=headers) download_url = api_response.json().get('downloadUrl')
4. 处理反爬限制
如果遇到反爬,需要:
- 带上完整请求头(包括
Referer、Cookie,可以从浏览器复制后填入) - 用
requests.Session维持会话,模拟浏览器访问流程 - 添加请求延时,避免频繁触发反爬机制
为什么XPath/CSS定位不到链接?
因为按钮的href属性是#,真实下载链接并不在元素属性里,而是存放在点击事件的JS逻辑中,所以直接定位元素只能拿到空的占位符,无法获取真实链接。
内容的提问来源于stack exchange,提问作者nikhil kumar
相关产品推荐
相关产品推荐

