【JavaScript】讀取商品頁面中的結構化數據(JSON-LD),在不改動服務端情況下,實現一對一跳轉

前端實踐:從商品頁面讀取 mpn 并實現一對一跳轉

在實際開發中,我們經常會遇到這樣一種需求:
用戶瀏覽 A 網站的商品頁面后,點擊按鈕能夠直接跳轉到 B 網站的對應商品。

表面看似只是一個按鈕跳轉,但如果不同商品需要精確映射,就必須找到每個商品的唯一標識。這時,很多電商頁面都會通過 結構化數據(JSON-LD) 提供關鍵信息,例如 mpn(Manufacturer Part Number,制造商零件號)。


1. 問題背景

  • 我需要在商品詳情頁中獲取唯一標識 mpn,并基于它拼接目標商店的跳轉鏈接。
  • 頁面本身是第三方的,不能直接改動服務端返回的數據。
  • 目標效果:隱藏原始「加入購物車 / 立即購買」按鈕,替換為一個自定義按鈕,點擊后跳轉到另一個電商平臺(例如 DHgate)的對應商品。

2. 數據獲取的波折

一開始,我嘗試直接在頁面 DOM 中尋找 mpn

  • document.querySelector() 去找標簽 → 失敗
  • meta 標簽里查找 → 失敗
  • 在頁面可見文本里搜索 → 失敗

直到我注意到頁面 <head> 區域存在大量 <script type="application/ld+json"> 標簽,這是用于 SEO 的結構化數據。
里面通常包含:

{"@context": "https://schema.org/","@type": "Product","name": "Luxury Custom Handmade Watch","mpn": "123456789","brand": {"@type": "Brand","name": "Artisan Watches"}
}

注解:
JSON-LD(JavaScript Object Notation for Linked Data)是 Google 推薦的結構化數據標注方式。
電商網站會用它向搜索引擎說明商品屬性,比如:名稱、價格、庫存、SKU、MPN 等。

這意味著 最佳的獲取方式是解析 JSON-LD,而不是從 DOM 樹中“扒值”。


3. 解決方案:解析 JSON-LD 提取 mpn

代碼實現如下:

// 獲取所有 JSON-LD 腳本標簽
const ldJsonScripts = document.querySelectorAll('script[type="application/ld+json"]');let mpnValue = null;// 遍歷解析 JSON,找到 Product 類型的 mpn
ldJsonScripts.forEach(script => {try {const jsonData = JSON.parse(script.textContent);if (jsonData["@type"] === "Product" && jsonData.mpn) {mpnValue = jsonData.mpn;}} catch (e) {console.error("解析 JSON-LD 出錯:", e);}
});

這樣就能穩健地提取出 mpn 值。


4. 替換默認按鈕并添加跳轉邏輯

由于目標是 一對一跳轉,我需要屏蔽原有的購物入口,改為跳轉到目標鏈接。

4.1 隱藏原有按鈕

原始按鈕 ID 具有統一前綴(如 add-cart-xxxbuynow-xxx),所以通過前綴匹配批量隱藏:

function hideElementsWithPrefix(prefix) {const allElements = document.getElementsByTagName('*');for (let element of allElements) {if (element.id && element.id.startsWith(prefix)) {element.style.display = 'none';}}
}

并且定時執行,防止異步加載的按鈕漏網:

setInterval(() => {hideElementsWithPrefix('add-cart-');hideElementsWithPrefix('buynow-');
}, 1000);

4.2 添加自定義按鈕

const customButton = document.createElement('button');
customButton.textContent = 'Buy Now on DHgate';
customButton.style.cssText = `background-color: #D4AF37;color: white;border: none;padding: 12px 24px;font-size: 16px;font-weight: bold;border-radius: 6px;cursor: pointer;margin: 10px 0;transition: background-color 0.3s ease;
`;// 懸停效果
customButton.addEventListener('mouseover', () => customButton.style.backgroundColor = '#C89A2E');
customButton.addEventListener('mouseout', () => customButton.style.backgroundColor = '#D4AF37');// 點擊跳轉
customButton.addEventListener('click', () => {const targetUrl = `https://www.dhgate.com/product/french-artisanal-luxury-exquisite-custom/${mpnValue}.html?`;window.location.assign(targetUrl);// 備份方案:防止 assign 失敗setTimeout(() => {if (window.location.href !== targetUrl) {window.location.href = targetUrl;}}, 100);
});

插入到頁面:

const insertionPoint = document.querySelector('.product-cart-group') ||document.querySelector('.main_btn').parentNode ||document.body;insertionPoint.appendChild(customButton);

5. 最終效果

  • 頁面原有的「加入購物車 / 立即購買」按鈕被隱藏。
  • 出現一個新的金色按鈕 “Buy Now on DHgate”
  • 點擊時,根據當前頁面解析到的 mpn 值,自動拼接跳轉鏈接并跳轉。

例如:

https://www.dhgate.com/product/french-artisanal-luxury-exquisite-custom/123456789.html

非常好 👍
你提到的這一點非常關鍵:作為后端,很多人會覺得前端拿個值“應該很簡單”,但實際落到細節上,經常會踩坑。
你經歷 mpn 的抓取,就是一個典型的前端數據獲取思路問題。

下面我以“從一個商品頁面獲取關鍵數據”為引,系統整理前端常見的數據抓取手段,帶例子和注解。


前端數據抓取手段

前端里,想要拿到一個頁面的數據,不一定總是 document.querySelector("#id") 那么直白。


1. 直接 DOM 查詢

最直觀的方法就是 通過選擇器直接查找元素

// 通過 ID
const price = document.querySelector("#product-price").textContent;// 通過 class
const title = document.querySelector(".product-title").innerText;// 通過標簽層級
const stock = document.querySelector("div.product-info span.stock").innerText;

注解:

  • 如果頁面是 SSR(服務端渲染),DOM 一開始就有數據,這是最快捷的方式。
  • 但對于 SPA(單頁應用),很多內容是后續 JS 渲染的,需要等 window.onloadMutationObserver

2. 結構化數據(JSON-LD、Microdata、RDFa)

之前遇到的 mpn,就是嵌在 <script type="application/ld+json"> 里的。

const scripts = document.querySelectorAll('script[type="application/ld+json"]');
scripts.forEach(s => {try {const json = JSON.parse(s.textContent);if (json["@type"] === "Product") {console.log(json.mpn, json.sku, json.brand?.name);}} catch (e) {}
});

注解:

  • 這種方式對 SEO 友好,Google / Bing / 電商比價插件都會用。
  • 如果在做 商品比對 / 跨站跳轉 / 爬蟲,這是最可靠的切入點。

3. 隱藏在 meta 標簽 / 屬性中

一些頁面會把關鍵數據放在 <meta>data-* 屬性里,給搜索引擎或前端腳本用。

例子:meta 標簽

<meta property="product:price:amount" content="99.99">
<meta property="product:sku" content="A12345">

獲取:

const price = document.querySelector('meta[property="product:price:amount"]').content;
const sku = document.querySelector('meta[property="product:sku"]').content;

例子:data-* 屬性

<button id="buyBtn" data-sku="A12345" data-stock="20">Buy Now</button>

獲取:

const btn = document.getElementById("buyBtn");
console.log(btn.dataset.sku);   // "A12345"
console.log(btn.dataset.stock); // "20"

注解:

  • data-* 是 HTML5 規范推薦的“私有數據通道”,比 id / class 更穩定。
  • 在電商、新聞站、CMS 里很常見。

4. 頁面內嵌 JSON 配置(window 變量 / inline script)

有些網站在 <script> 里會直接掛一個全局對象,供頁面其他 JS 使用。

例子:

<script>window.__INITIAL_STATE__ = {product: {id: "12345",name: "Luxury Watch",price: 299.99,mpn: "XYZ987"}};
</script>

獲取:

console.log(window.__INITIAL_STATE__.product.mpn);

注解:

  • SPA 框架(React/Vue/Next.js)經常這么做,把后端數據注入到頁面里。
  • 在 f12 → Console 輸入 window,多翻幾頁,常能挖到完整的數據結構。

5. Ajax / Fetch 請求攔截

很多頁面并不是直接渲染,而是前端在加載時通過 Ajax/FETCH 請求接口。
這類數據可以直接抓接口,而不是“扒 DOM”。

例子:

商品頁打開時,瀏覽器可能會請求:

GET https://api.shop.com/product/12345

返回:

{"id": "12345","title": "Luxury Watch","price": "299.99","mpn": "XYZ987"
}

在前端可以這樣攔截:

// 重寫 fetch
const originalFetch = window.fetch;
window.fetch = async (...args) => {const response = await originalFetch(...args);if (args[0].includes("/product/")) {response.clone().json().then(data => {console.log("抓到商品數據:", data);});}return response;
};

注解:

  • 這是 最穩定 的方案,因為你直接拿到原始 JSON 數據。
  • 后端開發者更熟悉接口,所以只要能找到 API 請求,比 DOM 抓取更靠譜。
  • 在 DevTools → Network 里找 XHR / Fetch,常能發現目標接口。

6. 監聽 DOM 變化(MutationObserver)

如果頁面異步渲染(比如 React/Vue 延遲加載),DOM 里可能一開始沒有數據。
這時需要用 MutationObserver 來監聽節點變化。

const observer = new MutationObserver(mutations => {const priceNode = document.querySelector(".product-price");if (priceNode) {console.log("價格:", priceNode.textContent);observer.disconnect(); // 拿到后停止監聽}
});observer.observe(document.body, { childList: true, subtree: true });

注解:

  • 適合異步加載的 SPA。
  • setInterval 更優雅,但邏輯復雜一些。

7. Canvas / Shadow DOM / 加密數據(特殊情況)

一些網站會反爬蟲,把數據寫在:

  • Canvas 渲染出來(你只能截圖識別)
  • Shadow DOM(需要穿透 .shadowRoot
  • Base64 / 加密字符串(要解碼/解密)

這種情況屬于“反爬蟲”范疇,日常不常見,但電商/金融站點有時會遇到。


總結

方法特點適用場景難度
DOM 選擇器直觀,容易寫靜態頁面、SSR?
JSON-LD / Microdata結構化,標準化商品詳情、SEO 站點??
meta / data-*隱藏但容易讀電商、CMS??
window 全局變量完整數據,格式化React/Vue 注水頁面??
Ajax / Fetch原始 JSON,最穩定SPA、電商 API???
MutationObserver處理異步渲染Vue/React 延遲加載???
Canvas / Shadow DOM反爬蟲用金融、電商防護????

建議的思路是:

  1. 優先找 API(最干凈的 JSON);
  2. 找不到 API → 看 JSON-LD / meta / data-*;
  3. 再不行 → 掃 window 全局變量;
  4. 實在沒有 → MutationObserver、模擬渲染、甚至 OCR。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/920981.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/920981.shtml
英文地址,請注明出處:http://en.pswp.cn/news/920981.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

HTML5實現好看的邀請函網頁源碼

HTML5實現好看的邀請函網頁源碼 前言一、設計來源1.1 邀請函主頁1.2 邀請函活動信息1.3 邀請函內容1.4 邀請函活動地址1.5 邀請函活動流程1.6 邀請函活動獎勵1.7 邀請函聯系我們 二、效果和源碼2.1 動態效果2.2 源代碼 結束語 HTML5實現好看的邀請函網頁源碼&#xff0c;酷炫的…

傳輸層TCP 與 安全層SSL/TLS

本章節主要探討三個問題&#xff1a;1. SSL/TSL 的區別和聯系是什么&#xff1f;2. 我們常說的 “三次握手” 發生在哪個階段&#xff0c;SSL/TSL層有參與嗎?3. HTTPS混合加密發生在哪個層?一、SSL 和 TLS 聯系繼承關系&#xff1a;TLS 直接基于 SSL 3.0 設計&#xff0c;可以…

【數學建模學習筆記】時間序列分析:ARIMA

零基礎看懂 ARIMA 模型&#xff1a;從原理到實戰如果你完全沒接觸過 “時間序列預測”&#xff0c;也不懂復雜公式&#xff0c;這篇會用 “說人話” 的方式幫你搞懂 ARIMA 模型&#xff0c;以及文中代碼到底在做什么。一、先搞懂&#xff1a;ARIMA 是用來干嘛的&#xff1f;簡單…

【macOS】垃圾箱中文件無法清理的“含特殊字符文件名”的方法

【macOS】垃圾箱中文件無法清理的“含特殊字符文件名”的方法文件名包含特殊字符&#xff08;如空格、中文符號等&#xff09;導致終端無法正確識別文件路徑。 可以嘗試以下解決方法&#xff1a;使用文件路徑自動補全輸入 rm &#xff08;注意 rm 后有空格&#xff09;&#xf…

???????Blender 重拓撲修改器實戰指南:從基礎操作到細節優化?

在 Blender 建模中&#xff0c;重拓撲是解決 “高模難編輯、低模細節差” 的關鍵。傳統手動重拓撲效率低&#xff0c;重拓撲修改器能自動生成規整拓撲&#xff0c;保留模型外形&#xff0c;適合游戲資產、動畫角色等場景。 一、核心作用與適用場景? 重拓撲修改器并非 “一鍵完…

C/C++哆啦A夢

寫在前面 用代碼繪制童年記憶中的那個藍胖子——哆啦A夢&#xff0c;是我對經典角色的一次深情致敬。這段程序不僅是一幅靜態圖像的生成&#xff0c;更是一次對童年幻想世界的數字重建。通過精確的幾何控制與色彩搭配&#xff0c;我將那個圓潤可愛、溫暖可靠的機器人重新帶回眼…

CSS入門指南:30字掌握核心技巧

1. CSS初體驗 1.1. CSS定義 層疊樣式表 (Cascading Style Sheets&#xff0c;縮寫為 CSS&#xff09; 用來描述 HTML 文檔的呈現&#xff08;美化內容&#xff09; 1.2. CSS引入方式 內部樣式表&#xff1a;學習使用 CSS 代碼寫在head里面的 style標簽 里面 外部樣式表&…

從實操到原理:一文搞懂 Docker、Tomcat 與 k8s 的關系(附踩坑指南 + 段子解疑)

目錄 一、先分清&#xff1a;Docker、Tomcat、k8s 到底是 “干啥的”&#xff1f; 二、它們的 “合作關系”&#xff1a;從 Java 項目到集群部署的全流程 三、實際應用場景&#xff1a;什么時候該用誰&#xff1f; 1. 單獨使用場景 2. 組合使用場景&#xff08;最常見&…

測試覆蓋率不夠高?這些技巧讓你的FastAPI測試無懈可擊!

url: /posts/0577d0e24f48b3153b510e74d3d1a822/ title: 測試覆蓋率不夠高?這些技巧讓你的FastAPI測試無懈可擊! date: 2025-09-02T01:49:10+08:00 lastmod: 2025-09-02T01:49:10+08:00 author: cmdragon summary: FastAPI通過TestClient工具支持單元測試,模擬HTTP請求直接…

Qwen3-Reranker-0.6B 模型結構

模型加載 import torch from modelscope import AutoModel, AutoTokenizer, AutoModelForCausalLMtokenizer AutoTokenizer.from_pretrained("Qwen/Qwen3-Reranker-0.6B", padding_sideleft) model AutoModelForCausalLM.from_pretrained("Qwen/Qwen3-Reranke…

無參 MOS 算法的評估方式

一、無參 MOS 算法 在音頻處理和質量評估領域&#xff0c;MOS&#xff08;Mean Opinion Score&#xff09;是一種常用的主觀評價指標&#xff0c;用于衡量音頻質量。然而&#xff0c;獲取主觀 MOS 評分通常需要大量的人力和時間。因此&#xff0c;無參 MOS 算法應運而生&#…

Flowable——配置使用Flowable-UI

文章目錄 前言 框架選型與版本 flowable-ui 搭建 依賴引入 springboot 主要版本 flowable 相關 log4j 日志配置項 配置文件 log4j配置文件 application.yml 增加啟動類并啟動程序 項目整體結構 前言 最近對工作流的flowable比較感興趣,匯總記錄一下相關的研究學習知識點。 框…

2025大學生必考互聯網行業證書排名?

在互聯網行業蓬勃發展的當下&#xff0c;大學生若想畢業后順利投身其中&#xff0c;提前考取相關高含金量證書不失為明智之舉。這些證書不僅能證明專業能力&#xff0c;還能在求職時為你增添競爭優勢。接下來&#xff0c;為大家詳細介紹 2025 年大學生必考的互聯網行業證書排名…

【并發系列-01】高并發系統架構設計原理

【并發系列-01】高并發系統架構設計原理 1. 業務場景&#xff1a;當雙11遇上技術挑戰 1.1 問題場景描述 想象一下這樣的場景&#xff1a;某電商平臺在雙11期間&#xff0c;短短30分鐘內涌入了500萬用戶&#xff0c;同時發起了超過2000萬次商品查詢請求和100萬次下單操作。而平時…

【Vue2 ?】Vue2 入門之旅(八):過渡與動畫

前幾篇我們學習了事件處理。本篇將介紹 過渡與動畫&#xff0c;讓 Vue 頁面更加生動。 目錄 transition 組件進入與離開過渡過渡類名結合 CSS 動畫JavaScript 鉤子小結 transition 組件 Vue 提供了內置組件 <transition>&#xff0c;可以為元素或組件的進入和離開添加動…

【LeetCode】力扣刷題攻略路線推薦!適合新手小白入門~(含各類題目序號)

力扣上有許多數據結構及算法的練習&#xff0c;但是如果由第一題【兩數之和】開始刷&#xff0c;會讓50%的人倒在起點。所以我們刷題要講究路線攻略以及技巧~大體路線方向由簡入難數學數組鏈表字符串哈希表雙指針遞歸棧隊列樹圖與回溯算法貪心動態規劃刷題技巧 建議刷題的時候分…

Windows 電腦發現老是自動訪問外網的域名排障步驟

Windows 電腦發現老是自動訪問外網的域名,如何排障 一、基礎信息獲取與進程定位 1.1、確認進程關鍵信息 1.2、進程合法性初步驗證 二、網絡連接深度分析 2.1、目的IP/域名溯源 2.2、端口與協議檢查 三、進程行為與系統異常排查 3.1、進程啟動與依賴分析 3.2、系統異常行為掃描…

curl、python-requests、postman和jmeter的對應關系

一、初識curlcurl 是一個功能強大的命令行工具&#xff0c;用于傳輸數據&#xff0c;支持多種協議&#xff08;如 HTTP、HTTPS、FTP 等&#xff09;。分析以下curl&#xff1a;curl "https://$HOST/mon/adm/au/opera" --header "Authorization: $AUTH" -X …

【MySQL】初識數據庫基礎

【MySQL】初識數據庫基礎 &#x1f525;個人主頁&#xff1a;大白的編程日記 &#x1f525;專欄&#xff1a;MySQL筆記 文章目錄【MySQL】初識數據庫基礎前言一. 數據庫基礎&#xff08;重點&#xff09;1.1 什么是數據庫1.2 主流數據庫1.3 基本使用1.3.1 MySQL安裝1.3.2 連接…

微服務Docker-compose之若依部署

目錄 1.創建一個文件夾 2.上傳壓縮包 3.解壓 4.執行ry1文件 5.執行ry2文件 6.進入nginx的html目錄解壓dist文件 7.執行ry3文件 8.訪問nacos 9.訪問若依 1.創建一個文件夾 2.上傳壓縮包 3.解壓 4.執行ry1文件 5.執行ry2文件 6.進入nginx的html目錄解壓dist文件 7.執行ry…