查看: 37376|回复: 54546
打印 上一主题 下一主题

Python爬取视频(其实是一篇福利)

[复制链接]
易发游戏斗地主下载
跳转到指定楼层
楼主
发表于 2019-04-19 06:00:55 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

这个奇女子用她独行果断,倔强,强硬,美丽,冷傲的方式在刘皓的心中留下了举足轻重的位置,现在看着她离开虽然很快就回来,但还是让刘皓有点惆怅,不过这种感觉很快就藏在了心中带着紫妍和青鳞落在了化成天妖凰的凤清儿身上振翅高飞向着兽域的一个山脉,骸骨山脉。

天尊娱乐app

陈玄礼说完,便坐下了,这时李亨徐徐道:“我之所以先让陈将军给大家分析一下各方的军队对比,就是因为军队实力会是将来我们利益分配的关键,毫无疑问,李庆安在将来的利益分配上会占优,这一点我不否认,也不想回避。”
可现在看来,距离史莱克学院的大门还有一小段距离。人的步伐大小或许会有变化,但变化却绝对不会差这么多。

“啊,军部这个时候来电报又什么事情?”江防总队此前一直受十六军指挥的,级别上跟对江岸彭泽县城的那个四十七师应该是平级单位,分别驻守马当要塞和彭泽县城,作为沿着长江的两座互为犄角的堡垒抵挡溯江而上的鬼子部队的,但从昨晚起,他可是接受韩非的指挥了,怎么这会儿十六军军部发来电报要干什么?

窗外下着小雨,作为单身程序员的我逛着逛着发现一篇好东西,来自知乎 你都用 Python 来做什么?的第一个高亮答案。

到上面去看了看,地址都是明文的,得,赶紧开始吧。

下载流式文件,requests库中请求的stream设为True就可以啦,文档在此。

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

# -*- 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下载完成
"%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:

# -*- coding: utf-8 -*-
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下载完成
"%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()

加了重复下载的判断,至于怎么源源不断的生产url,诸位摸索吧,保重身体!

  

编辑:董海道

发布时间:2019-04-19 03:38:30

当前文章://unoproduct/rc0k7.html

优德体育平台 澳门新葡京8522.com_新萄京娱乐场官网_【官网直营】 澳门永利_澳门永利官网【欢迎您】 澳门真人博彩官网 - 澳门真人博彩 - 线上娱乐老品牌 世爵娱乐网址 菲特娱乐手机版 元宝娱乐手机版 万贯娱乐在线下载 

点击获取礼包
久发国际
沙发
发表于 2019-04-19 01:59:10 | 只看该作者
秦王哈哈大笑,“还是三皇弟会说话,比不上四皇弟,最近弄了什么新玩意没有,可不能光顾着自己。”
回复 支持 反对

使用道具 举报

乐虎国际vip
板凳
发表于 2019-04-19 05:49:45 | 只看该作者
当天太子周佑大病,水米不进,便联合御马监大太监黄太监拥立清河王周灵运为帝。立刻得到了新晋权贵、掌控军权的玄侯纪太虚跟定北侯纪丹青的拥护。于第二日便登基,接受百官朝贺。追谥大行皇帝周极为武宗、至道昭肃孝皇帝!/unolw9k8/index.html
回复 支持 反对

使用道具 举报

申慱国际娱乐官方网站
地板
发表于 2019-04-19 02:44:18 | 只看该作者
“马叮当,果然和我想的一样,去验证我说的话的真伪吗?可惜了,我可没对你说谎,你的举动也是白费了。”马叮当离开酒吧被已经离开的刘皓尽收眼底,他的神念已经能覆盖超过上百公里之地,马叮当的一切都是被他看得清清楚。
回复 支持 反对

使用道具 举报

youle88 cc
5#
发表于 2019-04-19 03:36:06 | 只看该作者
“辰时的时候所带来的士卒全都在王宫门前集合完毕了。”支太皇说道:“我已经让他们分成数队巡视全城,拱卫王宫了。”
回复 支持 反对

使用道具 举报

mg娱乐场
6#
发表于 2019-04-19 05:26:47 | 只看该作者
「我不只见到韩墨,还看见到极东客,你相信吗?东西两大武神我竟然一次都见到了,而且还目睹了他们两位惊天动地的精采交手!」说到这里押投贵难抑兴奋,声调提高有八度之多。
回复 支持 反对

使用道具 举报

爱博国际娱乐
7#
发表于 2019-04-19 00:35:14 | 只看该作者
“上了两个而已,”他说,“你别打她们主意,尤其是陈小凤和舒云倩,她们都是我表妹。”陈小凤太像他妹妹,他不忍心任何人染指她,舒云倩还是个刚进社会的女孩。
回复 支持 反对

使用道具 举报

千赢国际手机登陆
8#
发表于 2019-04-19 04:51:50 | 只看该作者
因此不管是以决斗者的身份和能力还是以圣人的力量和智慧随便用一个刘皓都能解决这一切,所以他有什么好担心的。
回复 支持 反对

使用道具 举报

yoyfa娱乐
9#
发表于 2019-04-19 02:08:23 | 只看该作者
“婉儿,你也不用害怕,”那女子淡淡地道,“你的道法本就是他教给你的,比不上他也很正常。世上原本不该有你和你妹妹这两只狐妖,却因为那人的一时心软,使得你和你妹妹得以脱胎换骨,你更是修成人形。那人自身是在天命之外,连带着,也使你成了不受命运控制的存在,而如果没有你和你的演卦之术,我的计划就根本无法实施,说起来,他也算是帮助了我。”
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

下载齐乐手机app是互联网最大的搜索引擎优化研究中心,是致力于培养学员用户体验意识和提供专业技术解答的专业培训机构, 成立于2007年,2008年第一家入驻歪歪的培训机构,2014年成为腾讯课堂战略合作机构。
© 2007-2016 下载齐乐手机app 湘ICP备13004652号-1 Powered by Discuz!X  Template by 下载齐乐手机app 
快速回复 返回顶部 返回列表