1. 程式人生 > >如果獲得頁面跳轉的最終URL

如果獲得頁面跳轉的最終URL

最近做一個小功能,就是獲取一個頁面經過跳轉後的最終頁面URL,這裡的跳轉方式包含但不僅限於HTTP 301/302、js、meta refresh。下面是我想到的三種可能的解決方式,可能會有更優的方法,期望大家提出更好的方法。
1. 首先的解決方法就是解析html頁面,獲得html頁面中跳轉的URL。
這種方式是我能想到的最高效、速度最快的方法,但是也有可能是最難維護的,因為我們必須對各種跳轉方式都要了解。現在我所遇到的是HTTP 302/301windows.location.hrefmeta 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) 銷毀當前頁面,跳轉