ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Macrotrends 历史金融数据提取实战:基于 browser-harness 的四种无浏览器抓取模式

Macrotrends 历史金融数据提取实战:基于 browser-harness 的四种无浏览器抓取模式 Macrotrends 历史金融数据提取实战基于 browser-harness 的四种无浏览器抓取模式【免费下载链接】browser-harnessBrowser Harness | Self-healing harness that enables LLMs to complete any task.项目地址: https://gitcode.com/gh_mirrors/br/browser-harnessMacrotrendshttps://www.macrotrends.net提供长期历史金融与经济图表数据覆盖股票 OHLCV 价格、市值、市盈率、营收、利润率、股息率、SP 500 指数、联邦基金利率、美债收益率、CPI、黄金价格等海量序列。本文基于本仓库agent-workspace/domain-skills/macrotrends/scraping.md的实战验证结论系统讲解在 browser-harness 项目中用纯 HTTP 方式无需启动浏览器提取这些数据的四种访问模式、完整可运行代码、字段含义与反爬注意事项。读完本文你将能够直接复制代码块抓取任意美股的历史行情与基本面数据、指数图表数据和经济指标时间序列。为什么 Macrotrends 只读任务不需要浏览器browser-harness 的核心定位是通过 CDP 直接控制真实浏览器完成交互型任务而它的 SKILL.md 明确写有一条原则A basic fetch of public information needs no browser. If a plain HTTP request can read it — a public page, an API, docs — usecurlor your fetch tool, and leave the browser alone.获取公开信息不需要浏览器能用普通 HTTP 读到的内容就用 HTTP把浏览器留给需要点击、输入、登录态、JS 渲染或反爬页面的场景。Macrotrends 的所有数据端点都满足这一判断它们要么是直接返回内嵌 JS 数组变量的 iframe PHP 页面要么是返回 JSON 的/economic-data/API全部可以通过http_get直接访问无需浏览器。本仓库的领域技能文档 scraping.md 对所有结果均已在真实站点上验证文档标注验证日期为 2026-04-18。http_get是 browser-harness 为纯 HTTP 无浏览器场景提供的现成辅助函数实现在 src/browser_harness/helpers.pydef http_get(url, headersNone, timeout20.0): Pure HTTP — no browser. Use for static pages / APIs. Wrap in ThreadPoolExecutor for bulk. When BROWSER_USE_API_KEY is set, routes through the fetch-use proxy (handles bot detection, residential proxies, retries). Falls back to local urllib otherwise. if os.environ.get(BROWSER_USE_API_KEY): try: from fetch_use import fetch_sync return fetch_sync(url, headersheaders, timeout_msint(timeout * 1000)).text except ImportError: pass import gzip h {User-Agent: Mozilla/5.0, Accept-Encoding: gzip} if headers: h.update(headers) with urllib.request.urlopen(urllib.request.Request(url, headersh), timeouttimeout) as r: data r.read() if r.headers.get(Content-Encoding) gzip: data gzip.decompress(data) return data.decode()从源码可以看到三个对本文至关重要的实现细节默认 UA 就是Mozilla/5.0——这与 Macrotrends 文档所有端点用默认 UA 即可的结论吻合自动处理 gzip 解压——/economic-data/API 返回 gzip 压缩的 JSONhttp_get已经内置解压逻辑设置了BROWSER_USE_API_KEY时自动路由到 fetch-use 代理——若你的抓取遇到反爬可在不修改代码的情况下通过代理通道获得住宅 IP、重试与机器人检测规避能力。另外领域技能中的from helpers import http_get来自 agent_helpers.py 的加载机制当BH_AGENT_WORKSPACE指向agent-workspace目录时helpers.py 的_load_agent_helpers()会把agent_helpers.py中定义的辅助函数动态注入browser_harness.helpers命名空间。领域技能文档即以此方式复用同一套 HTTP 工具。第一步根据目标数据选择访问模式Macrotrends 的数据分为四大类对应四种不同的访问模式文档给出的选择表如下表格中的延迟为文档实测值供参考目标模式延迟数据变量股票 OHLCV 价格历史直接 iframe PHP~190msdataDaily股票市值日频直接 iframe PHP~200mschartData股票基本面PE、营收、利润率直接 iframe PHP~140mschartDataSP 500 / 综合指数图表chart_iframe_comp.php~90msoriginalData经济指标利率、收益率、CPI/economic-data/JSON API~150msdata[]数组黄金、大宗商品价格两条路径均可~150msdata[]或originalData核心结论Macrotrends 只读任务绝不使用浏览器。所有端点均可用默认Mozilla/5.0UA 通过http_get访问只有个别页面偶尔返回 403 时才需要切换到 Chrome UA详见后文限流与反爬一节。Pattern 1股票价格历史OHLCV股票价格历史是最常用的数据其 iframe URL 可以直接构造无需先抓取主页面。URL 格式为https://www.macrotrends.net/production/stocks/desktop/PRODUCTION/stock_price_history.php?t{TICKER}yb{N}完整可运行代码如下import json, re from helpers import http_get def get_stock_ohlcv(ticker: str, years_back: int None) - list[dict]: Returns daily OHLCV records for any US stock. ticker: uppercase ticker symbol, e.g. AAPL, MSFT, TSLA, NVDA years_back: number of years of history (1~250 records, 15~3772 records). Omit (None) to get ALL available history (AAPL goes back to 1980). url fhttps://www.macrotrends.net/production/stocks/desktop/PRODUCTION/stock_price_history.php?t{ticker} if years_back: url fyb{years_back} html http_get(url) m re.search(rvar\sdataDaily\s*\s*\[, html) if not m: raise ValueError(fNo dataDaily found for ticker {ticker!r}) si html.index([, m.start()) bc 0 for j, ch in enumerate(html[si:], si): if ch [: bc 1 elif ch ]: bc - 1 if bc 0: ei j; break return json.loads(html[si:ei1]) # Usage records get_stock_ohlcv(AAPL, years_back15) # [{d: 2011-04-18, o: 9.771, h: 9.9547, l: 9.593, c: 9.9433, v: 18.275}, ...] latest records[-1] # {d: 2026-04-17, o: 266.96, h: 272.3, l: 266.72, c: 270.23, # v: 55.211, ma50: 260.554, ma200: 251.828} print(f{latest[d]}: close${latest[c]} vol{latest[v]}M shares)解析逻辑说明正则先定位var dataDaily [的位置然后用手写的括号计数bc找到与之配对的结束]最后把截取的 JSON 文本交给json.loads。这里特意不用re.DOTALL贪婪匹配是因为dataDaily数组可能高达 ~450KB3772 条 OHLCV 记录括号计数法是 O(n) 的线性扫描速度更快。dataDaily 字段参考字段含义类型d日期YYYY-MM-DDstro开盘价已按拆股调整str/floath最高价str/floatl最低价str/floatc收盘价str/floatv成交量单位百万股str/floatma5050 日均线str/float仅出现在近期记录中ma200200 日均线str/float仅出现在近期记录中注意所有价格值都是字符串需要自行float()转换。成交量单位是百万股55.211表示当日成交 5521.1 万股。已验证的 ticker2026-04-18 实测以下 ticker 均通过直接构造 iframe URL 验证成功无需先抓取主页面# All work: AAPL, MSFT, TSLA, NVDA, GOOGL, AMZN, META, NFLX, etc. # 3772 records for yb15 (goes back to 2011-04-18) # AAPL full history: 11428 records back to 1980-12-12Pattern 2股票基本面PE、营收、市值、利润率基本面数据分散在几个不同的 PHP 文件中均支持直接构造 URL。这些文件返回的都是var chartData [...]变量解析逻辑与 Pattern 1 完全一致。市值日频单位十亿美元import json, re from helpers import http_get def get_market_cap(ticker: str, years_back: int 15) - list[dict]: url fhttps://www.macrotrends.net/production/stocks/desktop/PRODUCTION/market_cap.php?t{ticker}yb{years_back} html http_get(url) m re.search(rvar\schartData\s*\s*\[, html) si html.index([, m.start()) bc 0 for j, ch in enumerate(html[si:], si): if ch [: bc 1 elif ch ]: bc - 1 if bc 0: ei j; break return json.loads(html[si:ei1]) data get_market_cap(AAPL) # [{date: 2026-04-15, v1: 3929.35}, {date: 2026-04-16, v1: 3884.67}, ...] # v1 market cap in billions USDPE 比率、营收、流动比率季度/年度基本面import json, re from helpers import http_get def get_fundamental(ticker: str, metric_type: str, statement: str, freq: str Q, years_back: int 15) - list[dict]: freq: Q quarterly, A annual url ( fhttps://www.macrotrends.net/production/stocks/desktop/PRODUCTION/ ffundamental_iframe.php?t{ticker}type{metric_type}statement{statement} ffreq{freq}subyb{years_back} ) html http_get(url) m re.search(rvar\schartData\s*\s*\[, html) si html.index([, m.start()) bc 0 for j, ch in enumerate(html[si:], si): if ch [: bc 1 elif ch ]: bc - 1 if bc 0: ei j; break return json.loads(html[si:ei1]) # PE ratio pe get_fundamental(AAPL, pe-ratio, price-ratios) # [{date: 2025-09-30, v1: 254.146, v2: 7.46, v3: 34.07}, ...] # v1 stock price, v2 quarterly EPS, v3 PE ratio # Revenue rev get_fundamental(AAPL, revenue, income-statement) # [{date: 2025-12-31, v1: 435.617, v2: 143.756, v3: 15.65}, ...] # v1 TTM revenue ($B), v2 quarterly revenue ($B), v3 YoY growth % # Total assets assets get_fundamental(AAPL, total-assets, balance-sheet) # Current ratio ratio get_fundamental(AAPL, current-ratio, ratios)注意fundamental_iframe.php的 URL 中sub是空参数保留占位freq取Q季度或A年度。不同type/statement组合返回的v1/v2/v3含义不同详见下文 Gotchas 的字段对照。利润率def get_profit_margins(ticker: str, years_back: int 15) - list[dict]: url ( fhttps://www.macrotrends.net/production/stocks/desktop/PRODUCTION/ ffundamental_metric.php?t{ticker}chartprofit-marginsubyb{years_back} ) html http_get(url) m re.search(rvar\schartData\s*\s*\[, html) si html.index([, m.start()) bc 0 for j, ch in enumerate(html[si:], si): if ch [: bc 1 elif ch ]: bc - 1 if bc 0: ei j; break return json.loads(html[si:ei1]) margins get_profit_margins(AAPL) # [{date: 2025-12-31, v1: 47.33, v2: 32.38, v3: 27.04}, ...] # v1 gross margin %, v2 operating margin %, v3 net margin %股息率def get_dividend_yield(ticker: str, years_back: int 15) - list[dict]: url fhttps://www.macrotrends.net/production/stocks/desktop/PRODUCTION/dividend_yield.php?t{ticker}yb{years_back} html http_get(url) m re.search(rvar\schartData\s*\s*\[, html) si html.index([, m.start()) bc 0 for j, ch in enumerate(html[si:], si): if ch [: bc 1 elif ch ]: bc - 1 if bc 0: ei j; break return json.loads(html[si:ei1]) dy get_dividend_yield(AAPL) # [{date: 2026-04-17, c: 270.23, ttm_d: 1.03848, ttm_dy: 0.3843}, ...] # c stock price, ttm_d TTM dividend ($), ttm_dy TTM yield (%)股票指标 URL 参考所有股票类端点共用同一个 URL 前缀https://www.macrotrends.net/production/stocks/desktop/PRODUCTION/并统一接收?t{TICKER}yb{N}参数基本面类多一个sub空参指标PHP 文件额外参数股票价格 OHLCVstock_price_history.php—市值日频market_cap.php—股息率dividend_yield.php—拆股含于价格历史stock_splits.php—PE 比率fundamental_iframe.phptypepe-ratiostatementprice-ratios营收fundamental_iframe.phptyperevenuestatementincome-statement总资产fundamental_iframe.phptypetotal-assetsstatementbalance-sheet流动比率fundamental_iframe.phptypecurrent-ratiostatementratios利润率fundamental_metric.phpchartprofit-marginPattern 3指数与综合图表SP 500、Shiller PE 等指数类页面如 SP 500 PE 比率、黄金百年价格把图表数据内嵌在chart_iframe_comp.php中数据变量名是originalData。与股票类不同这类 URL 需要页面 ID URL slug两个参数https://www.macrotrends.net/assets/php/chart_iframe_comp.php?id{page_id}url{url_slug}import json, re from helpers import http_get def extract_index_chart(page_id: int, url_slug: str) - list[dict]: page_id: the numeric ID from the page URL, e.g. 2577 url_slug: last segment of the page URL, e.g. sp500-pe-ratio-price-to-earnings-chart url fhttps://www.macrotrends.net/assets/php/chart_iframe_comp.php?id{page_id}url{url_slug} html http_get(url) m re.search(rvar\soriginalData\s*\s*\[, html) if not m: raise ValueError(originalData not found — this page may use a different pattern) si html.index([, m.start()) bc 0 for j, ch in enumerate(html[si:], si): if ch [: bc 1 elif ch ]: bc - 1 if bc 0: ei j; break return json.loads(html[si:ei1]) # SP 500 PE ratio (1180 monthly records, 1927-2026) pe_data extract_index_chart(2577, sp500-pe-ratio-price-to-earnings-chart) # [{date: 1927-12-01, close: 15.9099}, ..., {date: 2026-03-01, close: 27.8925}] # close is the PE ratio value # Gold prices (1336 monthly records, 1915-2026) gold_data extract_index_chart(1333, historical-gold-prices-100-year-chart) # [{id: GOLDAMGBD228NLBM, date: 1915-01-01, close: 629.36, close1: 19.250}, ...] # close inflation-adjusted price, close1 nominal USD price print(fLatest SP PE: {pe_data[-1]}) # {date: 2026-03-01, close: 27.8925} print(fLatest gold: {gold_data[-1]}) # {id: ..., date: 2026-04-01, close: 5177.19, close1: 5177.190}检测页面属于哪种模式不是所有macrotrends.net/NNNN/slug页面都用chart_iframe_comp.php——有些经济页面走generateChart()/economic-data/API。可以先抓主页面 HTML根据特征字符串判断def get_page_pattern(page_url: str) - str: html http_get(page_url) if chart_iframe_comp.php in html: return index_chart # use extract_index_chart() elif generateChart in html and highchartsURL in html: return economic_api # use get_economic_data() elif /production/stocks/desktop/PRODUCTION/ in html: return stock_iframe # use get_stock_ohlcv() etc. return unknown从页面 URL 提取 ID 和 slugimport re from helpers import http_get page_url https://www.macrotrends.net/2577/sp500-pe-ratio-price-to-earnings-chart html http_get(page_url) # Option A: parse from the iframe src in the HTML m re.search(rchart_iframe_comp\.php\?id(\d)url([^]), html) if m: page_id, url_slug int(m.group(1)), m.group(2) # Option B: derive from the page URL (works when slug matches) import urllib.parse parts page_url.rstrip(/).split(/) page_id int(parts[-2]) # 2577 url_slug parts[-1] # sp500-pe-ratio-price-to-earnings-chartPattern 4经济指标 JSON API使用generateChart()的页面其数据来自/economic-data/{pageID}/{freq}这个 JSON 端点。该端点要求Referer头必须匹配对应的页面 URL否则部分页面会返回 403。响应默认是 gzip 压缩的http_get已内置解压下面示例用标准库手写一遍以展示完整链路import json, datetime, gzip, urllib.request from helpers import http_get def get_economic_data(page_id: int, referer_url: str, freq: str D) - dict: page_id: numeric ID from the page URL (e.g. 2015 for Fed Funds Rate) referer_url: the full page URL — required as Referer header freq: D daily, M monthly (not all support both) Returns {data: [[ts_ms, value], ...], metadata: {...}} url fhttps://www.macrotrends.net/economic-data/{page_id}/{freq} headers { User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36, Accept: application/json, */*, Accept-Encoding: gzip, Referer: referer_url, } with urllib.request.urlopen(urllib.request.Request(url, headersheaders), timeout20) as r: raw r.read() if r.headers.get(Content-Encoding) gzip: raw gzip.decompress(raw) result json.loads(raw) if result is None: raise ValueError(fpageID{page_id} does not support freq{freq!r}) return result # Fed Funds Rate (daily, 25319 records) ffr get_economic_data(2015, https://www.macrotrends.net/2015/fed-funds-rate-historical-chart, freqD) print(ffr[metadata][name]) # Fed Funds Interest Rate print(ffr[metadata][label]) # % # Convert timestamps to dates for ts_ms, value in ffr[data][-3:]: dt datetime.datetime.fromtimestamp(ts_ms / 1000, datetime.UTC) print(f{dt.strftime(%Y-%m-%d)}: {value}%) # 2026-04-13: 3.64% # 2026-04-14: 3.64% # 2026-04-15: 3.64% # 10-Year Treasury yield (daily, 16074 records) t10 get_economic_data(2016, https://www.macrotrends.net/2016/10-year-treasury-bond-rate-yield-chart, freqD) # Last: 2026-04-15: 4.29% # Gold prices (monthly, 1336 records, 1915-present) — template5 gold get_economic_data(1333, https://www.macrotrends.net/1333/historical-gold-prices-100-year-chart, freqM) # metadata: {name: Gold Prices, currency: $, label: } # US Unemployment Rate (monthly, 938 records) unemp get_economic_data(1316, https://www.macrotrends.net/1316/us-national-unemployment-rate, freqM) # metadata: {name: U.S. Unemployment Rate, label: %} # Debt-to-GDP ratio (monthly, 712 records) debt_gdp get_economic_data(1381, https://www.macrotrends.net/1381/debt-to-gdp-ratio-historical-chart, freqM)返回结构是{data: [[毫秒时间戳, 数值], ...], metadata: {...}}data内的时间戳需除以 1000 后转 datetime。metadata 字段说明{ name: Fed Funds Interest Rate, # chart title tableHeaderName: Fed Funds Interest Rate, currency: , # $ for dollar-denominated series label: %, # units label chartType: line, mobileChartType: line, lineWidth: 2, positiveColor: #2caffe, negativeColor: , decimals: , chartScale: linear, seriesUnits: }其中name图表标题、currency美元计价序列为$、label单位标签如%是最常用于校验数据正确性的字段。可用频率代码代码含义备注D日频大多数序列支持M月频不可用时返回nullQ季频通常为null——用M代替A年频通常为null——用M代替DEFAULT默认通常是月频大多数序列与M相同INDEXMONTHLY月度指数收盘部分商品/指数序列INDEXDAILY日度指数部分序列DAILYEXCHANGERATE日频外汇汇率货币对10YD10 年日频专门序列实操建议先试D得到null再回退到M。大多数经济序列只有D和M稳定返回数据Q、A对多数指标都返回null。已知经济页面 IDIDURL slug描述1316us-national-unemployment-rate美国失业率月频回溯至 1948 年1333historical-gold-prices-100-year-chart黄金价格月频回溯至 1915 年1381debt-to-gdp-ratio-historical-chart美国债务/GDP 比率2015fed-funds-rate-historical-chart联邦基金利率日频回溯至 1954 年201610-year-treasury-bond-rate-yield-chart10 年期美债收益率日频回溯至 1962 年2577sp500-pe-ratio-price-to-earnings-chartSP 500 PE 比率使用chart_iframe_comp.php通用提取辅助函数前面四个模式的解析逻辑高度一致正则定位变量名 → 括号计数找到数组边界 →json.loads可以收敛为一个通用函数一次性覆盖dataDaily、chartData、originalData三种内嵌 JS 变量import json, re from helpers import http_get def extract_chart_var(html: str, var_name: str) - list: Extract a JS array variable from Macrotrends iframe HTML. m re.search(rfvar\s{re.escape(var_name)}\s*\s*\[, html) if not m: return [] si html.index([, m.start()) bc 0 for j, ch in enumerate(html[si:], si): if ch [: bc 1 elif ch ]: bc - 1 if bc 0: return json.loads(html[si:j1]) return [] # Works for dataDaily, chartData, or originalData: html http_get(https://www.macrotrends.net/production/stocks/desktop/PRODUCTION/stock_price_history.php?tAAPLyb15) daily extract_chart_var(html, dataDaily) html2 http_get(https://www.macrotrends.net/assets/php/chart_iframe_comp.php?id2577urlsp500-pe-ratio-price-to-earnings-chart) pe_data extract_chart_var(html2, originalData)URL 构造速查股票类页面STOCK_BASE https://www.macrotrends.net/production/stocks/desktop/PRODUCTION/ # Price history OHLCV f{STOCK_BASE}stock_price_history.php?t{ticker} # all history f{STOCK_BASE}stock_price_history.php?t{ticker}yb{years} # last N years # Market cap f{STOCK_BASE}market_cap.php?t{ticker}yb{years} # Fundamentals f{STOCK_BASE}fundamental_iframe.php?t{ticker}type{type}statement{stmt}freq{freq}subyb{years} # type/statement combos: pe-ratio/price-ratios, revenue/income-statement, # total-assets/balance-sheet, current-ratio/ratios # Metrics f{STOCK_BASE}fundamental_metric.php?t{ticker}chart{metric}subyb{years} # metrics: profit-margin # Dividend yield f{STOCK_BASE}dividend_yield.php?t{ticker}yb{years}经济 / 指数页面# From numeric ID URL slug (read from page source or page URL) fhttps://www.macrotrends.net/assets/php/chart_iframe_comp.php?id{id}url{slug} # Economic indicator JSON API (requires Referer header) fhttps://www.macrotrends.net/economic-data/{page_id}/{freq}限流与反爬实测结论根据文档在 2026-04-18 的实测未观察到任何限流对同一股票 iframe 连续发起 10 次快速请求总耗时 1.8 秒没有触发限速、验证码或 429 错误默认 UAMozilla/5.0对绝大多数端点可用所有 iframe PHP 数据文件从未出现 403部分主页面 HTML 需要 Chrome UA抓取/stocks/charts/...或/2015/...这类包装页遇到 403 时切换为headers {User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36}/economic-data/{id}/{freq}必须携带Referer把页面 URL 放进Referer头缺少时请求虽然被放行但部分页面会返回 403任何端点都不需要 cookie、会话或鉴权 token。如果本地直连仍遇到反爬拦截还可以利用 http_get 的代理路由能力设置BROWSER_USE_API_KEY环境变量后http_get会自动改走 fetch-use 代理提供机器人检测规避、住宅代理与重试代码本身无需改动。Gotchas容易踩的坑主页面 URL ≠ 数据页面 URL。部分 URL 会重定向到其他内容例如/1316/us-national-debt-by-year实际会重定向到/1316/us-national-unemployment-rate。如果返回的数据看起来不对务必检查最终 URLr.url并把最终 URL 作为Referer。yb参数控制历史深度yb1→ 约 250 条记录最近一年yb15→ 约 3772 条记录最近 15 年省略 → 全部历史AAPL 有 11428 条记录回溯至 1980 年对大多数查询这也是默认行为经济页面存在两种 iframe 模式。macrotrends.net/NNNN/slug页面要么用chart_iframe_comp.php变量是originalData要么用generateChart/economic-data/API。抓主页面 HTML 判断if chart_iframe_comp.php in html: # use extract_index_chart() elif highchartsURL in html: # use get_economic_data()黄金数据有两列价格{id: GOLDAMGBD228NLBM, date: 2026-04-01, close: 5177.19, close1: 5177.190} # close inflation-adjusted price (base year adjusts over time) # close1 nominal USD price (the raw market price)经济 API 的频率代码。只有D和M在大多数序列上稳定返回数据A、Q对多数经济指标返回null。优先试D。chartData的字段随指标变化market_cap.php→{date, v1}v1 市值单位十亿美元fundamental_iframe.phptypepe-ratio →{date, v1, v2, v3}股价、EPS、PEfundamental_iframe.phptyperevenue →{date, v1, v2, v3}TTM 营收、季度营收、同比增速 %fundamental_metric.phpchartprofit-margin →{date, v1, v2, v3}毛利率 %、营业利润率 %、净利率 %dividend_yield.php→{date, c, ttm_d, ttm_dy}股价、TTM 股息、TTM 股息率 %大数组必须用括号计数。股票 iframe 的var dataDaily [...]约 450KB、3772 条 OHLCV 记录。re.DOTALL贪婪正则虽然能工作但很慢本文所有示例采用的bc括号计数法是 O(n) 线性扫描速度快得多。没有公开的 ticker 查询 API。如果需要查找公司 slug可访问搜索端点https://www.macrotrends.net/production/stocks/desktop/PRODUCTION/ticker_search_list.php?vYYYYMMDD但股票价格 iframe 只需要 ticker 符号?tAAPL不需要 slug。与 browser-harness 的协作边界最后回到 harness 的整体使用边界本技能文档只解决 Macrotrends 的只读数据提取场景全程用http_get即可。按照 SKILL.md 的指引只有当任务升级为交互型操作例如需要在 Macrotrends 页面上点击图表控件、滚动加载、操作已登录会话时才应升级到浏览器模式——而此时可以从 helpers.py 中按需调用new_tab、goto_url、js、click_at_xy等 CDP 辅助函数。日常的批量抓取如用ThreadPoolExecutor并发拉取多只股票则完全落在http_get的职责范围内既不消耗浏览器资源也不会触发任何浏览器级反爬。【免费下载链接】browser-harnessBrowser Harness | Self-healing harness that enables LLMs to complete any task.项目地址: https://gitcode.com/gh_mirrors/br/browser-harness创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表