Jsonp
今天寫爬蟲抓取上海科創板數據時發現其接口是通過Jsonp來獲取的,於是對此進行了下了解。
什么是Jsonp
JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式,而JSONP(JSON with Padding)則是JSON 的一種“使用模式”,通過這種模式可以實現數據的跨域獲取。
Jsonp跨域的原理
在同源策略下,在某個服務器下的頁面是無法獲取到該服務器以外的數據的,但img、iframe、script等標簽是個例外,這些標簽可以通過src屬性請求到其他服務器上的數據。利用script標簽的開放策略,我們可以實現跨域請求數據,當然,也需要服務端的配合。當我們正常地請求一個JSON數據的時候,服務端返回的是一串JSON類型的數據,而我們使用JSONP模式來請求數據的時候,服務端返回的是一段可執行的JavaScript代碼。
實例
我們要跨域請求某個服務器上的數據:
{ "name":"Bill Gates", "age":62, "city":"Seattle" }
為了方便舉例實現,我在可用的服務器上放置了一個靜態文件,其內容為:
foo({ "name":"Bill Gates", "age":62, "city":"Seattle" });
然后,我寫了一個簡單的html進行測試,使用ajax 獲取jsonp數據實現數據的跨域請求:
<html>
<head>
<script src="https://cdn.staticfile.org/jquery/3.4.1/jquery.min.js"></script>
</head>
<div>
<button onclick="self_test()">test</button>
</div>
<script>
function foo(data) {
console.log(data)
}
function self_test() {
$.ajax({
type: "get",
url: 'http://d.epmap.org/static/test.txt?callback=?',
dataType: "jsonp",
success: function(data) {
}
})
}
</script>
</html>
打開測試html頁面,打開調試工具,然后點擊test按鈕,可以看到如下結果:
參考:jquery ajax jsonp
github jsonp的介紹及使用