我试图从不允许机器人的网站下载材料。我可以设法通过这种方式将标头传递给请求:
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.还有其他方法可以使其发挥作用吗?
提前非常感谢!
当我使用 http 请求运行 python 脚本时,我正在处理类似的问题,它总是返回 301,然后用 OK 200 正确打开。这是因为我在 Apache 设置中从 http 重定向到 https。这就是 301 代码:-)