Python Requests 库重定向新 URL

2024-12-27 08:47:00
admin
原创
114
摘要:问题描述:我一直在浏览 Python 请求文档,但我看不到我想要实现的任何功能。在我的脚本中我正在设置allow_redirects=True。我想知道该页面是否已重定向至其他页面,新的 URL 是什么。例如,如果起始 URL 为:www.google.com/redirect最终的 URL 是www.goo...

问题描述:

我一直在浏览 Python 请求文档,但我看不到我想要实现的任何功能。

在我的脚本中我正在设置allow_redirects=True

我想知道该页面是否已重定向至其他页面,新的 URL 是什么。

例如,如果起始 URL 为:www.google.com/redirect

最终的 URL 是www.google.co.uk/redirected

我如何获取该 URL?


解决方案 1:

您正在寻找请求历史记录。

属性response.history是导致最终 URL 的响应列表,可以在 中找到response.url

response = requests.get(someurl)
if response.history:
    print("Request was redirected")
    for resp in response.history:
        print(resp.status_code, resp.url)
    print("Final destination:")
    print(response.status_code, response.url)
else:
    print("Request was not redirected")

演示:

>>> import requests
>>> response = requests.get('http://httpbin.org/redirect/3')
>>> response.history
(<Response [302]>, <Response [302]>, <Response [302]>)
>>> for resp in response.history:
...     print(resp.status_code, resp.url)
... 
302 http://httpbin.org/redirect/3
302 http://httpbin.org/redirect/2
302 http://httpbin.org/redirect/1
>>> print(response.status_code, response.url)
200 http://httpbin.org/get

解决方案 2:

这是在回答一个稍微不同的问题,但由于我自己也遇到了这个问题,所以我希望它可能对其他人有用。

如果您想使用allow_redirects=False并直接获取第一个重定向对象,而不是遵循它们的链,并且您只想直接从 302 响应对象中获取重定向位置,那么r.url将不起作用。相反,它是“Location”标头:

r = requests.get('http://github.com/', allow_redirects=False)
r.status_code  # 302
r.url  # http://github.com, not https.
r.headers['Location']  # https://github.com/ -- the redirect destination

解决方案 3:

我认为在处理 URL 重定向时调用requests.head而不是会更安全。在此处requests.get查看 GitHub 问题:

r = requests.head(url, allow_redirects=True)
print(r.url)

解决方案 4:

该文档有这样的简介https://requests.readthedocs.io/en/master/user/quickstart/#redirection-and-history

import requests

r = requests.get('http://www.github.com')
r.url
#returns https://www.github.com instead of the http page you asked for 

解决方案 5:

对于python3.5,可以使用以下代码:

import urllib.request
res = urllib.request.urlopen(starturl)
finalurl = res.geturl()
print(finalurl)

解决方案 6:

我编写了以下函数来从短 URL(bit.ly、t.co 等)获取完整 URL。

import requests

def expand_short_url(url):
    r = requests.head(url, allow_redirects=False)
    r.raise_for_status()
    if 300 < r.status_code < 400:
        url = r.headers.get('Location', url)

    return url

使用方法(短网址是该问题的网址):

short_url = 'https://tinyurl.com/' + '4d4ytpbx'
full_url = expand_short_url(short_url)
print(full_url)

输出:

https://stackoverflow.com/questions/20475552/python-requests-library-redirect-new-url

解决方案 7:

所有答案都适用于最终 URL 存在/工作正常的情况。如果最终 URL 似乎不起作用,则以下是捕获所有重定向的方法。有一种情况是最终 URL 不再起作用,而 URL 历史记录等其他方法会出错。

代码片段

long_url = ''
url = 'http://example.com/bla-bla'
try:
    while True:
        long_url = requests.head(url).headers['location']
        print(long_url)
        url = long_url
except:
    print(long_url)

解决方案 8:

我无法使用请求库,因此不得不采用其他方法。以下是我作为此帖子的解决方案发布的代码。(使用请求获取重定向 URL)

这样,您实际上打开了浏览器,等待浏览器将 URL 记录到历史记录中,然后读取历史记录中的最后一个 URL。我为 Google Chrom 编写了此代码,但如果您使用其他浏览器,您应该能够跟进。

import webbrowser
import sqlite3
import pandas as pd
import shutil

webbrowser.open("https://twitter.com/i/user/2274951674")
#source file is where the history of your webbroser is saved, I was using chrome, but it should be the same process if you are using different browser
source_file = 'C:\\Users\\{your_user_id}\\AppData\\Local\\Google\\Chrome\\User Data\\Default\\History'
# could not directly connect to history file as it was locked and had to make a copy of it in different location
destination_file = 'C:\\Users\\{user}\\Downloads\\History'
time.sleep(30) # there is some delay to update the history file, so 30 sec wait give it enough time to make sure your last url get logged
shutil.copy(source_file,destination_file) # copying the file.
con = sqlite3.connect('C:\\Users\\{user}\\Downloads\\History')#connecting to browser history
cursor = con.execute("SELECT * FROM urls")
names = [description[0] for description in cursor.description]
urls = cursor.fetchall()
con.close()
df_history = pd.DataFrame(urls,columns=names)
last_url = df_history.loc[len(df_history)-1,'url']
print(last_url)

>>https://twitter.com/ozanbayram01
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用