爬取网页的ts录制流

By admin in 4858.com on 2019年5月5日
import requests
import os
from multiprocessing.dummy import Pool

# 在罕见的情况下,你可能想获取来自服务器的原始套接字响应,那么你可以访问 r.raw。 如果你确实想这么干,那请你确保在初始请求中设置了 stream=True。具体你可以这么做:
#
# >>> r = requests.get('https://github.com/timeline.json', stream=True)
# >>> r.raw
# <requests.packages.urllib3.response.HTTPResponse object at 0x101194810>
# >>> r.raw.read(10)
# '\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03'
# 但一般情况下,你应该以下面的模式将文本流保存到文件:
#
# with open(filename, 'wb') as fd:
#     for chunk in r.iter_content(chunk_size):
#         fd.write(chunk)
# 使用 Response.iter_content 将会处理大量你直接使用 Response.raw 不得不处理的。 当流下载时,上面是优先推荐的获取内容方式。 Note that chunk_size can be freely adjusted to a number that may better fit your use cases.

#chunk_size可以设置你指定的大小,指定每次获取数据的最大值,注意:并不是每次请求回来的content块都是chunk_size指定的大小。

def download(j):
    global picpath
    url='http://xxx5%s'% str(j).zfill(3)+'.ts'
    for l in range(20):    #下载失败情况最多20次
        try:
            retu = requests.get(url, stream=True)
            print(str(j).zfill(3)+' 下载完成')
            break
        except:
            print(u'%s文件,正在重试第%d次' % (str(j).zfill(3),l + 1))
    picpath = r'C:\Users\bin\PycharmProjects\untitled\%s' % str(j).zfill(3) + '.ts'
    file = open(picpath, 'wb')
    for chunk in retu.iter_content(chunk_size=1024 * 8):
        if chunk:
            file.write(chunk)
            file.flush()
    file.close()

if __name__ == "__main__":
    list = [i for i in range(0,2250)]  #2250是我爬的视频的长度
    pool = Pool(4)
    pool.map(download, list)
    pool.close()
    pool.join()

  lst = []
  for i in range(0,2250):      
     test = r'C:\Users\bin\PycharmProjects\untitled\abc\%s.ts' % str(i).zfill(3)

      if not os.path.exists(test):
          print(str(i).zfill(3)+'.ts')
          lst.append(i)
  print(lst)

  if  len(lst):
     pool = Pool(4)
  
     pool.map(download, lst)

      pool.close()
      pool.join()

  else:

      print

      u'全部下载完成,正在合并'
      os.system(r'copy/b  C:\Users\bin\PycharmProjects\untitled\*.ts  C:\Users\bin\PycharmProjects\untitled\new.ts')
      print
      u'合并完成'

# Python中线程multiprocessing模块与进程使用的同一模块。使用方法也基本相同,唯一不同的是,from multiprocessing import Pool这样导入的Pool表示的是进程池;
# from multiprocessing.dummy import Pool这样导入的Pool表示的是线程池。这样就可以实现线程里面的并发了。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2019 美高梅手机版4858 版权所有