如果获得页面跳转的最终URL

2023-05-16

最近做一个小功能,就是获取一个页面经过跳转后的最终页面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:       liuxingen@nsfocus.com
# 
# 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也没能找到完美的解决方法。
后面的两种方法相对来说比较”重”,因为我这次对于程序的运行效率不太在乎,所以我就选择了第二中方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如果获得页面跳转的最终URL 的相关文章

  • ROS下使用激光雷达RPLIDAR-A2进行SLAM完成地图的构建

    想要进行一个完整的地图建立离不开以下几个模块 xff1a 1 坐标 2 激光数据 3 绘图算法 ROS工程可以从我的GitHub上面下载 xff1a https github com LJianlin ROS SLAM Gmapping 下
  • C 语言Socket 实现http 带参数的POST请求

    本文叙述C语言中结合socket 如何实现http POST请求 xff0c 对于http协议相关内容可以查看HTTP协议详解 对于不带参数的post请求 xff0c 只需要按照http格式发送即可 下面以带参数的POST请求为例 1 C
  • 【学习C++】1.开始学习C++

    从今天开始学习C 43 43 xff0c 争取一年之内把 C 43 43 Primer Plus 看上两遍 xff0c 平均一周看一章 xff0c 并做课后对应习题 今天把 C 43 43 Primer Plus 的第二章看完了 xff0c
  • Ubuntu下安装make

    方法一 xff1a xff08 自动安装 xff09 1 进入root权限 xff1a su root 2 更新安装列表 xff1a apt get update 3 安装make xff1a apt get install ubuntu
  • nginx源码分析之http解码实现

    分析nginx是如何解析并且存储http请求的 对非法甚至恶意请求的识别能力和处理方式 可以发现nginx采用状态机来解析http协议 xff0c 有一定容错能力 xff0c 但并不全面 相关配置 跟解码有关的配置 merge slashe
  • 经纬高坐标系-ECEF坐标系-ENU坐标系

    无人机搭载的RTK获得的经纬高坐标要转换为东北天坐标 xff0c 才能用于局部的导航和定位 为了这个目的 xff0c 查阅资料 xff0c 越查越懵逼 xff0c 竟然这么多的坐标系 xff0c 略懂之后 xff0c 将学到的信息记录如下
  • Docker基础操作

    安装curl时报错 curl Depends libcurl3 gnutls 61 7 47 0 1ubuntu2 12 but 7 58 0 2ubuntu3 6 is to be installed sudo apt get purge
  • 1. COM是一个更好的C++

    看COM本质论做的总结 1 1 软件分发和C 43 43 class FastString span class token punctuation span span class token keyword char span span
  • 2.COM接口

    2 1 再谈接口与实现 其实从上一章 COM是个更好的C 43 43 可以看出 xff0c COM最重要的就是将接口与实现分离 上一章中接口定义头文件中采用C 43 43 抽象类的形式 xff0c 如果调用方是C 43 43 环境当然不会有
  • [QT]QMessageBox 的四种用法

    之前的一些QT笔记 xff0c 整理一下 void MainWindow on info clicked info QMessageBox information this 34 Title 34 34 Text 34 void MainW
  • svn执行update,却被告知database is locked

    svn执行update xff0c 却被告知database is locked xff01 执行 svn update xff0c 却抛出个错误警报 xff1a svn E200033 database is locked executi
  • ffmpeg解码RTSP/TCP视频流H.264(QT界面显示视频画面)

    源码下载地址 http download csdn net detail liukang325 9489952 我用的ffmpeg版本为 ffmpeg 2 1 8 tar bz2 版本低了恐怕有些头文件和API找不到 在Linux下解压后编
  • PCM音频文件格式的头信息

    一个裸的PCM格式音频数据 xff0c 如果不带头信息 xff0c 不知道其采样率等相关信息 xff0c 就无法用播放器播放出来 下面是默认的头信息格式 xff1a span class hljs comment 音频头部格式 span s
  • 解决cc1plus.exe: error: out of memory allocating

    QT中增加资源文件过大时 xff0c 会编译不过 xff0c 报错 xff1a span class hljs attribute cc1plus exe span span class hljs string out of memory
  • 单片机 APROM: RAM: Flash:区别

    APROM是用户程序存储区 xff0c 我们写的单片机的程序的代码 xff0c 就放在这里 APROM是 xff0c APROM是Flash中的一部分 RAM xff0c 随机存储器 xff0c 主要用来存放动态数据 xff0c 比如我们程
  • 改变全局变量值得两种方法

    方法一 xff1a 指针法 include lt iostream gt using namespace std void change int a void main int t change amp t 注意这里是传入变量的地址 xff
  • QT中为程序加入超级管理员权限

    QT的一些文件操作 xff0c 注册表的操作等 xff0c 有些操作会无效 xff0c 主要是因为没有对C盘的相关权限 解决方法 xff1a 1 mingw编译器 在pro工程文件中加入 span class hljs attribute
  • QT截图非顶层窗口的画面(获取窗口句柄)

    我们知道QT里截图的代码很简单 xff0c 很多例子都是截取桌面 xff0c 或截取整个屏幕 那如果要截取指定窗口的画面呢 xff1f 即使该窗口不在桌面最顶层显示 我们也能截到它的图片吗 xff1f 当然可以 xff0c 只要我们拿到该窗
  • QEventLoop会卡住的解决方法

    问题是这样的 xff1a 在一个线程中有下面一段代码 QEventLoop span class hljs keyword loop span span class hljs comment span span class hljs lab
  • android adb 模拟点击、滑动、输入、按键

    模拟输入 001 adb shell input text 001 模拟home按键 adb shell input keyevent 3 模拟点击 540 1104 坐标 adb shell input tap 540 1104 模拟滑动

随机推荐

  • 结构体在内存中的对齐规则

    一个结构体变量定义完之后 xff0c 其在内存中的存储并不等于其所包含元素的宽度之和 例一 xff1a include lt iostream gt using namespace std struct X char a
  • curl请求常用参数和返回码

    curl是一个用于传输数据的工具 xff0c 支持各种协议 xff0c 如HTTP FTP SMTP等 以下是一些常用的curl请求参数及其作用 xff1a X request xff1a 指定HTTP请求方法 xff0c 常见的有GET
  • ubuntu中python版本切换

    shell里执行 xff1a sudo update alternatives install usr bin python python usr bin python2 100 sudo update alternatives insta
  • CMAKE基础使用

    1 目录结构 xff1a 2 顶层cmake内容 xff1a span class token function cmake minimum required span span class token punctuation span V
  • URL格式

    一 URL基本格式 一个完整的url包含方案 用户名 密码 主机名 端口 路径 参数 查询和片段 xff0c 格式如下 xff1a lt scheme gt lt user gt lt password gt 64 lt host gt l
  • __IO uint16_t

    STM32里的类型定义 xff0c 见如下说明 xff1a typedef volatile unsigned short vu16 typedef IO uint16 t vu16 IO definitions access restri
  • 串口波形分析(TTL,RS232,RS485)

    TTL xff0c RS232 xff0c RS485波形分析 本文转自 xff1a http blog 163 com qiu zhi2008 blog static 60140977201092651854445 http www cn
  • Java数字类型转byte数组

    文章目录 方法1 自己写int转byte数组byte数组转int参考 xff1a https blog csdn net qq 41054313 article details 88424454 方法2 使用java NIO包的功能int转
  • 头文件和库函数的区别

    1 头文件中有函数的申明 xff0c 库文件实现函数的定义 比如 xff0c printf函数 使用时应包括stdio h xff0c 打开stdio h你只能看到 xff0c printf这 个函数的申明 却看不到printf具体是怎么实
  • C语言--字符串的截取

    今天碰到了一个字符串截取的功能实现问题 xff0c 比较常见所以就做下记录 一般的实现是这样的 xff1a include lt stdio h gt include lt string h gt int main void char de
  • 使用 JWT 让你的 RESTful API 更安全

    传统的 cookie session 机制可以保证的接口安全 xff0c 在没有通过认证的情况下会跳转至登入界面或者调用失败 在如今 RESTful 化的 API 接口下 xff0c cookie session 已经不能很好发挥其余热保护
  • CAN报文解析—案例

    1 CAN报文定义 CAN报文是指发送单元向接受单元传送数据的帧 我们通常所说的CAN报文是指在CAN线 xff08 内部CAN 整车CAN 充电CAN xff09 上利用ECU和CAN卡接收到的十六进制报文 2 CAN协议中CAN报文种类
  • 单片机中,intrins.h头文件中各函数详解:空指令_nop_(),移位函数_crol_、_cror_

    intrins h 在 C51单片机编程中 xff0c 我们经常使用到 nop 延时一个机器周期 如果晶振是12M xff0c 则延时1 us xff0c 该空函数在头文件intrins h中 头文件 INTRINS H 中的函数使用很方便
  • Linux 下模拟Http 的get or post请求(curl和wget两种方法)

    一 get请求 xff1a 1 使用curl命令 xff1a curl 34 http www baidu com 34 如果这里的URL指向的是一个文件或者一幅图都可以直接下载到本地 curl i 34 http www baidu co
  • QT入门基础认知(三个常用类、三种对话框类型、信号和槽)

    1 简单介绍 xff1a 1 1 三个常用类 xff08 Qwidget类 QDialog类 QMainwindow类 xff09 Qwidget类 xff1a 继承与QObject类和QPaintdevice类 xff0c 所有用户界面对
  • socket函数的domain、type、protocol解析

    socket 函数的 domain type protocol 解析 lxg 64 2015 04 09 内核中的 socket 概览 图一 xff1a socket 概览 内核中套接字是一层一层进行抽象展示的 xff0c 把共性的东西抽取
  • code的用法

    今天写程序的时候用了const xff0c 想到之前遇到的code的用法 xff0c 那是第一次遇到code的那样的用法 xff0c 查了一下 xff0c 解释如下 xff1a 在单片机使用C语言进行编程的时候 xff0c 经常使用到cod
  • Linux的system()和popen()差异

    Linux的system 和popen 差异 1 system 和popen 简介 在linux中我们可以通过system 来执行一个shell命令 xff0c popen 也是执行shell命令并且通过管道和shell命令进行通信 sys
  • HTTP的303、307状态码

    之前在 http权威指南 中看到了HTTP的307状态码 xff0c 当时因为没有找到可以实验的网站所以没有比较深的印象 xff0c 今天在排查一个问题的时候恰巧遇到了HTTP 1 1 307 TemporaryRedirect xff0c
  • 如果获得页面跳转的最终URL

    最近做一个小功能 xff0c 就是获取一个页面经过跳转后的最终页面URL xff0c 这里的跳转方式包含但不仅限于HTTP 301 302 js meta refresh 下面是我想到的三种可能的解决方式 xff0c 可能会有更优的方法 x