Python爬虫无法正常工作

时间:2017-06-06 14:27:22

标签: python http-headers web-crawler python-requests

我刚刚编写了一个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抓取工具的新手,所以有人可以帮我找到该程序出了什么问题吗?

1 个答案:

答案 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)