【问题标题】:How can I get download links of files from a Webpage without scraping the document itself?如何在不抓取文档本身的情况下从网页获取文件的下载链接?
【发布时间】:2019-09-25 12:09:18
【问题描述】:

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

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

【问题讨论】:

  • 您可以像 JDownloader 一样在 Python 中检查 Pyload 作为下载管理器。而且它是开源的。

标签: python html http packet-sniffers jdownloader


【解决方案1】:

查看您的示例页面,它有 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' 的“内容类型”。此字段应用于过滤掉文件。 There are other content types,您必须寻找,以确定它是否可下载。获得此过滤列表后,它就是此网页上可下载文件的列表。

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

【讨论】:

  • 但是想象一下,你有一个没有网址的网站,但页面上仍然有视频。我所知道的是,在您点击视频时会显示此视频网址
  • 但不是每次都这样
  • 您的意思是您需要执行“用户操作”才能“看到”html 文档中的 url?
  • 您总是可以解析 html 并获取多媒体元素列表,对吗?这是一个非常开放的问题。我建议您进行一些研究并收集您想要支持的所有 html 元素,并寻找类似于您从这些标签收集的答案过滤数据中建议的方法。
  • 您应该开始关注它,然后添加功能以支持视频/gifs/音乐等。
猜你喜欢
  • 2019-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-19
  • 2015-10-09
  • 1970-01-01
  • 2023-02-25
相关资源
最近更新 更多