如何使用 python 重定向后(浏览器给出的那个)获得正确的 url

How to get the right url after redirection (the one given by the browser) using python

我正在从事一个项目,其目的是从一篇新闻文章(媒体网站)中检索所有信息,为此我正在使用运行良好的图书馆 newspaper3K。

但是我有一些关于 url 的问题(重定向 link),根据我的研究 newspaper3k 不加载重定向 url,它只处理发送的 url作为参数。

这是一个 link 我想处理的例子:

url = "wtm.actualite.20minutes.fr/redirection.html?m=3e2b20a2f1f6dd3c60608f54d7ad4dc5&c=fr&u=https%3A%2F%2Fwww.20minutes.fr%2Fmonde%2F2943823-20210103-bahamas-disparition-bateau-20-personnes-bord%3Fxtor%3DEREC-182-%5Bactualite%5D&dc=yt0U%2FI8COMJyjwQQ1fA2kVEXpoP0nsZydMTZS6jTm2DdKasFuV%2FVA7rEphhqMfGAy%2FlztUlVN4MJt5tg%2FQXfJwmXMRQL8g3Gfwhl%2BsjkkYmd%2BDxDUhb%2BpPRL%2BNsiDETNQeP3MmrQ6ATGJT%2Blf46Zg4DHd%2FzaXy%2B7UAuxatp2UcVd39HKuuMfQHmyDV%2BAxSAJrd4x5CxHqy3uTtZoQEjwGdZ%2FRtoa7YLOWLKhN9tg4TM%3D"

所以这个 url 的目标是获得正确的 url(重定向后),然后将其发送到 newspaper3K。

我已经尝试了以下解决方案,但它们对我不起作用;

1 - 使用库请求如下 response = requests.get(url, verify=False, allow_redirects=True)

2- 使用 mechanize 库如下:

br = mechanize.Browser()
resp = br.open(url)

我希望使用与使用 webbrowser 时相同的流程(无需打开浏览器)

import webbrowser
webbrowser.open_new(url)

终于有权利了

url : https://www.20minutes.fr/monde/2943823-20210103-bahamas-disparition-bateau-20-personnes-bord?xtor=EREC-182-[actualite]

提前感谢您的回复:)

重定向不是从路径转发发生的,而是从实际的 html 内容发生的。您可以通过使用以下代码从响应中下载文本来验证这一点。

with open ("actualite.html", "w") as f:
    f.write(response.text)

如果您打开本地文件,它将重定向。浏览器执行重定向而不是域服务器。

要解决这个问题,您可以使用像 selenium 这样的浏览器工具。

编辑:以下是使用 selenium 执行此操作的方法:

from selenium import webdriver
url = "https://wtm.actualite.20minutes.fr/redirection.html?m=3e2b20a2f1f6dd3c60608f54d7ad4dc5&c=fr&u=https%3A%2F%2Fwww.20minutes.fr%2Fmonde%2F2943823-20210103-bahamas-disparition-bateau-20-personnes-bord%3Fxtor%3DEREC-182-%5Bactualite%5D&dc=yt0U%2FI8COMJyjwQQ1fA2kVEXpoP0nsZydMTZS6jTm2DdKasFuV%2FVA7rEphhqMfGAy%2FlztUlVN4MJt5tg%2FQXfJwmXMRQL8g3Gfwhl%2BsjkkYmd%2BDxDUhb%2BpPRL%2BNsiDETNQeP3MmrQ6ATGJT%2Blf46Zg4DHd%2FzaXy%2B7UAuxatp2UcVd39HKuuMfQHmyDV%2BAxSAJrd4x5CxHqy3uTtZoQEjwGdZ%2FRtoa7YLOWLKhN9tg4TM%3D"

options = webdriver.ChromeOptions()
options.add_argument('ignore-certificate-errors')
driver = webdriver.Chrome(chrome_options=options, executable_path=r"C:/Users/james/Documents/Selenium/chromedriver.exe")
driver.get(url)
print(driver.current_url)

@James 非常感谢您的回答!对我帮助很大。

我目前正在研究 aws 胶水,所以我不得不只使用某些库(我猜 Selenium 不可用)但是这是我找到 link 的方法(当然是按照你的逻辑):

from bs4 import BeautifulSoup
import re
from urllib.parse import unquote

url = "https://wtm.actualite.20minutes.fr/redirection.html?m=3e2b20a2f1f6dd3c60608f54d7ad4dc5&c=fr&u=https%3A%2F%2Fwww.20minutes.fr%2Fmonde%2F2943823-20210103-bahamas-disparition-bateau-20-personnes-bord%3Fxtor%3DEREC-182-%5Bactualite%5D&dc=yt0U%2FI8COMJyjwQQ1fA2kVEXpoP0nsZydMTZS6jTm2DdKasFuV%2FVA7rEphhqMfGAy%2FlztUlVN4MJt5tg%2FQXfJwmXMRQL8g3Gfwhl%2BsjkkYmd%2BDxDUhb%2BpPRL%2BNsiDETNQeP3MmrQ6ATGJT%2Blf46Zg4DHd%2FzaXy%2B7UAuxatp2UcVd39HKuuMfQHmyDV%2BAxSAJrd4x5CxHqy3uTtZoQEjwGdZ%2FRtoa7YLOWLKhN9tg4TM%3D"
response = requests.get(url, verify=False, allow_redirects=True)

if response.status_code == 200:
    page = response.text
    # parse the html using beautifulsoup
    html_content = BeautifulSoup(page, 'html.parser')
    soup = html_content
    
href = soup.find("link", href = True)
href = href['href']

new_url = unquote(unquote(href))

再次感谢您的帮助,您是英雄:)