【问题标题】:How can I use multithreading for video download?如何使用多线程进行视频下载?
【发布时间】:2015-09-15 06:15:08
【问题描述】:

我正在尝试使用 python 下载视频。

我正在尝试使用多线程加快下载速度,但我无法在requestsurllib2 中提出解决方案。

另外,如果有人可以提供有关如何解决它的代码,那将非常有帮助。

这是我尝试的代码:

import requests
http_proxy  = "http://edcguest:edcguest@172.31.100.29:3128"
https_proxy = "https://edcguest:edcguest@172.31.100.29:3128"
ftp_proxy   = "ftp://edcguest:edcguest@172.31.100.29:3128"

proxyDict = { 
          "http"  : http_proxy, 
          "https" : https_proxy, 
          "ftp"   : ftp_proxy
        }

def download_file(url):
    resume_byte_pos = 0
    end_byte_pos = 432526330
    # NOTE the stream=True parameter
    resume_header = {'Range': 'bytes=%d-%d(resume_byte_pos,end_byte_pos)}
    #r = requests.get(url, stream=True, proxies=proxyDict)
    r = requests.get(url, stream=True,proxies=proxyDict,headers=resume_header)
    print r.headers


    with open('ab2.mp4', 'wb') as f:
         for chunk in r.iter_content(chunk_size=1024): 
               if chunk: # filter out keep-alive new chunks
                   f.write(chunk)
                   f.flush()

download_file('https://r2---sn-o3o-qxal.googlevideo.com/videoplayback?key=yt5&sver=3&signature=3D4D50B11C6206B737185B7A9887A72FE356C6DF.87458BB3BF357CEF131BEDF0C0ED3DC08F087646&upn=8n6wa_1gM_o&source=youtube&requiressl=yes&mime=video%2Fmp4&ip=14.139.249.194&expire=1442331973&ratebypass=yes&lmt=1441845538878516&mm=31&ipbits=0&mn=sn-o3o-qxal&pl=24&sparams=dur%2Cid%2Cinitcwndbps%2Cip%2Cipbits%2Citag%2Clmt%2Cmime%2Cmm%2Cmn%2Cms%2Cmv%2Cpl%2Cratebypass%2Crequiressl%2Csource%2Cupn%2Cexpire&fexp=9408710%2C9409069%2C9409170%2C9412773%2C9415365%2C9415485%2C9415942%2C9416023%2C9416126%2C9416333%2C9416729%2C9417707%2C9417710%2C9417818%2C9418153%2C9418162%2C9418200%2C9418245%2C9418448%2C9418986%2C9419773%2C9419788%2C9419837%2C9420348%2C9420777%2C9420798&id=o-ALtyLWP7o7PqDhINh6FWp4v4FC8-3pQoZ0UH4COW6v5p&mt=1442310331&dur=8384.609&mv=m&initcwndbps=4191250&ms=au&itag=18&cpn=zzjuCmNROtaupQMW&ptk=Apple%252Bvid&oid=ffsQQyXI443h2PgMzMjp-g&ptchn=E_M8A5yxnLfW0KghEeajjw&pltype=content&c=WEB&cver=html5')

【问题讨论】:

  • 可能使用multiprocessing 而不是threading 来瘫痪下载。
  • 某服务器不支持零件需求。您无法加快下载视频的速度。时间=文件大小/接收速度。如果支持的粒度,您必须使用额外的系统资源来组合它们。你可以按照上面说的做。
  • stackoverflow 上的问题应该显示您尝试过的代码以及您认为它不起作用的原因。请用您尝试过的内容更新您的问题。此外,请认真考虑@dsgdfg 的评论。一些服务器可能支持请求块,但很多可能不支持。
  • 我假设 OP 想要并行下载 n 不同的文件。否则,是的,@dsgdfg 所说的适用,但坦率地说,我不会像这样浪费时间。这种问题如果有一个有效的解决方案,它已经预先打包在一个模块或库中。如果没有这样的库,自己编写可能太繁重了,除非你有时间和金钱可以浪费。
  • 其实我已经被分配了一个项目,所以这就是我工作的原因。如果你能建议我的方式,请回答

标签: python multithreading python-requests urllib2 urllib3


【解决方案1】:

urllib2 is not thread-safe,因此如果与threading 一起使用,请注意。

不过,urllib3 确实是 thread safe,所以你可以考虑使用它。

或者,如果您有一个基于 urllib2 的库,您不想重写您将用于批量下载的库,您可以探索类似 Celery 或 @ 的任务队列987654325@.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-28
    • 2019-05-25
    • 2018-07-20
    • 1970-01-01
    • 1970-01-01
    • 2018-05-19
    • 1970-01-01
    相关资源
    最近更新 更多