我正在try 从这个网站下载一个.pdf URL PDFLINKhttps://www.cell.com/heliyon/pdf/S2405-8440(18)33206-7.pdf 我可以从我的浏览器中查看它,但使用带有Python的请求不能让我下载它.

我try 了以下方法,但无法正常下载.它将返回403或表示.pdf已损坏.但我可以查看链接https://www.cell.com/heliyon/pdf/S2405-8440(18)33206-7.pdf 有什么主意吗?

import requests


def download_pdf(url):
    response = requests.get(url)
    with open('sample.pdf', 'wb') as f:
        f.write(response.content)


if __name__ == "__main__":
    url = "https://www.cell.com/heliyon/pdf/S2405-8440(18)33206-7.pdf"
    download_pdf(url)

推荐答案

我会解释我是如何弄明白这一点的,以帮助您理解:

我用浏览器(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)

我没有包括错误处理之类的东西,甚至没有将其包装在函数中,但这应该可以让您开始使用它.祝你好运!

Python相关问答推荐

如何在BeautifulSoup中链接Find()方法并处理无?

聚合具有重复元素的Python字典列表,并添加具有重复元素数量的新键

用NumPy优化a[i] = a[i-1]*b[i] + c[i]的迭代计算

从groupby执行计算后创建新的子框架

如何获得每个组的时间戳差异?

运输问题分支定界法&

SQLAlchemy Like ALL ORM analog

我如何根据前一个连续数字改变一串数字?

未知依赖项pin—1阻止conda安装""

Python中的变量每次增加超过1

dask无groupby(ddf. agg([min,max])?''''

在Python中使用yaml渲染(多行字符串)

当条件满足时停止ODE集成?

如何求相邻对序列中元素 Select 的最小代价

浏览超过10k页获取数据,解析:欧洲搜索服务:从欧盟站点收集机会的微小刮刀&

Polars时间戳同步延迟计算

按条件计算将记录拆分成两条记录

如果服务器设置为不侦听创建,则QWebSocket客户端不连接到QWebSocketServer;如果服务器稍后开始侦听,则不连接

pyspark where子句可以在不存在的列上工作

对列中的数字进行迭代,得到n次重复开始的第一个行号