【问题标题】:Can't download file over HTTP - session is hanging无法通过 HTTP 下载文件 - 会话挂起
【发布时间】:2019-09-21 09:51:25
【问题描述】:

一位朋友告诉我,当他进入以下网站时:
http://tatoochange.com/watch/OGgmlnav-joe-gould-s-secret/vip.html

他注意到当他播放视频时,在 Fiddler 上他看到了文件的路径 (http://85.217.223.24/vids/joe_goulds_secret_2000.mp4):

于是他尝试从浏览器下载,但收到错误:

播放视频时,我用 Burpe 检查了GET 请求

GET /vids/joe_goulds_secret_2000.mp4 HTTP/1.1
Host: 85.217.223.24
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.0
Accept: video/webm,video/ogg,video/*;q=0.9,application/ogg;q=0.7,audio/*;q=0.6,*/*;q=0.5
Accept-Language: en-US,en;q=0.5
Referer: http://entervideo.net/watch/3accec760b23ad4
Range: bytes=0-
Connection: close

我把它转换成python脚本:

import requests

session = requests.Session()

headers = {"Accept":"video/webm,video/ogg,video/*;q=0.9,application/ogg;q=0.7,audio/*;q=0.6,*/*;q=0.5","User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.0","Referer":"http://entervideo.net/watch/3accec760b23ad4","Connection":"close","Accept-Language":"en-US,en;q=0.5","Range":"bytes=0-"}
response = session.get("http://85.217.223.24/vids/joe_goulds_secret_2000.mp4", headers=headers)

print("Status code:   %i" % response.status_code)
print("Response body: %s" % response.content)

当我运行它时,它被挂了。
不知道要不要下载。

我的问题是,为什么我不能通过访问它来从浏览器下载它?
其次,即使我使用的脚本没有出现任何错误,它也会挂起......

【问题讨论】:

    标签: python http get


    【解决方案1】:

    我设法做到了。
    需要注意的是响应是206,这是部分内容。

    解决办法:

    import os,requests
    def download():
        headers = {"Accept": "video/webm,video/ogg,video/*;q=0.9,application/ogg;q=0.7,audio/*;q=0.6,*/*;q=0.5",
                   "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.0",
                   "Referer": "http://entervideo.net/watch/3accec760b23ad4", "Connection": "close",
                   "Accept-Language": "en-US,en;q=0.5", "Range": "bytes=0-"}
        get_response = requests.get("http://85.217.223.24/vids/joe_goulds_secret_2000.mp4", headers=headers,stream=True)
        #file_name  = url.split("/")[-1]
        file_name = r'c:\tmp\joe_goulds_secret_2000.mp4'
        with open(file_name, 'wb') as f:
            count = 0
            for chunk in get_response.iter_content(chunk_size=1024):
                print('chunk: ' + str(count))
                count += 1
                if chunk: # filter out keep-alive new chunks
                    f.write(chunk)
    
    download()
    

    【讨论】:

      【解决方案2】:

      不建议使用 session.get 下载大文件。这主要用于接收 json 或 xml 列表的网络调用。要下载大文件,您应该按照此线程中显示的方法:

      Download large file in python with requests

      【讨论】:

        猜你喜欢
        • 2015-03-12
        • 1970-01-01
        • 2012-04-29
        • 1970-01-01
        • 2010-09-06
        • 1970-01-01
        相关资源
        最近更新 更多