我试图从不允许机器人的网站上下载材料。我可以设法通过这种方式将标头传递给 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.有没有其他方法可以让它工作?
非常感谢提前!