先找一个视频地址试验一下:

# -*- coding: utf-8 -*-

import requests

def download_file(url, path):

with requests.get(url, stream=True) as r:

chunk_size = 1024

content_size = int(r.headers['content-length'])

print '下载开始'

with open(path, "wb") as f:

for chunk in r.iter_content(chunk_size=chunk_size):

f.write(chunk)

if __name__ == '__main__':

url = '就在原帖...'

path = '想存哪都行'

download_file(url, path)

遭遇当头一棒:

AttributeError: __exit__

这文档也会骗人的么!

看样子是没有实现上下文需要的__exit__方法。既然只是为了保证要让r最后close以释放连接池,那就使用contextlib的closing特性好了:

# -*- coding: utf-8 -*-

import requests

from contextlib import closing

def download_file(url, path):

with closing(requests.get(url, stream=True)) as r:

chunk_size = 1024

content_size = int(r.headers['content-length'])

print '下载开始'

with open(path, "wb") as f:

for chunk in r.iter_content(chunk_size=chunk_size):

f.write(chunk)

程序正常运行了,不过我盯着这文件,怎么大小不见变啊,到底是完成了多少了呢?还是要让下好的内容及时存进硬盘,还能省点内存是不是:

# -*- coding: utf-8 -*-

import requests

from contextlib import closing

import os

def download_file(url, path):

with closing(requests.get(url, stream=True)) as r:

chunk_size = 1024

content_size = int(r.headers['content-length'])

print '下载开始'

with open(path, "wb") as f:

for chunk in r.iter_content(chunk_size=chunk_size):

f.write(chunk)

f.flush()

os.fsync(f.fileno())

文件以肉眼可见的速度在增大,真心疼我的硬盘,还是最后一次写入硬盘吧,程序中记个数就好了:

def download_file(url, path):

with closing(requests.get(url, stream=True)) as r:

chunk_size = 1024

content_size = int(r.headers['content-length'])

print '下载开始'

with open(path, "wb") as f:

n = 1

for chunk in r.iter_content(chunk_size=chunk_size):

loaded = n*1024.0/content_size

f.write(chunk)

print '已下载{0:%}'.format(loaded)

n += 1

结果就很直观了:

已下载2.579129%

已下载2.581255%

已下载2.583382%

已下载2.585508%

心怀远大理想的我怎么会只满足于这一个呢,写个类一起使用吧:

# -*- coding: utf-8 -*-

import requests

from contextlib import closing

import time

def download_file(url, path):

with closing(requests.get(url, stream=True)) as r:

chunk_size = 1024*10

content_size = int(r.headers['content-length'])

print '下载开始'

with open(path, "wb") as f:

p = ProgressData(size = content_size, unit='Kb', block=chunk_size)

for chunk in r.iter_content(chunk_size=chunk_size):

f.write(chunk)

p.output()

class ProgressData(object):

def __init__(self, block,size, unit, file_name='', ):

self.file_name = file_name

self.block = block/1000.0

self.size = size/1000.0

self.unit = unit

self.count = 0

self.start = time.time()

def output(self):

self.end = time.time()

self.count += 1

speed = self.block/(self.end-self.start) if (self.end-self.start)>0 else 0

self.start = time.time()

loaded = self.count*self.block

progress = round(loaded/self.size, 4)

if loaded >= self.size:

print u'%s下载完成\r\n'%self.file_name

else:

print u'{0}下载进度{1:.2f}{2}/{3:.2f}{4} 下载速度{5:.2%} {6:.2f}{7}/s'.\

format(self.file_name, loaded, self.unit,\

self.size, self.unit, progress, speed, self.unit)

print '%50s'%('/'*int((1-progress)*50))

运行:

下载开始

下载进度10.24Kb/120174.05Kb 0.01% 下载速度4.75Kb/s

/

下载进度20.48Kb/120174.05Kb 0.02% 下载速度32.93Kb/s

/

看上去舒服多了。

下面要做的就是多线程同时下载了,主线程生产url放入队列,下载线程获取url:

import requests

from contextlib import closing

import time

import Queue

import hashlib

import threading

import os

def download_file(url, path):

with closing(requests.get(url, stream=True)) as r:

chunk_size = 1024*10

content_size = int(r.headers['content-length'])

if os.path.exists(path) and os.path.getsize(path)>=content_size:

print '已下载'

return

print '下载开始'

with open(path, "wb") as f:

p = ProgressData(size = content_size, unit='Kb', block=chunk_size, file_name=path)

for chunk in r.iter_content(chunk_size=chunk_size):

f.write(chunk)

p.output()

class ProgressData(object):

def __init__(self, block,size, unit, file_name='', ):

self.file_name = file_name

self.block = block/1000.0

self.size = size/1000.0

self.unit = unit

self.count = 0

self.start = time.time()

def output(self):

self.end = time.time()

self.count += 1

speed = self.block/(self.end-self.start) if (self.end-self.start)>0 else 0

self.start = time.time()

loaded = self.count*self.block

progress = round(loaded/self.size, 4)

if loaded >= self.size:

print u'%s下载完成\r\n'%self.file_name

else:

print u'{0}下载进度{1:.2f}{2}/{3:.2f}{4} {5:.2%} 下载速度{6:.2f}{7}/s'.\

format(self.file_name, loaded, self.unit,\

self.size, self.unit, progress, speed, self.unit)

print '%50s'%('/'*int((1-progress)*50))

queue = Queue.Queue()

def run():

while True:

url = queue.get(timeout=100)

if url is None:

print u'全下完啦'

break

h = hashlib.md5()

h.update(url)

name = h.hexdigest()

path = 'e:/download/' + name + '.mp4'

download_file(url, path)

def get_url():

queue.put(None)

if __name__ == '__main__':

get_url()

for i in xrange(4):

t = threading.Thread(target=run)

t.daemon = True

t.start()

python能爬视频吗_Python爬取视频(其实是一篇福利)相关推荐

  1. python爬去音乐_python爬去音乐

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 本文为大家分享了python爬取酷狗音乐排行榜的具体代码,供大家参考,具体内容如 ...

  2. Python使用pypcap扩展包,抓取视频网站的视频URL

    爬取视频网站的视频URL 前言 第一步.安装Python(2.7.13 64位) 第二步.安装Python的扩展包pypcapy==1.1.2 第三步.安装Python的扩展包dpkt(这个没什么特别 ...

  3. python编程教程第九讲_Python入门学习视频,最全面讲解视频无偿分享,这些基础知识你都懂了吗?...

    2020最新Python零基础到精通资料教材,干货分享,新基础Python教材,看这里,这里有你想要的所有资源哦,最强笔记,教你怎么入门提升!让你对自己更加有信心,重点是资料都是免费的,免费!!! 如 ...

  4. python搜索网页特定区域内容_Python爬取练习:指定百度搜索的内容并提取网页的标题内容...

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 以下文章源于白菜学python ,作者小白菜 刚接触Python的新手.小白,可以复制下面的链接去 ...

  5. python爬虫有道词典_Python爬取有道词典,有道的反爬很难吗?也就这样啊!

    前言 大家好 ​ 最近python爬虫有点火啊,啥python爬取马保国视频--我也来凑个热闹,今天我们来试着做个翻译软件--不是不是,说错了,今天我们来试着提交翻译内容并爬取翻译结果 主要内容 PS ...

  6. python微信公众号爬虫_Python爬取指定微信公众号所有文章!

    篇文章使用到的技术: mitmdump + 电脑版微信 先分析打开可视化抓包工具, 勾选https代理.然后打开电脑版微信 任意点击一个公众号,再点击查看历史消息 注:想学习Python的小伙伴们 可 ...

  7. python背景怎么自定义铃声_python爬取手机铃声

    相信每个人都会给自己的手机调一个好听的音乐作为铃声,但是对于iphone用户来说换铃声一般都会去找第三方平台来进行更换,众多平台当中不得不说的就是爱思手机助手,今天我将带你通过python爬虫来批量进 ...

  8. python三国演义人物出场统计_python爬取三国演义文本

    1.目标 python爬取三国演义,生成词云.图表 2.码前须知 项目目标:三国人物名称及出现次数-----数据统计分析 提出问题:哪个人物在三国演义中出现的次数最多?,我们希望通过数据分析来获得答案 ...

  9. python爬去学校_python爬取学校教务系统

    写这个爬虫的缘由 以前用java写过一个爬取学校的教务系统的爬虫 https://blog.csdn.net/ygdxt/article/details/81158321,最近痴迷Python爬虫,了 ...

最新文章

  1. hdu 2028 Lowest Common Multiple Plus
  2. 常用排序算法的C++实现
  3. 在循环中正确找到对应DOM元素的索引
  4. html插入不规则表格,如何构建HTML表格中的不规则形状?
  5. 数学/找规律/sgu 118 Digital root
  6. 微型计算机性能指标中可靠性是指连续,计算机接口原理定义
  7. QML基础类型之vector3d
  8. 设计模式之代理:手动实现动态代理,揭秘原理实现
  9. H264 profile and level
  10. php日文文件名 liunx,linux文件名乱码
  11. 创业一年半项目经验分享
  12. web应用基本框架图
  13. Android P 网络请求相关总结
  14. Photoshop CS6 实例之用快速选择工具扣取美女
  15. 德莱联盟(判断线段是否相交)
  16. parted扩展磁盘分区(实践篇)
  17. selenium 批量下载qq邮箱附件
  18. 2020年拼多多校招面试题及答案-最全最新-持续更新中
  19. android studio编辑环境变量,Android studio gradle环境变量配置教程
  20. python创建学生类姓名学号_Python练习题:由用户输入学生学号与姓名,数据用字典存储,最终输出学生信息(按学号由小到大显示)。...

热门文章

  1. VF02 会计凭证过账时间
  2. VO,PO,POJO的定义和区别
  3. 那些财务眼中的SAP
  4. SAP实施项目中顾问与客户的有效沟通
  5. SD--关于定价过程中的存储顺序的参考结构和参考字段的使用代码跟踪
  6. 数据解密2020年高考,志愿填报可以选这些
  7. 回港二次上市,会是内容社区平台的更优选吗?
  8. cf手游服务器维护19年9月19,神雕侠侣2手游9月19日停服维护公告_神雕侠侣2手游9月19日更新了什么_玩游戏网...
  9. python和tensorflow版本对应_详解Tensorflow不同版本要求与CUDA及CUDNN版本对应关系
  10. 苹果备忘录怎么调字体大小_苹果手机备忘录误删了怎么恢复?分享几个新技能...