我正在编写一个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
答案 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']