摘要:如何利用網(wǎng)頁(yè)請(qǐng)求暴露出來(lái)的接口去抓取網(wǎng)頁(yè)數(shù)據(jù)很多爬蟲(chóng)都能實(shí)現(xiàn)這個(gè)功能??缬蛲ㄐ艜r(shí),瀏覽器會(huì)報(bào)如下錯(cuò)誤其實(shí)這兩個(gè)問(wèn)題都是由于跨域造成的。結(jié)果這些數(shù)據(jù)可以在請(qǐng)求成功會(huì)傳回本地。
如何利用網(wǎng)頁(yè)ajax請(qǐng)求暴露出來(lái)的接口去抓取網(wǎng)頁(yè)數(shù)據(jù)?很多爬蟲(chóng)都能實(shí)現(xiàn)這個(gè)功能。不過(guò)今天要來(lái)和大家八一八單從前端的角度,利用js解決這個(gè)問(wèn)題。
大家都知道,在不同域的情況下是不能發(fā)送ajax請(qǐng)求的,瀏覽器會(huì)報(bào)如下錯(cuò)誤:
同時(shí),內(nèi)嵌的iframe中無(wú)法進(jìn)行跨域通信的,也就是說(shuō)不同域的iframe是無(wú)法互相讀取數(shù)據(jù)的(當(dāng)然利用hash變化可以從父window傳入數(shù)據(jù)到子iframe,不過(guò)并沒(méi)有什么意義)。iframe跨域通信時(shí),瀏覽器會(huì)報(bào)如下錯(cuò)誤:
其實(shí)這兩個(gè)問(wèn)題都是由于跨域造成的。
下面就介紹如何解決這個(gè)問(wèn)題。
其實(shí)問(wèn)題的關(guān)鍵就在于,瀏覽器在解析ajax請(qǐng)求地址時(shí)會(huì)和當(dāng)前網(wǎng)頁(yè)的地址進(jìn)行比較,如果是跨域的,那就禁止掉并且報(bào)錯(cuò)。那么我們?nèi)绻尀g覽器解析出的ajax地址和當(dāng)前網(wǎng)頁(yè)的解析地址一樣,瀏覽器不就不會(huì)禁止我們的請(qǐng)求了么。
那么瀏覽器是如何解析url的呢?
首先當(dāng)瀏覽器訪(fǎng)問(wèn)一個(gè)域名時(shí),會(huì)查詢(xún)本地的DNS緩存中是否有關(guān)于這個(gè)網(wǎng)址對(duì)應(yīng)ip地址,如果有的話(huà),直接從本地取得ip地址然后訪(fǎng)問(wèn),如果沒(méi)有,瀏覽器就會(huì)向DNS服務(wù)器發(fā)出DNS請(qǐng)求獲得該域名對(duì)應(yīng)的ip地址然后存入本地緩存然后訪(fǎng)問(wèn)。
那么介于以上問(wèn)題,我們只要在本地偽造一條域名的解析方式,然后再通過(guò)偽造的域和目標(biāo)域進(jìn)行跨域請(qǐng)求不就可以了么。
windows下的打開(kāi)C:WindowsSystem32driversetc
這個(gè)文件夾下有一個(gè)hosts文件,如果改過(guò)hosts來(lái)上谷歌的同學(xué)對(duì)這個(gè)應(yīng)該很熟悉,在hosts文件里加上這樣一段代碼:
127.0.0.1 a.目標(biāo)網(wǎng)址.com
這樣你的訪(fǎng)問(wèn)a.目標(biāo)網(wǎng)址.com就和訪(fǎng)問(wèn)localhost一樣了,這樣做的目的是方便搭起本地的服務(wù)時(shí),本地的服務(wù)和目標(biāo)的域名之間就不會(huì)存在跨域問(wèn)題了,這樣就能在本地,通過(guò)在目標(biāo)網(wǎng)頁(yè)植入iframe標(biāo)簽的方式,向目標(biāo)域發(fā)起跨域請(qǐng)求,取得目標(biāo)域的數(shù)據(jù)。
直接上代碼(用了jQuery)腳本代碼,直接插在父域
var mySrc = "http://a.目標(biāo)網(wǎng)址.com:9000/myIframe.html"; document.domain = "目標(biāo)網(wǎng)址.com"; //關(guān)鍵代碼,將域提升到根域 $("body").append("
iframe中html代碼
Document
注意:
只有將iframe提升到根域,這樣才能與父window通信,耳document.domain指令只能提升當(dāng)前域到當(dāng)前的根域,這也是必須要修改本地hosts文件的原因,這是解決跨域問(wèn)題的根本。
在抓取目標(biāo)網(wǎng)頁(yè)數(shù)據(jù)之前,要先看目標(biāo)網(wǎng)頁(yè)發(fā)送ajax請(qǐng)求的方式,得到請(qǐng)求的api,通過(guò)目標(biāo)網(wǎng)頁(yè)的控制臺(tái)插入腳本,然后運(yùn)行,得到要得到的數(shù)據(jù),在通過(guò)和本地請(qǐng)求的方式,發(fā)送到本地。
下面是抓取某物流查詢(xún)網(wǎng)頁(yè)中物流信息的過(guò)程:
結(jié)果涂掉的為目標(biāo)網(wǎng)址;這是向目標(biāo)網(wǎng)頁(yè)插入我的腳本,成功后網(wǎng)頁(yè)中就會(huì)被插入了一個(gè)地址為本地的,但是域名和目標(biāo)域相同的iframe。
這些數(shù)據(jù)可以在請(qǐng)求成功會(huì)傳回本地。
最后,其實(shí)博主也是初識(shí)前端,還處在學(xué)習(xí)和探索當(dāng)中,希望能與大家一起學(xué)習(xí)進(jìn)步,歡迎大家指出文章中的錯(cuò)誤和不足,一定虛心接受!
btw,首篇博文,希望大家多多支持?。?!
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/91593.html
摘要:跨域原因同源策略在客戶(hù)端編程語(yǔ)言中,如和,同源策略是一個(gè)很重要的安全理念,它在保證數(shù)據(jù)的安全性方面有著重要的意義。同源策略規(guī)定跨域之間的腳本是隔離的,一個(gè)域的腳本不能訪(fǎng)問(wèn)和操作另外一個(gè)域的絕大部分屬性和方法。由兩部分組成回調(diào)函數(shù)和數(shù)據(jù)。 1.JavaScript跨域原因--同源策略 在客戶(hù)端編程語(yǔ)言中,如javascript和 ActionScript,同源策略是一個(gè)很重要的安全理...
摘要:跨域概述兩個(gè)不同域互相請(qǐng)求,稱(chēng)為跨域,是由瀏覽器同源策略限制的一類(lèi)請(qǐng)求場(chǎng)景。同源策略限制以下幾種行為和無(wú)法讀取無(wú)法獲得請(qǐng)求不能發(fā)送目前主流的用于解決跨域問(wèn)題的方法跨域缺點(diǎn)這種方法只適用于和窗口,和無(wú)法通過(guò)這種方法。 跨域概述 兩個(gè)不同域互相請(qǐng)求,稱(chēng)為跨域,是由瀏覽器同源策略限制的一類(lèi)請(qǐng)求場(chǎng)景。 --> 同源策略/SOP(Same origin policy)是瀏覽器最核心也最基本的安全...
摘要:同源策略所謂同源是指協(xié)議,域名,端口均相同。同源策略是瀏覽器的一個(gè)安全功能,不同源的客戶(hù)端腳本在沒(méi)有明確授權(quán)的情況下,不能讀寫(xiě)對(duì)方資源。需注意的是由于同源策略的限制,所讀取的為跨域請(qǐng)求接口所在域的,而非當(dāng)前頁(yè)。 一、什么是跨域 1.URL解析 URL (Uniform Resource Locator )統(tǒng)一資源定位符(URL)是用于完整地描述Internet上網(wǎng)頁(yè)和其他資源的地址的...
摘要:為請(qǐng)求指定一個(gè)回調(diào)函數(shù)名。這主要用來(lái)讓生成一個(gè)獨(dú)特的函數(shù)名,這樣管理請(qǐng)求更容易,也能方便地提供回調(diào)函數(shù)和錯(cuò)誤處理。在回調(diào)函數(shù)中,通常我們只需通過(guò)判斷請(qǐng)求是否完成,如果已完成,再根據(jù)判斷是否是一個(gè)成功的響應(yīng)。 本篇文章借鑒自 博客園文章 原文地址 AJAX即Asynchronous Javascript And XML(異步JavaScript和XML),是指一種創(chuàng)建交互式網(wǎng)頁(yè)應(yīng)用的...
閱讀 1242·2021-11-15 18:00
閱讀 3052·2021-09-22 15:18
閱讀 2077·2021-09-04 16:45
閱讀 879·2019-08-30 15:55
閱讀 4107·2019-08-30 13:10
閱讀 1473·2019-08-30 11:06
閱讀 2093·2019-08-29 12:51
閱讀 2430·2019-08-26 13:55