python爬虫跨域_AJAX跨域简单讲解【Python版】
總結自JAVA,這里改成了Python。
什么是AJAX跨域
只要協議、域名、端口有任何一個不同,都被當作是不同的域,不同域之間的請求就是跨域操作。AJAX跨域就是AJAX在A域下對B域發送了請求,一般情況下會被瀏覽器禁止。
例如,后臺開啟兩個Flask服務器ServerA(port=8080)和ServerB(port=8081):
ServerA.py代碼如下:
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def index():
return render_template('index.html')
@app.route('/get')
def get():
return 'get8080 ok'
if __name__ == "__main__":
app.run(port=8080)
ServerB.py代碼如下:
from flask import Flask
app = Flask(__name__)
@app.route('/get')
def get():
return 'get8081 ok'
if __name__ == "__main__":
app.run(port=8081)
index.html使用jQuery發送ajax請求,代碼如下:
IndexTest
GET 8080
GET 8081
function get1(){
$.get("http://127.0.0.1:8080/get").then(
function(res){
console.log(res);
})
}
function get2(){
$.get("http://127.0.0.1:8081/get").then(
function(res){
console.log(res);
})
}
因此GET 8080和GET 8081兩個按鈕是分別向8080/8081端口發送請求,并將結果打印在控制臺。開啟兩個服務器,在瀏覽器輸入127.0.0.1:8080進入index頁面,打開Chrome控制臺并依次點擊,結果如圖:
可以看到GET 8080正常輸出,而由于8081端口的請求屬于跨域,瀏覽器報錯并未正常打印結果。
如何處理AJAX跨域問題
1.關閉瀏覽器安全策略
禁止跨域的AJAX請求,是瀏覽器本身的安全策略,實際上后臺并沒有限制,例如點擊GET 8081后,可以在NETWORK中看到這個請求本身是OK的:
因此只要關閉瀏覽器的安全策略即可,方式之一是在命令行中使用
"chrome.exe路徑" --disable-web-security --user-data-dir=D:\temp
打開瀏覽器,此時瀏覽器會有安全性提示,依次點擊兩個按鈕,結果如圖:
2.使用JSONP
AJAX請求受到跨域的限制,其請求類型是xhr,但html頁面在引用別的域的JS腳本時卻可以正常訪問,這種請求的類型是script,如圖:
JSONP的原理就是將原本的xhr請求替換為script請求,例如假設原先xhr請求返回的是數據A,JSONP請求會附帶一個callback參數說明本地使用的回調函數,假設為func1,后端收到這個JSONP請求,返回的是JS代碼func1(A)。使用JSONP需要對前后端都做修改。在此不演示~
3.在ServerA中修改
我們可以讓后臺服務器代替瀏覽器去請求跨域的接口,并將數據通過本域的接口返回給瀏覽器,使瀏覽器不再發送跨域請求。例如在ServerA.py中增加一個接口如下:
@app.route('/get_8081_through_8080')
def get2():
return requests.get('http://127.0.0.1:8081/get').text
index.html增加一個button,如下:
GET 8081 THROUGH 8080
function get1(){
...
}
function get2(){
...
}
function get3(){
$.get("http://127.0.0.1:8080/get_8081_through_8080").then(
function(res){
console.log(res);
})
}
此時對瀏覽器而言get3()就不屬于跨域的請求了,后臺代替瀏覽器向8081發送了請求。
結果如圖所示,第二個button由于跨域仍然報錯,第三個button則正常輸出:
4.在ServerB中修改
ServerB也可以通過向瀏覽器返回特定響應頭,告訴瀏覽器它是允許被跨域調用的,使用flask的make_response添加Access-Control-Allow-Origin和Access-Control-Allow-Methods兩個字段,ServerB.py更新如下:
from flask import Flask, Response
app = Flask(__name__)
@app.route('/get')
def get():
return 'get8081 ok'
@app.route('/get2')
def get2():
resp = Response('get8081 ok by Access-Control-Allow')
resp.headers['Access-Control-Allow-Origin'] = 'http://127.0.0.1:8080'
resp.headers['Access-Control-Allow-Methods'] = 'GET'
return resp
if __name__ == "__main__":
app.run(port=8081)
將index.html的get2()方法請求的接口改為'http://127.0.0.1:8081/get2',依次點擊button,第二個button已經可以正常輸出內容:
總結
以上是生活随笔為你收集整理的python爬虫跨域_AJAX跨域简单讲解【Python版】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python udp 传输文件_pyth
- 下一篇: python输出方格_Python蓝桥杯