首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何下载具有身份验证的文件?

如何下载具有身份验证的文件?
EN

Stack Overflow用户
提问于 2019-01-15 17:02:01
回答 1查看 1.2K关注 0票数 0

我正在使用的网站'musescore.com‘,它有许多文件的'.mxl’格式,我需要自动下载与Python。

网站上的每个文件都有一个唯一的ID号。下面是一个指向示例文件的链接:

代码语言:javascript
复制
https://musescore.com/user/43726/scores/76643

URL中的最后一个数字是该文件的id号。我不知道mxl评分文件在网站上的位置,但我知道要下载该文件,必须访问以下网址:

代码语言:javascript
复制
https://musescore.com/score/76643/download/mxl

该链接对于每个文件都是相同的,但是其中包含了该文件的特定ID号。据我所知,这个url执行下载文件的代码,而不是文件的实际路径。

这是我的密码:

代码语言:javascript
复制
import requests

url = 'https://musescore.com/score/76643/download/mxl'
user = 'myusername'
password = 'mypassword'

r = requests.get(url, auth=(user, password), stream=True)
with open('file.mxl', 'wb') as f:
  for chunk in r.iter_content(chunk_size=1024):
    f.write(chunk)

这段代码下载了一个网页,上面说我需要登录才能下载该文件。它应该下载这个分数的mxl文件。这一定意味着我对网站进行了不当的认证。我怎么才能解决这个问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-15 17:24:40

通过将auth参数传递给get,您将尝试利用HTTP基本身份验证,这不是这个特定站点所使用的。您需要使用request.Session实例将其发送到登录端点,并维护该过程产生的cookie。

此外,此站点使用csrf令牌,您必须首先从登录页面中提取该令牌,以便将其与post一起包含到登录端点。

下面是一个工作示例,显然您需要将用户名和密码更改为您自己的用户名和密码:

代码语言:javascript
复制
import requests
from bs4 import BeautifulSoup

s = requests.Session()
r = s.get('https://musescore.com/user/login')

soup = BeautifulSoup(r.content, 'html.parser')
csrf = soup.find('input', {'name': '_csrf'})['value']

s.post('https://musescore.com/user/auth/login/process', data={
    'username': 'herp@derp.biz',
    'password': 'secret',
    '_csrf': csrf,
    'op': 'Log in'
})

r = s.get('https://musescore.com/score/76643/download/mxl')

print(f"Status: {r.status_code}")
print(f"Content-Type: {r.headers['content-type']}")

结果,内容类型显示它正在成功下载文件:

代码语言:javascript
复制
Status: 200
Content-Type: application/vnd.recordare.musicxml
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54203589

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档