python urllib.request.URLOpener 返回 301 响应

问题描述 投票:0回答:1

我试图从不允许机器人的网站下载材料。我可以设法通过这种方式将标头传递给请求:

url = 'https://www.superdatascience.com/machine-learning/'
req = urllib.request.Request(url, headers = {'user-agent':'Mozilla/5.0'})
res = urllib.request.urlopen(req)
soup = bs(res,'lxml')
links = soup.findAll('a')
res.close()
hrefs = [link.attrs['href'] for link in links]

# Now am filtering in zips only
zips = list(filter(lambda x : 'zip' in x, hrefs))

我希望基里尔能够原谅我,老实说我并没有任何不道德的意思。只是想以编程方式实现。

现在,当我拥有 zip 文件的所有链接时,我需要检索它们的内容。而且

urllib.request.urlretrieve
显然禁止通过脚本下载。所以,我通过 URLOpener 来完成:

opener = urllib.request.URLopener()
opener.version = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'    
for zip in zips:
    file_name = zip.split('/')[-1]
    opener.retrieve(zip, file_name)

以上返回:

HTTPError: HTTP Error 301: Moved Permanently

我尝试没有循环,想到了一些愚蠢的事情,并用一种方法做到了

addheaders

opener = urllib.request.URLopener()
opener.addheaders = [('User-agent','Mozilla/5.0')]
opener.retrieve(zips[1], 'file.zip')

但它返回了相同的响应,但没有加载资源。

我有两个问题: 1.我的代码有问题吗?如果是的话我做错了什么? 2.还有其他方法可以使其发挥作用吗?

提前非常感谢!

python-3.x urllib http-status-code-301 urlretrieve
1个回答
0
投票

当我使用 http 请求运行 python 脚本时,我正在处理类似的问题,它总是返回 301,然后用 OK 200 正确打开。这是因为我在 Apache 设置中从 http 重定向到 https。这就是 301 代码:-)

© www.soinside.com 2019 - 2024. All rights reserved.