You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何抓取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 12:15:39