如何无需点击即可爬取JS网站动态标签页内的目标数据
爬取卡萨布兰卡证券交易所「indicateurs clès」标签内容的可行解决方案
你遇到的站点是典型的ASP.NET WebForms架构,标签切换触发的是服务端回发逻辑,没有独立的内容URL,动态参数是ASP.NET自带的校验字段,可以通过以下三种方案解决:
方案1:模拟浏览器点击(门槛最低,适配性最强)
直接使用支持浏览器模拟的工具操作页面,不需要逆向接口参数,适合少量爬取场景
- 可选工具:Selenium、Playwright、Pyppeteer
- 操作流程:
- 启动浏览器实例(可开启无头模式降低资源占用),访问目标页面
https://www.casablanca-bourse.com/bourseweb/Societe-Cote.aspx?codeValeur=12200 - 等待页面加载完成后,定位到「indicateurs clès」标签元素,触发模拟点击
- 等待标签对应内容渲染完成后,直接提取当前DOM中的目标数据即可
- 启动浏览器实例(可开启无头模式降低资源占用),访问目标页面
- Python + Selenium 极简示例:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 配置无头模式 chrome_options = webdriver.ChromeOptions() chrome_options.add_argument("--headless=new") chrome_options.add_argument("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") driver = webdriver.Chrome(options=chrome_options) try: driver.get("https://www.casablanca-bourse.com/bourseweb/Societe-Cote.aspx?codeValeur=12200") # 等待标签可点击后触发点击 tab = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.LINK_TEXT, "indicateurs clès")) ) tab.click() # 等待内容容器加载完成后提取数据,替换下面的ID为实际内容容器的DOM ID content_container = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "target_content_id")) ) print(content_container.text) finally: driver.quit()
方案2:逆向PostBack请求(性能最高,适合批量爬取)
不需要启动浏览器,直接构造HTTP请求拿数据,爬取效率更高
- 操作流程:
- 打开浏览器开发者工具的「网络」面板,过滤Fetch/XHR请求,点击「indicateurs clès」标签,找到触发的POST请求(请求地址就是当前页面URL)
- 查看POST请求的表单参数,提取固定参数:
__EVENTTARGET(触发事件的标签控件ID,固定值)、__EVENTARGUMENT(一般为空) - 每次请求前先GET一次原页面,从页面源码中正则提取三个动态校验参数:
__VIEWSTATE、__VIEWSTATEGENERATOR、__EVENTVALIDATION - 把所有参数拼接成表单,提交POST请求到原页面URL,返回的响应内容中就包含「indicateurs clès」标签的完整HTML,直接提取即可
- 注意点:三个动态校验参数有效期很短,每次提交POST请求前都要重新获取,不能复用
方案3:轻量JS渲染请求
如果不想安装完整的浏览器驱动,可以使用内置JS渲染能力的请求库
- 可选工具:Python的
requests-html库 - 操作流程:
- 用
HTMLSession发起GET请求访问目标页面 - 调用
render()方法执行页面内置JS - 定位标签元素触发点击,等待渲染完成后提取目标数据
- 用
内容的提问来源于stack exchange,提问作者dadija
相关产品推荐
相关产品推荐

