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

Python3抓取含jQuery嵌入报表的网站并下载Excel报表问题

解决Telerik动态控件数据抓取问题

嘿,我之前处理过不少这类依赖前端框架动态渲染数据的抓取场景,你碰到的情况很典型——页面里的表单控件(比如你贴的这个RadComboBox下拉框)是通过ASP.NET AJAX的Sys.Application.add_init配合Telerik的$create方法动态初始化的,数据直接嵌在初始化参数里,静态HTML里根本看不到渲染后的内容,自然没法直接抓取。

给你几个实用的解决思路:

1. 直接提取内嵌的JSON数据

你贴的代码里,下拉框的语言选项完全包含在itemData这个数组里,这是标准的JSON格式。你可以用正则表达式从页面的<script>标签里精准提取这段数据,再解析成可处理的格式:

比如用Python实现的话:

import re
import json

# 假设你已经拿到了页面的HTML源码
html_source = """你的页面源码"""

# 匹配itemData对应的JSON数组
pattern = r'"itemData":(\[.*?\])'
match = re.search(pattern, html_source, re.DOTALL)
if match:
    item_data = json.loads(match.group(1))
    # 现在item_data就是包含所有语言选项的列表了
    print(item_data)

这种方法适合数据直接嵌在初始化代码里的场景,速度快,不需要模拟浏览器。

2. 用无头浏览器模拟页面渲染

如果你的报表数据是更复杂的表格,需要Telerik控件完全渲染后才能看到,那最好用无头浏览器(比如Playwright、Selenium)让页面完整加载,等控件渲染完成后再抓取:

以Playwright为例:

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch(headless=True)
    page = browser.new_page()
    page.goto("目标网站URL")
    # 等待Telerik控件渲染完成,比如等待下拉框可点击
    page.wait_for_selector("#ctl00_eSSential_Header_eSSential_Login_ddlLanguage")
    # 提取下拉框的所有选项
    options = page.locator("#ctl00_eSSential_Header_eSSential_Login_ddlLanguage option").all_text_contents()
    print(options)
    browser.close()

这种方法能处理几乎所有动态渲染的场景,缺点是速度稍慢,需要配置浏览器环境。

3. 抓包获取后端API接口

很多时候Telerik控件会通过AJAX请求从后端拉取数据,你可以用浏览器的开发者工具(F12)打开网络面板,刷新页面后找XHR/fetch请求,找到返回报表数据的接口,直接调用这个接口获取原始数据——这是最高效的方法,完全绕过前端渲染。

比如你可以看到请求的URL、请求头、参数,然后用Python的requests库直接请求:

import requests

headers = {
    "User-Agent": "你的浏览器UA",
    "Cookie": "登录后的Cookie(如果需要登录)"
}
response = requests.get("后端API接口URL", headers=headers)
report_data = response.json()
# 处理数据并导出Excel

附你提供的原始初始化代码:

//<![CDATA[ 
Sys.Application.add_init(function() { 
    $create(Telerik.Web.UI.RadComboBox, {
        "_dropDownAutoWidth":1,
        "_dropDownWidth":0,
        "_height":0,
        "_skin":"Bootstrap",
        "_text":"English – United States",
        "_uniqueId":"ctl00$eSSential_Header$eSSential_Login$ddlLanguage",
        "_value":"en-US",
        "clientStateFieldID":"ctl00_eSSential_Header_eSSential_Login_ddlLanguage_ClientState",
        "collapseAnimation":"{\"duration\":450}",
        "expandAnimation":"{\"duration\":450}",
        "itemData":[
            {"value":"af"},{"value":"af-ZA"},{"value":"sq"},{"value":"sq-AL"},{"value":"ar"},{"value":"ar-DZ"},{"value":"ar-BH"},{"value":"ar-EG"},{"value":"ar-IQ"},{"value":"ar-JO"},{"value":"ar-KW"},{"value":"ar-LB"},{"value":"ar-LY"},{"value":"ar-MA"},{"value":"ar-OM"},{"value":"ar-QA"},{"value":"ar-SA"},{"value":"ar-SY"},{"value":"ar-TN"},{"value":"ar-AE"},{"value":"ar-YE"},{"value":"hy"},{"value":"hy-AM"},{"value":"az"},{"value":"az-AZ-Cyrl"},{"value":"az-AZ-Latn"},{"value":"eu"},{"value":"eu-ES"},{"value":"be"},{"value":"be-BY"},{"value":"bg"},{"value":"bg-BG"},{"value":"ca"},{"value":"ca-ES"},{"value":"zh-HK"},{"value":"zh-MO"},{"value":"zh-CN"},{"value":"zh-CHS"},{"value":"zh-SG"},{"value":"zh-TW"},{"value":"zh-CHT"},{"value":"hr"},{"value":"hr-HR"},{"value":"cs"},{"value":"cs-CZ"},{"value":"da"},{"value":"da-DK"},{"value":"div"},{"value":"div-MV"},{"value":"nl"},{"value":"nl-BE"},{"value":"nl-NL"},{"value":"en-AU"},{"value":"en-BZ"},{"value":"en-CA"},{"value":"en-CB"},{"value":"en-IE"},{"value":"en-JM"},{"value":"en-NZ"},{"value":"en-PH"},{"value":"en-ZA"},{"value":"en-TT"},{"value":"en-GB"},{"value":"en-US","selected":true},{"value":"en-ZW"},{"value":"et"},{"value":"et-EE"},{"value":"fo"},{"value":"fo-FO"},{"value":"fa"},{"value":"fa-IR"},{"value":"fi"},{"value":"fi-FI"},{"value":"fr"},{"value":"fr-BE"},{"value":"fr-CA"},{"value":"fr-FR"},{"value":"fr-LU"},{"value":"fr-MC"},{"value":"fr-CH"},{"value":"gl"},{"value":"gl-ES"},{"value":"ka"},{"value":"ka-GE"},{"value":"de"},{"value":"de-AT"},{"value":"de-DE"},{"value":"de-LI"},{"value":"de-LU"},{"value":"de-CH"},{"value":"el"},{"value":"el-GR"},{"value":"gu"},{"value":"gu-IN"},{"value":"he"},{"value":"he-IL"},{"value":"hi"},{"value":"hi-IN"},{"value":"hu"},{"value":"hu-HU"},{"value":"is"},{"value":"is-IS"},{"value":"id"},{"value":"id-ID"},{"value":"it"},{"value":"it-IT"},{"value":"it-CH"},{"value":"ja"},{"value":"ja-JP"},{"value":"kn"},{"value":"kn-IN"},{"value":"kk"},{"value":"kk-KZ"},{"value":"kok"},{"value":"kok-IN"},{"value":"ko"},{"value":"ko-KR"},{"value":"ky"},{"value":"ky-KG"},{"value":"lv"},{"value":"lv-LV"},{"value":"lt"},{"value":"lt-LT"},{"value":"mk"},{"value":"mk-MK"},{"value":"ms"},{"value":"ms-BN"},{"value":"ms-MY"},{"value":"mr"},{"value":"mr-IN"},{"value":"mn"},{"value":"mn-MN"},{"value":"no"},{"value":"nb-NO"},{"value":"nn-NO"},{"value":"pl"},{"value":"pl-PL"},{"value":"pt"},{"value":"pt-BR"},{"value":"pt-PT"},{"value":"pa"},{"value":"pa-IN"},{"value":"ro"},{"value":"ro-RO"},{"value":"ru"},{"value":"ru-RU"},{"value":"sa"},{"value":"sa-IN"},{"value":"sr-SP-Cyrl"},{"value":"sr-SP-Latn"},{"value":"sk"},{"value":"sk-SK"},{"value":"sl"},{"value":"sl-SI"},{"value":"es"},{"value":"es-AR"},{"value":"es-BO"},{"value":"es-CL"},{"value":"es-CO"},{"value":"es-CR"},{"value":"es-DO"},{"value":"es-EC"},{"value":"es-SV"},{"value":"es-GT"},{"value":"es-HN"},{"value":"es-MX"},{"value":"es-NI"},{"value":"es-PA"},{"value":"es-PY"},{"value":"es-PE"},{"value":"es-PR"},{"value":"es-ES"},{"value":"es-UY"},{"value":"es-VE"},{"value":"sw"},{"value":"sw-KE"},{"value":"sv"},{"value":"sv-FI"},{"value":"sv-SE"},{"value":"syr"},{"value":"syr-SY"},{"value":"ta"},{"value":"ta-IN"},{"value":"tt"},{"value":"tt-RU"},{"value":"te"},{"value":"te-IN"},{"value":"th"},{"value":"th-TH"},{"value":"tr"},{"value":"tr-TR"},{"value":"uk"},{"value":"uk-UA"},{"value":"ur"},{"value":"ur-PK"},{"value":"uz"},{"value":"uz-UZ-Cyrl"},{"value":"uz-UZ-Latn"},{"value":"vi"}
        ],
        "localization":"{\"AllItemsCheckedString\":\"All items checked\",\"ItemsCheckedString\":\"items checked\",\"CheckAllString\":\"Check All\"}",
        "selectedIndex":63
    }, null, null, $get("ctl00_eSSential_Header_eSSential_Login_ddlLanguage")); 
}); 
Sys.Application.add_init(function() { 
    $create(Telerik.Web.UI.RadTextBox, {
        "_displayText":"",
        "_focused":true,
        "_initialValueAsText":"",
        "_postBackEventReferenceScript":"setTimeout(\"__doPostBack(\\\\u0027ctl00$eSSential_Header$eSSential_Login$txtLogin\\\\u0027,\\\\u0027\\\\u0027)\", 0)",
        "_skin":"Default",
        "_validationText":"",
        "clientStateFieldID":"ctl00_eSSential_Header_eSSential_Login_txtLogin_ClientState",
        "enabled":true,
        "styles":{
            HoveredStyle: ["height:25px;width:131px;", "riTextBox riHover"],
            InvalidStyle: ["height:25px;width:131px;", "riTextBox riError"],
            DisabledStyle: ["height:25px;width:131px;", "riTe
        }
    });
});
//]]>

内容的提问来源于stack exchange,提问作者Andres Urrego Angel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:37:03