【发布时间】: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 而不是主网站主页/索引页面
- 正常等待
browser.get(url)
time.sleep(25)
-
使用 WebDriverWait-
WebDriverWait(browser,20) -
带有预期条件
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
最后我们看到的是主页而不是网站页面。
-
请求库 -
response = requests.get(Url, allow_redirects=True, headers=self.headers, timeout=30)
(标头包含用户代理,但尝试使用来自浏览器的实际相同请求标头,以获得正确的最终 url 响应)- 获取主页 --
检查response.history 的重定向,我们从 t.co(twitter url) 看到 - 我们重定向到短 url,然后重定向到网站主页并结束。
- 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