我刚刚编写了一个Python抓取工具,可以从freemidi.org下载midi文件。查看Chrome中的请求标头,我发现" Referer"如果下载页面为https://freemidi.org/download-20225(称为" getter-20225"稍后),则属性必须为https://freemidi.org/getter-20225(称为" download-20225"稍后) )以便正确下载midi文件。我在Python中这样做,设置标题如下:
headers = {
'Referer': 'https://freemidi.org/download-20225',
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
}
与我在Chrome中查看过的请求标题完全相同,我尝试使用这行代码下载文件。
midi = requests.get(url, headers=headers).content
但是,它无法正常工作。它没有下载midi文件,而是下载了网站的html文件" download-20225"。我后来发现,如果我试图访问该网站" getter-20225"直接,它需要我" download-20225"同样。我认为它可能表明标题是错误的,所以我把它带到了另一个网站而不是开始下载。
我是编写Python抓取工具的新手,所以有人可以帮我找到该程序出了什么问题吗?
答案 0 :(得分:1)
这里看起来问题是带有midi文件的页面(例如“getter-20225”)想要在下载歌曲后将你重定向回歌曲页面(例如“download-20225”)。但是,请求仅返回重定向中最终页面的内容。
您可以将allow_redirects参数设置为False,以使请求从“getter”页面(即midi文件)返回内容:
midi = requests.get(url, headers=headers, allow_redirects=False)
请注意,如果要将midi文件写入磁盘,则需要以二进制模式打开目标文件(因为midi文件以字节为单位写入)。
with open('example.mid', 'wb') as ex:
ex.write(midi.content)