Python请求模块的下载速度非常低

时间:2017-11-19 15:38:29

标签: python performance download python-requests progress-bar

问题:

我一直在尝试使用Python的请求模块制作一个简单的动漫下载器。我正在使用progressbar2模块跟踪进度。在尝试下载时,我的速度为0.x B / s。我认为问题在于根据this question选择chunk_size。但无论块大小如何,我的速度都可以忽略不计。

规格和信息:

  1. 我正在使用Windows 10,Python 3.5,最新的requests模块(2.18.4),并且拥有一个体面的互联网,速度为40Mbps。
  2. 我可以通过浏览器(Chrome)和 Free从链接下载文件 下载管理器约1分钟。
  3. 链接完全正常,我没有防火墙冲突。
  4. 代码:

    import os
    import requests
    import progressbar
    from progressbar import *
    
    os.chdir('D:\\anime\\ongoing')
    
    widgets = ['Downloading: ', Percentage(), ' ', Bar(marker='#',left='[',right=']'),
               ' ', ETA(), FileTransferSpeed()]
    
    url = 'https://lh3.googleusercontent.com/AtkUe87GbrINzTJS_Fj4W08CGqlOg9anwEF7n5-eKXcyS1RsaB8LdzRVaXloiJwiaX2IX1xqUiA=m22?title=(720P%20-%20mp4)Net-juu%20no%20Susume%20Episode%207'
    r = requests.get(url,stream=True)
    remotesize = r.headers['content-length']
    
    print("Downloading {}.mp4!\n\n".format(url.split('title=')[1]))
    pbar = ProgressBar(max_value=int(remotesize),widgets=widgets).start()
    i = 0
    with open('./tempy/tempy_file.mp4', 'wb') as f:
       for chunk in r.iter_content(chunk_size=5*1024*1024): 
          if chunk:
             i = i + len(chunk)
             f.write(chunk)
             pbar.update(int(i/int(remotesize) * 100))
    pbar.finish()         
    print("Successfully downloaded!\n\n")
    

    截图:

    The speed is just ridiculous.

    预期解决方案:

    不确定此Github Issue是否已修复。

    1. 最好在请求模块中找到解决方案,但我愿意接受Python范围内可以让我获得良好速度的任何答案。
    2. 我希望下载能够明智,因为我想通过进度条查看进度。所以shutil.copyfileobj(r.raw)不是我想要的。
    3. 我确实尝试使用多个线程,但它只是复杂的事情并没有帮助。我认为问题是将块写入缓冲区本身并在线程之间拆分此任务没有帮助。
    4. 编辑:

      根据建议,我通过包含随机用户代理来尝试它,如下所示:

      desktop_agents = ['Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36',
                       'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36',
                       'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36',
                       'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/602.2.14 (KHTML, like Gecko) Version/10.0.1 Safari/602.2.14',
                       'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36',
                       'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.98 Safari/537.36',
                       'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.98 Safari/537.36',
                       'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36',
                       'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36',
                       'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0']
      
      def random_headers():
          return {'User-Agent': choice(desktop_agents),'Accept':'text/html,video/mp4,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'}
      

      并使用标题r = requests.get(url,stream=True,headers=random_headers())

      发送请求

      然而,它没有任何区别。 :(

      编辑编号。 2:

      使用“http://www.sample-videos.com/video/mp4/720/big_buck_bunny_720p_5mb.mp4”中的示例视频进行了尝试。同样的问题仍然存在。 :/

2 个答案:

答案 0 :(得分:1)

就像其他人建议的那样,谷歌正在遏制速度。为了克服这个问题,我使用Selenium webdriver下载链接:

from selenium import webdriver
chrome_options = webdriver.ChromeOptions()
prefs = {'download.default_directory' : dir_name}
            chrome_options.add_experimental_option('prefs', prefs)
            driver = webdriver.Chrome(chrome_options=chrome_options)
driver.get(li)

好吧,至少我能够通过谷歌浏览器的下载器以尽可能快的速度完全自动化下载。

所以,如果有人可以帮我解决这个问题,请在评论中回复,如果有帮助,我会提出意见:

  1. 在Python中找出一种方法,为每个文件使用多个连接,就像免费下载管理器使用的方式一样。
  2. 以下是完整script的链接。

答案 1 :(得分:-1)

您是否尝试使用您的用户代理和Google可能需要的其他标头填写您的请求标头,以便不将您标记为Bot并限制下载速度?