我会解释我是如何弄明白这一点的,以帮助您理解:
我用浏览器(Chrome)DevTools中的‘Network’(网络)选项卡来查找浏览器发送给服务器的成功请求.这是允许您成功访问文件的请求,而不是来自不能有效下载文件的python脚本发送的请求,而是返回http错误代码403 - Forbidden(注意:就我而言,这显然是指示禁止以这种方式下载文件的网站).
我查看了请求头,并在request.get()
的headers
参数中添加了一个.这给了我一个成功的http状态代码200 - OK.我继续删除标头,直到找到所需的最小标头集,即"Cookie"和"User-Agent".如果将这些标头复制到request.get()
的headers
(Headers是一个字典)参数中,它就会起作用
也就是说,您需要从浏览器的DevTool中复制User-Agent和Cookie的值.Cookie也会随着时间的推移而变化,因此无论如何您都需要使用浏览器来获取请求的最新值.或者,如果可能的话,您还需要真正深入地挖掘站点的工作原理,并对其Cookie生成进行反向工程.我建议不要做得太深入,因为在我看来,该网站是在表明他们不想让你以这样的编程方式下载文件.
从这里到哪里go
显然,Heliyon集合中的每一篇论文,也就是您的示例PDF所在的集合,也都是hosted on ScienceDirect:
每一篇发表的文章都将立即在Cell.com/Heliyon和Science Direct上获得,并将被PubMed、Scope us、科学网™和科学引文索引扩展™(SCIE)编入索引,以确保它能接触到尽可能广泛的受众.截至2023年6月,Heliyon的影响系数为4.0.
运行ScienceDirect的Elsevier有一个free-to-use API,你可以很容易地下载文章,包括你想下载的文章,只需要doi和你的API密钥.我在下面整理了一个非常简单的脚本,一旦你已经registered for the Elsevier API并创建了自己的api密钥,你就可以使用它:
api_template = 'https://api.elsevier.com/content/article/doi/{doi}?apiKey={api_key}&httpAccept={http_accept}'
doi = '10.1016/j.heliyon.2018.e00938'
api_key = '<your_api_key>'
http_accept = 'application/pdf'
uri = api_template.format(doi=doi, api_key=api_key, http_accept=http_accept)
res = requests.get(uri)
with open('out.pdf', 'wb') as f:
f.write(res.content)
我没有包括错误处理之类的东西,甚至没有将其包装在函数中,但这应该可以让您开始使用它.祝你好运!