使用Python查找最终重定向的网址

时间:2019-08-08 21:59:24

标签: http url redirect web-scraping python-requests

我正在尝试使用python查找网址的最终重定向网址。我尝试了来自stackoverflow答案的各种解决方案,但对我没有用。我只得到原始网址。

具体来说,我尝试了requestsurllib2urlparse库,但它们都没有按预期运行。这是我尝试过的一些代码:

解决方案1:

s = requests.session()
r = s.post('https://www.boots.com/search/10055096', allow_redirects=True)
print(r.history)
print(r.history[1].url)

结果:

[<Response [301]>, <Response [302]>]
https://www.boots.com/search/10055096

解决方案2:

import urlparse
url = 'https://www.boots.com/search/10055096'
try:
    out = urlparse.parse_qs(urlparse.urlparse(url).query)['out'][0]
    print(out)
except Exception as e:
    print('not found')

结果: not found

解决方案3:

import urllib2
def get_redirected_url(url):
    opener = urllib2.build_opener(urllib2.HTTPRedirectHandler)
    request = opener.open(url)
    return request.url
print(get_redirected_url('https://www.boots.com/search/10055096'))

结果:

HTTPError: HTTP Error 302: The HTTP server returned a redirect error that would lead to an infinite loop.
The last 30x error message was:
Found

下面的预期URL是最终重定向的页面,这就是我要返回的内容。

原始网址: https://www.boots.com/search/10055096

预期的网址: https://www.boots.com/gillette-fusion5-razor-blades-4pk-10055096

解决方案1是最接近的解决方案。至少它返回了2个响应,但第二个响应不是最后一页,似乎是正在查看其内容的加载页面。

1 个答案:

答案 0 :(得分:1)

第一个请求返回一个html文件,该文件包含一个用于更新站点的JS,requests未处理Java脚本。您可以使用

找到更新的链接
import requests
from bs4 import BeautifulSoup
import re

r = requests.get('https://www.boots.com/search/10055096')
soup = BeautifulSoup(r.content,'html.parser')
reg = soup.find('input',id='searchBoxText').findNext('script').contents[0]
print(re.search(r'ht[\w\://\.-]+', reg).group())