如果獲得頁面跳轉的最終URL
最近做一個小功能,就是獲取一個頁面經過跳轉後的最終頁面URL,這裡的跳轉方式包含但不僅限於HTTP 301/302、js、meta refresh。下面是我想到的三種可能的解決方式,可能會有更優的方法,期望大家提出更好的方法。
1. 首先的解決方法就是解析html頁面,獲得html頁面中跳轉的URL。
這種方式是我能想到的最高效、速度最快的方法,但是也有可能是最難維護的,因為我們必須對各種跳轉方式都要了解。現在我所遇到的是HTTP 302/301
、windows.location.href
、meta http-equiv="refresh" content="0; url=http://www.nsfocus.com/"
這個方法還要注意的就是多級跳轉的情況,程式碼就不上了,因為當時我也沒決定用這種方法。
2. 用Selenium+Chrome(Firefox)藉助瀏覽器一勞永逸的方法。
前面解析html頁面的方法可能會遇到各種我們未知的跳轉問題,我們何不站在”偉人”的肩膀上,藉助她們的力量來幫我們解決這些棘手的問題。
Selenium是大家熟悉的自動化測試的開源軟體,通過Selenium載入本地的瀏覽器,通過瀏覽器來做頁面的載入跳轉,獲得最終的跳轉URL。
因為程式執行的環境沒有GUI所以得通過Xvfb來載入執行瀏覽器,PyVirtualDisplay是一個封裝了Xvfb, Xephyr and Xvnc操作的工具包Python庫。程式碼如下:
#!env python
#coding=utf-8
#
# Author: [email protected]
#
# Created Time: 2016年07月31日 星期日 21時16分04秒
#
# FileName: redirect.py
#
# Description:
#
# ChangeLog:
from pyvirtualdisplay import Display
from selenium import webdriver
display = Display(visible=0, size=(1024, 768))
display.start()
driver = webdriver.Chrome('/home/lxg/chromedriver' )
driver.implicitly_wait(30)
link = "https://jf.bankofrizhao.com.cn/"
driver.get(link)
redirected_url = driver.current_url
print 30*'='
print redirected_url
print 30*'='
driver.close() # Close the current window.
driver.quit() # Quit the driver and close every associated window.
display.stop()
這種方法從效果來說比較好,我們無需關注頁面的可能跳轉方法有哪些,因為Chrome都會替我們解決。但是這種方式比前面的解析html頁面的方法可能就是消耗的資源比較多、執行時間也會稍長。
3. 使用Headless browsers的PhantomJS。
PhantomJS是一個無介面的webkit核心瀏覽器,你可以把它當作一個沒有介面的Safari。既然是一個瀏覽器那麼它應該也能滿足我們的需求,下面是我從網上copy回來的一段程式碼:
var sys = require('system');
var pageUrl = ( sys.args[1] ) ? sys.args[1] : phantom.exit(0);
function forceExit(){
phantom.exit(0);
}
var renderPage = function (url) {
var page = require('webpage').create();
page.onNavigationRequested = function(url, type, willNavigate, main) {
var tmpUrl = ( url.substr(url.length - 1) != '/' ) ? url+'/' : url;
var tmpPageUrl = ( pageUrl.substr( pageUrl.length - 1) != '/' ) ? pageUrl+'/' : pageUrl;
if (main && tmpUrl!=tmpPageUrl && url!='about:blank') {
pageUrl = url;
sys.stdout.write(url+'\n');
setTimeout(forceExit,1000 );
}
};
page.open(url, function(status) {
if ( status != 'success' ) {
phantom.exit( 1 );
} else {
phantom.exit( 0 );
}
},100);
setTimeout(forceExit,2000 );
};
renderPage( pageUrl );
這段程式碼能夠獲取js跳轉,但是對於meta refresh
跳轉卻不支援,當然對於HTTP 302/301
也不支援。大致瀏覽了一邊API也沒能找到完美的解決方法。
後面的兩種方法相對來說比較”重”,因為我這次對於程式的執行效率不太在乎,所以我就選擇了第二中方法。
相關推薦
如果獲得頁面跳轉的最終URL
最近做一個小功能,就是獲取一個頁面經過跳轉後的最終頁面URL,這裡的跳轉方式包含但不僅限於HTTP 301/302、js、meta refresh。下面是我想到的三種可能的解決方式,可能會有更優的方法,期望大家提出更好的方法。 1. 首先的解決方法就是解析ht
python獲得頁面跳轉的最終URL
本例採用selenium獲得最終的網頁連結。原來的網址是:http://www.baidu.com/link?url=ojjD2hHxviDl0j4T6MCQzRaQYUyYe0BX2aCXcNI5UliRtQum2Y7XH9_xZ08mzOJH,網頁完全載入完成後的網址
框架之TP5 頁面跳轉 / 以及url地址
<a href=">路由跳轉 tp框架跳轉需要用{}包住 裡面加上冒號(:) 括號中('控制器名稱/方法名稱') <a href="{:url('Login/xian')}">新增</a> 頁面訪問url地址 url
在頁面跳轉的時候,在跳轉後的頁面中使用js 獲取到 頁面跳轉的url中攜帶的引數。
common.js程式碼 //獲取URL中的引數..等等function getQueryString(name){ var reg = new RegExp("(^|&)"+name+"=([^&]*)(&|$)"); var r = window.location.
Servlet頁面跳轉的URL拼接問題
不用Servlet進行開發時間太久,關於其用法的部分知識容易忘記,最近在一個培訓機構做助理教師的時候才重新溫習了一下Servlet的知識,不得不說學習Servlet確實是我們學習 框架知識的一個基礎。 由於經常被問到常常出現的404錯誤,我總結了一下出現的緣由:se
JS頁面跳轉傳url地址錯誤
在我做的一個介面文件系統中有這樣一個功能,頁面點選一個測試按鈕,將一個地址傳到action中進行處理將結果進行解析輸出到頁面上; 出現了一個問題,頁面點選按鈕時需要跳轉頁面,同時將要處理的url地址傳遞出去,該地址裡面有&?等特殊符號,action接收的時候會理
頁面鏈接跳轉歷史URL不記錄的兼容處理
default spl 跳轉 cati 效果 mil title fault 應該 一、跳轉歷史URL不記錄需求的由來 比方說我們點擊首頁的“分類”進入分類頁,如下圖: 然後分類頁頭部有個“男生”“女
三十七、小程式頁面跳轉傳參引數值為url時引數丟失
當引數的值為url的時候,在options中的值沒有引數“?”之後字串被擷取。例如:let url="http://baidu.com/?a=1&b=2"wx.navigateTo({url: `detail?url=${url}`})可以使用encodeURIComponent():函式可把字串作為
微信小程式 頁面跳轉如何通過url傳遞引數
var fb_id = 132在跳轉地址後wx.naviga在跳轉地址後teTo({ url: `../free/sellers/sellers?fb_id=${fb_id}`, })然後在新頁面通過js獲取資料 onLoad: function (optio
ie瀏覽器在頁面跳轉的時候,url裡面有漢字跳轉報錯
我是做前端的(不到三年,都是給公司自己做專案的,經驗應該有點弱),當時接了一個私活,做完專案的時候,本地各種瀏覽器(chrome,firefox,IE,Safari,Opera)除錯都沒有問題,但是放到線上之後,在ie裡面跳轉出現了問題,就是使用者在輸入漢字搜尋的時候,忘了進
頁面發生跳轉但是url 不發生變化
iframe test 頁面發生了跳轉和變化,但是url並未發生變化 公司的後臺管理系統,頁面發生了跳轉,重新整理按鈕也有變化,但是url地址卻未曾發生變化,為什麼呢? 實現方式: 使用 iframe , 比如: 在 default.html 中 if
spring jquery Mobile 頁面跳轉後瀏覽器url未改變&&javaScript程式碼重新整理後才能執行的問題解決
最近在做一個遠端控制的專案的時候,使用了JqueryMoile,在其中發現一個問題: 當我在使用如下標籤是發現: <a href="webDevices" >裝置列表</a>
幾種常用的頁面跳轉URL的方法
<html> <head> <meta http-equiv="Content-Language" content="zh-cn"> <meta HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=gb2312"
兩個頁面跳轉 url傳中文 非法字元及亂碼
弄了兩個小時終於解決了!!! 問題:在一頁面的url傳中文,從一頁面跳轉到二頁面,在二頁面中得到url中的中文亂碼! 解決辦法:在一頁面的url用encodeURIComponent轉兩次碼(解決非法字元和中文亂碼),
AngularJS路由實現單頁面跳轉
href vid 左邊欄 ref 按順序 -1 生活用品 func 為我 <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <titl
php中實現頁面跳轉的幾種方式
腳本 timeout location clas replace asc idt lee 實現 親測,not復制粘貼 PHP中實現頁面跳轉有一下幾種方式,看了幾個人寫的不是很條理,自己整理一下 在PHP腳本代碼中實現 <?php header("locati
ionic2 頁面跳轉 push() pop() NavController,navParams
htm script mark int popup struct from navi lin 新建頁面http://zyyapp.com/post/185.html Ionic 2之頁面堆棧 :http://blog.csdn.net/u010730126/articl
jquery頁面跳轉導航變色,刷新後依然存在
ctu contacts new each menu [0 oca function == jquery代碼: <script> $(document).ready(function () { //$(".me
5S後頁面跳轉
href javascrip asc count xhtml www XML org oca <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xh
微信小程序頁面跳轉
rect navigate 原因 頁面 nbsp str 返回 strong bar wx.navigateTo(OBJECT) 不銷毀當前頁面,僅將其隱藏,使用wx.navigateBack可以返回到原頁面。 wx.redirectTo(OBJECT) 銷毀當前頁面,跳轉