Python 我怎样才能从网页上下载文件的链接而不必刮去文件本身?

Python 我怎样才能从网页上下载文件的链接而不必刮去文件本身?,python,html,http,packet-sniffers,jdownloader,Python,Html,Http,Packet Sniffers,Jdownloader,我想用Python编写一个下载管理器,比如JDownloader,它可以为您下载简单的文件。但并非每个文件在文档中都有下载url。如果文件在文档中类似“不可见”,如何获取下载url? 我在互联网上发现,网络嗅探可能是有效的,但它似乎不是我需要的正确的东西。JDownloader只是检查一下,直接找到您需要的东西。这是怎么回事?例如: 顺便说一句,我是一个初学者。看看您的示例页面,它有3个指向文件的HREF。当您查看a href时,有时您可以判断它是一个基于扩展名的文件。但是,在正常情况下,网站可

我想用Python编写一个下载管理器,比如JDownloader,它可以为您下载简单的文件。但并非每个文件在文档中都有下载url。如果文件在文档中类似“不可见”,如何获取下载url? 我在互联网上发现,网络嗅探可能是有效的,但它似乎不是我需要的正确的东西。JDownloader只是检查一下,直接找到您需要的东西。这是怎么回事?例如:


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

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

所以,你有两件事要做

  • 检索网页上的所有定位标记和HREF。(你可以使用 此步骤的“美化组”)
  • 从html URL中筛选出文件URL。(这是一个棘手的部分。您可能会遇到静态资产,如.js或.css或图像文件等。)
  • 要执行第二部分,可以使用python请求库获取内容类型。下面是一个小例子:

    [3]中的
    :导入请求
    在[4]中:response=requests.head('https://speed.hetzner.de/100MB.bin,允许_重定向=True)
    在[5]中:响应
    出[5]:
    在[6]中:response.content
    Out[6]:b“
    在[7]中:response.headers
    Out[7]:{'Server':'nginx','Date':'2019年5月7日星期二21:21:28 GMT','Content Type':'application/octet stream','Content Length':'104857600'
    ,“上次修改”:“2013年10月8日星期二11:48:13 GMT”,“连接”:“保持活动”,“ETag”:“5253f0fd-6400000”,“严格的传输安全”:“ma”
    x-age=15768000;包括子域“,”接受范围“:”字节“}
    
    如果您在这里查看
    响应.headers
    ,您可以看到设置为
    'application/octet stream'
    的“内容类型”。此字段应用于筛选出文件。为了决定它是否是可下载的,你必须寻找它。一旦你有了这个过滤列表,它就是这个网页上可下载文件的列表


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

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

    所以,你有两件事要做

  • 检索网页上的所有定位标记和HREF。(你可以使用 此步骤的“美化组”)
  • 从html URL中筛选出文件URL。(这是一个棘手的部分。您可能会遇到静态资产,如.js或.css或图像文件等。)
  • 要执行第二部分,可以使用python请求库获取内容类型。下面是一个小例子:

    [3]中的
    :导入请求
    在[4]中:response=requests.head('https://speed.hetzner.de/100MB.bin,允许_重定向=True)
    在[5]中:响应
    出[5]:
    在[6]中:response.content
    Out[6]:b“
    在[7]中:response.headers
    Out[7]:{'Server':'nginx','Date':'2019年5月7日星期二21:21:28 GMT','Content Type':'application/octet stream','Content Length':'104857600'
    ,“上次修改”:“2013年10月8日星期二11:48:13 GMT”,“连接”:“保持活动”,“ETag”:“5253f0fd-6400000”,“严格的传输安全”:“ma”
    x-age=15768000;包括子域“,”接受范围“:”字节“}
    
    如果您在这里查看
    响应.headers
    ,您可以看到设置为
    'application/octet stream'
    的“内容类型”。此字段应用于筛选出文件。为了决定它是否是可下载的,你必须寻找它。一旦你有了这个过滤列表,它就是这个网页上可下载文件的列表


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

    但是想象一下,您的站点没有url,但页面上仍然有一个视频。我所知道的是,这个视频url在你点击视频时显示,但并非每次都是这样。你的意思是,你需要执行“用户操作”,然后才能“看到”html文档中的url?你总是可以解析html并获得多媒体元素的列表,对吗?这是一个非常开放的问题。我建议你做一点研究,收集你想要支持的所有html元素,并寻找类似于我的答案中建议的方法,过滤你从这些标签收集的数据