0

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

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.有没有其他方法可以让它工作?

非常感谢提前!

4

0 回答 0