【问题标题】:Python -> Get all valid media download url's from a webfolderPython -> 从 web 文件夹中获取所有有效的媒体下载 url
【发布时间】:2021-08-08 17:33:19
【问题描述】:

我在这里有一个网站,它的链接结构是这样的

https://example.com/assets/contents/1627347928.mp4
https://example.com/assets/contents/1627342345.mp4
https://example.com/assets/contents/1627215324.mp4

我想使用 python 来获取所有下载链接,当我访问文件夹 /assets/contents/ 时,我得到一个 404 错误,所以我看不到从这个 web 文件夹下载的所有媒体,但是我知道所有的 MP4 文件都有 10 个字符,并且都以“1627******.mp4”开头 我可以做一个循环来检查该网站的所有链接并获取所有有效链接吗?谢谢!!!!!!!!!!!!我现在是 python 新手!

我可以检查是否有带有该代码的媒体 mp4/媒体我可以看到文件的标题,但是如何创建一个循环来检查所有链接并自动下载?或者只是告诉我有效的链接?谢谢!!

import requests
link = 'https://example.com/assets/contents/1627347923.mp4'
r = requests.get(link, stream=True)
print(r.headers)

【问题讨论】:

  • 你从哪里得到链接?一个html页面?请张贴具体信息。
  • 我这里没有所有链接,也不能在这里发布真实链接,因为它是私有内容,但链接结构是 example.com/assets/contents/1627*** ***.mp4,我想对这 6 个字符循环到 000000 到 999999 并获取所有媒体!现在明白了吗?
  • names = [ 1627347923, 1627347924, 1627347925] 列出一个列表,对其进行迭代并构建链接为'https://example.com/assets/contents/{}.mp4'.format(item)

标签: python file web-scraping python-requests download


【解决方案1】:

打印文件是否存在

import requests
names = [ 1627347923, 1627347924, 1627347925]
base = 'https://example.com/assets/contents/{}.mp4'

for item in names:
    link = base.format(item)
    print(link)
    r = requests.head(link, allow_redirects=True)
    if r.status_code == 200:
        print("found {}.mp4".format(item))
        #open('{}.mp4'.format(item), 'wb').write(r.content)
    else:
        print("File no found or error getting headers")

或者尝试下载

import requests
names = [ 1627347923, 1627347924, 1627347925]
base = 'https://example.com/assets/contents/{}.mp4'
for item in names:
    link = base.format(item)
    print(link)
    # uncomment below to download
    #r = requests.get(link, allow_redirects=True)
    #open('{}.mp4'.format(item), 'wb').write(r.content)

【讨论】:

  • 很好,如果我想用 0000000000 到 9999999999 填充数组,我该怎么做?
  • 哎呀,这是 10 亿个数字。不确定您是否可以或想要这样做。这意味着该网站有 10 亿次请求
  • 对不起,只有 1626000000 到 1627999999
  • 你有数字,谷歌如何根据该序列制作一个列表。顺便说一句,7 月 11 日至 8 月 3 日。
【解决方案2】:

是的,您可以运行一个循环,检查状态代码,或者如果 requests.get() 抛出错误,您将返回并获取所有文件,但有一些问题可能会阻止您选择它

  1. 您的文件格式为“1627******.mp4”,这意味着如果所有 * 都是数字,for 循环将检查 10^6 个条目,这样效率不高。如果您打算包含字符和特殊字符,那将是非常低效的。

  2. 如果将来您有超过 10^6 个文件怎么办?你的格式必须改变,所以你的代码也必须改变。

一个更简单、直接和有效的解决方案是有一个地方来存储您的数据、一个文件或更好的数据库,您可以在其中查询和获取所有文件。您只需运行查询即可获取必要的详细信息。

此外,404 错误意味着您尝试访问的页面未找到,在您的情况下,它本质上意味着它不存在。

检查链接是否存在的示例代码 a/c

files = []
links = ["https://www.youtube.com/","https://docs.python.org","https://qewrt.org"]

for i in links:
    try:
        requests.get(i) // If link doesnt exists, it throws an error, else the link is appended to the files list
        files.append(i)
    except:
        print(i+" doesnt exist")
print(files)

在此基础上,根据您的情况,检查所有文件是否以给定格式存在:

import requests

file_prefix = 'https://example.com/assets/contents/1627'

file_lists = []
for i in range(10**6):
    suffix = (6-len(str(i)))*"0"+str(i)+".mp4"
    file_name = file_prefix+suffix
    try:
        requests.get(file_name)
        file_lists.append(file_name)
    except:
        continue
for i in file_lists:
    print(i)

【讨论】:

  • Shashanka,所有链接都是10个字符的格式和所有数字,没有字母或特殊字符,我只想将所有有效链接打印在cmd或txt文件上......
  • 我明白了,我是说如果将来你有更多文件。
  • 我已经添加了一个示例代码来获得您想要的结果,但请注意,由于我之前给出的解释相同,这将需要一些时间。
【解决方案3】:

根据你所有的代码和 LMC 代码,我做了一个测试所有 MP4 文件并向我显示“标题”的事情,我如何只能选择具有 mp4 有效文件的链接,如链接

import requests

file_prefix = 'https://example.com/assets/contents/1627'

file_lists = []
for i in range(10**6):
    suffix = (6-len(str(i)))*"0"+str(i)+".mp4"
    file_name = file_prefix+suffix
    try:
        requests.get(file_name)
        file_lists.append(file_name)
        r = requests.get(file_name, stream=True)
        print(file_name)        
        print(r.headers)
    except:
        continue
for i in file_lists:
    print(i)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-30
    • 2019-08-19
    • 2018-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多