我正在使用的网站'musescore.com‘,它有许多文件的'.mxl’格式,我需要自动下载与Python。
网站上的每个文件都有一个唯一的ID号。下面是一个指向示例文件的链接:
https://musescore.com/user/43726/scores/76643URL中的最后一个数字是该文件的id号。我不知道mxl评分文件在网站上的位置,但我知道要下载该文件,必须访问以下网址:
https://musescore.com/score/76643/download/mxl该链接对于每个文件都是相同的,但是其中包含了该文件的特定ID号。据我所知,这个url执行下载文件的代码,而不是文件的实际路径。
这是我的密码:
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文件。这一定意味着我对网站进行了不当的认证。我怎么才能解决这个问题?
发布于 2019-01-15 17:24:40
通过将auth参数传递给get,您将尝试利用HTTP基本身份验证,这不是这个特定站点所使用的。您需要使用request.Session实例将其发送到登录端点,并维护该过程产生的cookie。
此外,此站点使用csrf令牌,您必须首先从登录页面中提取该令牌,以便将其与post一起包含到登录端点。
下面是一个工作示例,显然您需要将用户名和密码更改为您自己的用户名和密码:
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']}")结果,内容类型显示它正在成功下载文件:
Status: 200
Content-Type: application/vnd.recordare.musicxmlhttps://stackoverflow.com/questions/54203589
复制相似问题