python能爬视频吗_Python爬取视频(其实是一篇福利)
先找一个视频地址试验一下:
# -*- 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爬取视频(其实是一篇福利)相关推荐
- python爬去音乐_python爬去音乐
广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 本文为大家分享了python爬取酷狗音乐排行榜的具体代码,供大家参考,具体内容如 ...
- Python使用pypcap扩展包,抓取视频网站的视频URL
爬取视频网站的视频URL 前言 第一步.安装Python(2.7.13 64位) 第二步.安装Python的扩展包pypcapy==1.1.2 第三步.安装Python的扩展包dpkt(这个没什么特别 ...
- python编程教程第九讲_Python入门学习视频,最全面讲解视频无偿分享,这些基础知识你都懂了吗?...
2020最新Python零基础到精通资料教材,干货分享,新基础Python教材,看这里,这里有你想要的所有资源哦,最强笔记,教你怎么入门提升!让你对自己更加有信心,重点是资料都是免费的,免费!!! 如 ...
- python搜索网页特定区域内容_Python爬取练习:指定百度搜索的内容并提取网页的标题内容...
本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 以下文章源于白菜学python ,作者小白菜 刚接触Python的新手.小白,可以复制下面的链接去 ...
- python爬虫有道词典_Python爬取有道词典,有道的反爬很难吗?也就这样啊!
前言 大家好 最近python爬虫有点火啊,啥python爬取马保国视频--我也来凑个热闹,今天我们来试着做个翻译软件--不是不是,说错了,今天我们来试着提交翻译内容并爬取翻译结果 主要内容 PS ...
- python微信公众号爬虫_Python爬取指定微信公众号所有文章!
篇文章使用到的技术: mitmdump + 电脑版微信 先分析打开可视化抓包工具, 勾选https代理.然后打开电脑版微信 任意点击一个公众号,再点击查看历史消息 注:想学习Python的小伙伴们 可 ...
- python背景怎么自定义铃声_python爬取手机铃声
相信每个人都会给自己的手机调一个好听的音乐作为铃声,但是对于iphone用户来说换铃声一般都会去找第三方平台来进行更换,众多平台当中不得不说的就是爱思手机助手,今天我将带你通过python爬虫来批量进 ...
- python三国演义人物出场统计_python爬取三国演义文本
1.目标 python爬取三国演义,生成词云.图表 2.码前须知 项目目标:三国人物名称及出现次数-----数据统计分析 提出问题:哪个人物在三国演义中出现的次数最多?,我们希望通过数据分析来获得答案 ...
- python爬去学校_python爬取学校教务系统
写这个爬虫的缘由 以前用java写过一个爬取学校的教务系统的爬虫 https://blog.csdn.net/ygdxt/article/details/81158321,最近痴迷Python爬虫,了 ...
最新文章
- hdu 2028 Lowest Common Multiple Plus
- 常用排序算法的C++实现
- 在循环中正确找到对应DOM元素的索引
- html插入不规则表格,如何构建HTML表格中的不规则形状?
- 数学/找规律/sgu 118 Digital root
- 微型计算机性能指标中可靠性是指连续,计算机接口原理定义
- QML基础类型之vector3d
- 设计模式之代理:手动实现动态代理,揭秘原理实现
- H264 profile and level
- php日文文件名 liunx,linux文件名乱码
- 创业一年半项目经验分享
- web应用基本框架图
- Android P 网络请求相关总结
- Photoshop CS6 实例之用快速选择工具扣取美女
- 德莱联盟(判断线段是否相交)
- parted扩展磁盘分区(实践篇)
- selenium 批量下载qq邮箱附件
- 2020年拼多多校招面试题及答案-最全最新-持续更新中
- android studio编辑环境变量,Android studio gradle环境变量配置教程
- python创建学生类姓名学号_Python练习题:由用户输入学生学号与姓名,数据用字典存储,最终输出学生信息(按学号由小到大显示)。...
热门文章
- VF02 会计凭证过账时间
- VO,PO,POJO的定义和区别
- 那些财务眼中的SAP
- SAP实施项目中顾问与客户的有效沟通
- SD--关于定价过程中的存储顺序的参考结构和参考字段的使用代码跟踪
- 数据解密2020年高考,志愿填报可以选这些
- 回港二次上市,会是内容社区平台的更优选吗?
- cf手游服务器维护19年9月19,神雕侠侣2手游9月19日停服维护公告_神雕侠侣2手游9月19日更新了什么_玩游戏网...
- python和tensorflow版本对应_详解Tensorflow不同版本要求与CUDA及CUDNN版本对应关系
- 苹果备忘录怎么调字体大小_苹果手机备忘录误删了怎么恢复?分享几个新技能...