如何在不下载文件的情况下获取重定向的URL

时间:2013-11-18 14:05:08

标签: python python-2.7 python-requests

我正在编写一个Web scraper,基本上我正在使用请求和bs4是一个提供样式https://downlaod.domain.com/xid_39428423_1的所有内容然后将您重定向到实际文件的网站。我想要的是一个在下载文件之前获取重定向链接的命令,所以我可以检查我是否已经下载了所述文件。我目前的代码片段是这样的:

def download_file(file_url,s,thepath):
    if not os.path.isdir(thepath):
        os.makedirs(thepath)
    print 'getting header'
    i = s.head(file_url)
    urlpath = i.url
    name = urlsplit(urlpath)[2].split('/')
    name = name[len(name)-1]
    if not os.path.exists(thepath + name):
        print urlpath
        i = s.get(urlpath)
        if i.status_code == requests.codes.ok:
            with iopen(thepath + name, 'wb') as file:
                file.write(i.content)
        else:
            return False

如果我将s.head更改为s.get它可以工作,但它会下载文件两次。有没有办法在不下载的情况下获取重定向的网址?

解决 最终的代码看起来像这样,谢谢!

def download_file(file_url,s,thepath):
    if not os.path.isdir(thepath):
        os.makedirs(thepath)
    print 'getting header'
    i = s.get(file_url, allow_redirects=False)
    if i.status_code == 302:
        urlpath = i.headers['location']
    else: 
        urlpath = file_url
    name = urlsplit(urlpath)[2].split('/')
    name = name[len(name)-1]
    if not os.path.exists(thepath + name):
        print urlpath
        i = s.get(urlpath)
        if i.status_code == requests.codes.ok:
            with iopen(thepath + name, 'wb') as file:
                file.write(i.content)
        else:
            return False

1 个答案:

答案 0 :(得分:1)

您可以使用allow_redirects标记并将其设置为False(请参阅the documentation)。这样.get()将不会遵循重定向,这允许您在检索文件本身之前检查响应。

换句话说,而不是:

i = s.head(file_url)
urlpath = i.url

你可以写:

i = s.get(file_url, allow_redirects=False)
urlpath = i.headers['location']