1

我想用 Python 编写一个下载管理器,比如 JDownloader,它可以为你下载简单的文件。但并非每个文件在文档中都有下载 url。如果文件在文档中“不可见”,我如何获取下载网址?我在互联网上发现,网络嗅探可能有效,但它似乎不是我需要的正确方法。JDownloader 只是检查一下,然后直接找到您需要的内容。这是如何运作的 ?例如:https ://speed.hetzner.de/

顺便说一句,我是初学者。

4

1 回答 1

0

查看您的示例页面,它有 3 个指向文件的 href。当您查看 href 时,有时您可以根据扩展名判断它是一个文件。但是,在正常情况下,网站可以进行一些服务器端处理,然后返回一个文件。有时 URL 甚至不是文件,它们指向其他页面。

所以,你有两件事要做。

  1. 检索网页上的所有锚标记和 href。(这一步可以使用 BeautifulSoup)
  2. 从 html url 中过滤掉文件 url。(这是棘手的部分。您可能会遇到 .js 或 .css 或图像文件等静态资源。)

要执行第二部分,您可以使用 python requests 库来获取内容类型。这是一个小例子:

In [3]: import requests                                                                                                                       

In [4]: response = requests.head('https://speed.hetzner.de/100MB.bin', allow_redirects=True)                                                  

In [5]: response                                                                                                                              
Out[5]: <Response [200]>

In [6]: response.content                                                                                                                      
Out[6]: b''

In [7]: response.headers                                                                                                                      
Out[7]: {'Server': 'nginx', 'Date': 'Tue, 07 May 2019 21:21:28 GMT', 'Content-Type': 'application/octet-stream', 'Content-Length': '104857600'
, 'Last-Modified': 'Tue, 08 Oct 2013 11:48:13 GMT', 'Connection': 'keep-alive', 'ETag': '"5253f0fd-6400000"', 'Strict-Transport-Security': 'ma
x-age=15768000; includeSubDomains', 'Accept-Ranges': 'bytes'}

如果您查看response.headers此处,您可以看到设置为 的“内容类型” 'application/octet-stream'。此字段应用于过滤掉文件。为了确定它是否可下载,您还必须查找其他内容类型。获得此过滤列表后,它就是此网页上可下载文件的列表。

请注意,我使用requests.head的是获取内容类型。使用 HEAD 请求获取有关 URL 的一些元信息。如果您执行 GET/POST,它可能会超时。

于 2019-05-07T21:48:21.830 回答