【问题标题】:Redirect to Final url from selenium failing从 selenium 重定向到最终 url 失败
【发布时间】:2025-12-26 03:30:16
【问题描述】:

要求

在重定向链之后获取最终 URL,就像在使用 selenium 的普通浏览器上发生的一样。 网址是从 twitter 获取的文章网址。

查看重定向和标头后在普通桌面浏览器上的行为:

  • Url 是一个 twitter URL,它得到一个301 error -moved permanently
  • 然后它跟随位置标签到一个缩短的 url,然后再次得到 302 错误。
  • 它再次跟随重定向链并到达最后一页。

使用 Selenium 的行为

  • 最终重定向到主网站主页/索引而不是实际的文章页面。最终的 url 与实际的不一样。

初始基本代码

chrome_options = Options()
chrome_options.add_argument('--user-agent= Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:70.0) Gecko/20100101 Firefox/70.0');
#above user agent is an example but multiple different user agents were tried 
chrome_options.add_argument('--headless')
chrome_options.add_argument('--no-sandbox')
browser = webdriver.Chrome(driver_loaction,chrome_options=chrome_options)
browser.set_page_load_timeout(45)
browser.get(url)
final_url = browser.current_url

各种尝试获取最终 url 而不是主网站主页/索引页面

  1. 正常等待

browser.get(url)

time.sleep(25)

  1. 使用 WebDriverWait-

    WebDriverWait(browser,20)

  2. 带有预期条件

    WebDriverWait(browser, 20).until(EC.url_contains("portion of the final url"))

每次都会超时,即使是 url_to_be 等不同的条件。

尝试使用非硒选项时的行为

1.Wget -

以下是为掩盖实际细节而编辑的 wget 调用的响应 -

正在解决 t.co (t.co)...,

... 连接到 t.co (t.co)|:443... 已连接。 HTTP

请求已发送,等待响应... 301 Moved Permanently Location:

[关注]

正在解析域(domain)...

...连接到...已连接。

HTTP 请求已发送,等待响应... 302 Found Location:

[关注]

--Date--解析网站(website)...ip,

已连接。 HTTP 请求已发送,等待响应... 200 OK

最后我们看到的是主页而不是网站页面。

  1. 请求库 -

    response = requests.get(Url, allow_redirects=True, headers=self.headers, timeout=30)

(标头包含用户代理,但尝试使用来自浏览器的实际相同请求标头,以获得正确的最终 url 响应)- 获取主页 --

检查response.history 的重定向,我们从 t.co(twitter url) 看到 - 我们重定向到短 url,然后重定向到网站主页并结束。

  1. urllib 库 - 相同的最终回复。

测试例如 url - t.co/Mg3IYF8ZLm?amp=1(添加 https:// - 我为发布而删除)

经过几天不同的方法,我被困住了——我不知何故认为 selenium 是解决这个问题的关键,因为它适用于普通桌面浏览器,然后应该适用于 selenium——对吗?

编辑:它似乎也发生在其他版本的驱动程序和 selenium 上,如果我们至少可以通过某些链接(如给出的示例)找出它发生的实际原因,那就太好了。

【问题讨论】:

  • 增加browser.set_page_load_timeout(120) 这应该可以。
  • @KunduK 很遗憾没有工作。我愿意接受更多建议,
  • 奇怪,我在增加超时的同时检查了它是否正常工作。您使用的是哪个 chrome 驱动程序版本?
  • chromedriver : 2.24.1 google-chrome-stable -version : Google Chrome 71.0.3578.98 python2.7 在我的 aws linux 服务器上。
  • @DirkN。我尝试从具有以下选项的列表中随机使用不同用户代理的重试逻辑,chrome_options.add_argument('network.http.connection-retry-timeout = 250'); chrome_options.add_argument('network.http.connection-timeout=90'); chrome_options.add_argument('network.http.max-connections = 900'); chrome_options.add_argument('network.http.keep-alive.timeout = 115'); chrome_options.add_argument('--headless') chrome_options.add_argument('--no-sandbox') chrome_options.add_argument('--disable-dev-shm-usage') 之后我使用回退到 wget 。试试看

标签: python selenium selenium-webdriver redirect


【解决方案1】:

问题是在中间 url 之后,由于缺少 headers,该 url 无法重定向到最终页面,中间 url (http://www.cumhuriyet.com.tr/) 被 403 状态代码阻止。

一旦我们为请求添加了标头,url 就会导航到最终的 url。

我在下面给出了 Java 实现。抱歉,我不熟悉 Python 中的这段代码。请将此代码转换为python,它可能会解决问题。

  @Test
  public void RUN() {
    BrowserMobProxy proxy = new BrowserMobProxyServer();
    proxy.start(0);
    Proxy seleniumProxy = ClientUtil.createSeleniumProxy(proxy);
    proxy.addRequestFilter((request, contents, messageInfo)->{
        request.headers().add("Accept-Language", "en-US,en;q=0.5");
        request.headers().add("Upgrade-Insecure-Requests", "1");
        return null;
    });

    String proxyOption = "--proxy-server=" + seleniumProxy.getHttpProxy();
    ChromeOptions options = new ChromeOptions();
    options.addArguments("--headless");
    options.addArguments(proxyOption);


    System.setProperty("webdriver.chrome.driver","<driverLocation>");
    WebDriver driver = new ChromeDriver(options);


    driver.get("<url>");
    System.out.println(driver.getCurrentUrl());
}

【讨论】:

  • Navigate.to 对我不起作用,它会抛出一个 webdriver has no attribute called navigate ,经过一番检查,这似乎是一个尚未移植到 python 的 java 实现 - 检查 *.com/a/49355539/5867761
  • 如果你有python实现请分享。
  • 谢谢,但我已经尝试过等待,您可以看到我在问题本身中提到的尝试。
  • 抱歉之前的。请立即检查更新。
  • 再次感谢,但是当您无头评论时它可以工作并不奇怪,因为在这种情况下它会在后台打开一个实际的浏览器并从那里展开 url,但您不能在服务器上使用它,因为服务器上没有合适的浏览器,
【解决方案2】:

我只使用了你的代码。

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument('--user-agent= Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:70.0) Gecko/20100101 Firefox/70.0');
#above user agent is an example but multiple different user agents were tried
chrome_options.add_argument('--headless')
chrome_options.add_argument('--no-sandbox')
browser = webdriver.Chrome(chrome_options=chrome_options)
browser.set_page_load_timeout(120)
browser.get("url")
final_url = browser.current_url
print(final_url)

快照

【讨论】:

  • 啊!这与我得到的相同,但不是正确的,在普通浏览器上打开那个短网址(twitter url)并检查最终网址。也许我在解释时不够清楚 - 正如你所看到的,你得到的是网站的主页 url,而不是它应该去的实际文章 url,即 - cumhuriyet.com.tr/haber/turkiye/1704484/… - 因此它没有重定向到最终实际页面,但在两者之间的某个地方迷失了方向。
  • 没关系:感谢您的努力,知道为什么会发生这种情况吗?