欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

Python爬取視頻(其實是一篇福利)過程解析

系統(tǒng) 1723 0

窗外下著小雨,作為單身程序員的我逛著逛著發(fā)現(xiàn)一篇好東西,來自知乎 你都用 Python 來做什么?的第一個高亮答案。

到上面去看了看,地址都是明文的,得,趕緊開始吧。

下載流式文件,requests庫中請求的stream設(shè)為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)
          

遭遇當(dāng)頭一棒:

            
AttributeError: __exit__
          

這文檔也會騙人的么!

看樣子是沒有實現(xiàn)上下文需要的__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)
          

程序正常運行了,不過我盯著這文件,怎么大小不見變啊,到底是完成了多少了呢?還是要讓下好的內(nèi)容及時存進硬盤,還能省點內(nèi)存是不是:

            
# -*- 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())
          

文件以肉眼可見的速度在增大,真心疼我的硬盤,還是最后一次寫入硬盤吧,程序中記個數(shù)就好了:

            
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
          

結(jié)果就很直觀了:

            
已下載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
/////////////////////////////////////////////////
          

看上去舒服多了。

下面要做的就是多線程同時下載了,主線程生產(chǎn)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下載完成\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()
          

加了重復(fù)下載的判斷,至于怎么源源不斷的生產(chǎn)url,諸位摸索吧,保重身體!

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 亚洲综合亚洲国产尤物 | 精品免费国产一区二区三区四区 | 亚洲电影免费观看高清完整版在线观 | 91小视频在线观看免费版高清 | 一个看片免费视频www | 亚洲国产精品一区二区久久 | 国产精品片aa在线观看 | 久草在线高清全免费 | 日韩欧美一级大片 | 精品72久久久久久久中文字幕 | 波多野结衣免费视频观看 | 成人午夜性视频欧美成人 | 久草手机视频在线 | 国产一二三区精品 | 欧美一区二区在线播放 | 免费看污又色又爽又黄视频 | 99亚洲 | 日本夜爽爽一区二区三区 | 多女多p多杂交视频在线观看 | 五月天香蕉 | 欧美激情在线观看一区二区三区 | 亚洲精品国产精品乱码不97 | 香蕉福利久久福利久久香蕉 | av中文字幕在线 | 五月婷婷丁香 | 日韩在线播放网址 | 一级毛片真人免费观看 | 色综合天天综合中文网 | 午夜小视频免费 | 久久草电影 | 久久久久久久99精品免费观看 | 夜夜夜爽| 国产一起色一起爱 | 欧美精品一区二区免费 | 奇米影视888狠狠狠777不卡 | 免费观看www | 日韩成人免费在线视频 | 国产精品久久久爽爽爽麻豆色哟哟 | 亚洲在线一区二区三区 | 国产福利区一区二在线观看 | 国产欧美综合精品一区二区 |