如何抓取JavaScript动态生成的src或href属性值?
解决ASP.NET __doPostBack链接的抓取问题
遇到这种javascript:__doPostBack(...)的链接,不用解析JS,直接模拟它触发的POST请求就行,具体步骤如下:
1. 抓包分析实际请求逻辑
打开浏览器开发者工具(F12)切换到Network标签,点击目标链接(比如Wool),观察核心请求细节:
- 请求类型是POST,目标URL就是当前页面(比如
https://www.kersaintcobb.co.uk/home) - Form Data里包含几个ASP.NET必传参数:
__EVENTTARGET:对应__doPostBack里的第一个参数(比如ctl00$main$lnkWool)__EVENTARGUMENT:第二个参数(通常为空字符串)__VIEWSTATE、__EVENTVALIDATION、__VIEWSTATEGENERATOR:页面隐藏字段的值,每次请求可能更新
2. 用requests模拟请求
步骤1:获取页面隐藏字段
先GET初始页面,提取所有需要的ASP.NET参数:
import requests from bs4 import BeautifulSoup url = "https://www.kersaintcobb.co.uk/home" session = requests.Session() # 用Session维持会话,统一管理Cookie # 第一次GET请求,获取页面内容和隐藏参数 response = session.get(url) soup = BeautifulSoup(response.text, "html.parser") # 提取核心隐藏参数 view_state = soup.find("input", {"id": "__VIEWSTATE"})["value"] event_validation = soup.find("input", {"id": "__EVENTVALIDATION"})["value"] view_state_generator = soup.find("input", {"id": "__VIEWSTATEGENERATOR"})["value"]
步骤2:构造POST表单数据
把抓包得到的参数填入表单,重点是__EVENTTARGET要匹配目标链接的参数:
# 目标链接对应的__EVENTTARGET值(从href的__doPostBack字符串里提取) event_target = "ctl00$main$lnkWool" form_data = { "__VIEWSTATE": view_state, "__EVENTVALIDATION": event_validation, "__VIEWSTATEGENERATOR": view_state_generator, "__EVENTTARGET": event_target, "__EVENTARGUMENT": "", # 抓包时看到的其他表单字段,也需要一并加入 }
步骤3:发送POST请求并提取产品URL
发送POST后,响应内容就是点击链接后的页面,直接从中提取目标链接:
post_response = session.post(url, data=form_data) post_soup = BeautifulSoup(post_response.text, "html.parser") # 提取产品系列URL,替换成实际的选择器(比如产品列表的a标签类名) product_links = post_soup.find_all("a", class_="ProductLink") for link in product_links: print(link["href"])
3. 批量处理6个目标页面
已知有6个目标页面,先批量提取所有链接的__EVENTTARGET参数,再逐个请求:
# 从初始页面提取所有带__doPostBack的a标签 product_triggers = soup.find_all("a", href=lambda x: x and "javascript:__doPostBack" in x) target_list = [] for a in product_triggers: # 从href字符串中解析出__EVENTTARGET值 target = a["href"].split("'")[1] target_list.append(target) # 逐个处理每个目标链接 for target in target_list: # 每次POST前重新GET页面,获取最新的隐藏参数(避免参数过期) response = session.get(url) soup = BeautifulSoup(response.text, "html.parser") view_state = soup.find("input", {"id": "__VIEWSTATE"})["value"] event_validation = soup.find("input", {"id": "__EVENTVALIDATION"})["value"] view_state_generator = soup.find("input", {"id": "__VIEWSTATEGENERATOR"})["value"] form_data = { "__VIEWSTATE": view_state, "__EVENTVALIDATION": event_validation, "__VIEWSTATEGENERATOR": view_state_generator, "__EVENTTARGET": target, "__EVENTARGUMENT": "", } post_response = session.post(url, data=form_data) # 处理响应,提取产品URL...
注意事项
- 必须用
requests.Session()维持会话,否则Cookie不一致会导致请求被拒绝 - 每次POST前重新GET页面,确保
__VIEWSTATE等参数是最新的 - 如果找不到参数,可尝试通过name属性选择(比如
soup.find("input", {"name": "__VIEWSTATE"}))
内容的提问来源于stack exchange,提问作者cap1hunna
相关产品推荐
相关产品推荐

