鱼C论坛

 找回密码
 立即注册
查看: 1031|回复: 5

[已解决]文件分段下载问题求助

[复制链接]
发表于 2019-8-18 11:37:48 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 Tom.Error 于 2019-8-18 18:17 编辑

下面代码为完整代码,下载图片下下来正常,可下载MP3时,下载下来就没法打开,大佬可以看看哪里出问题大佬么 谢谢

  1. import requests
  2. import os
  3. import threading

  4. class Mythread(threading.Thread):
  5.     def __init__(self,url,startpos,endpos,f):
  6.         super(Mythread,self).__init__()
  7.         self.url = url
  8.         self.startpos = startpos
  9.         self.endpos = endpos
  10.         self.fd = f

  11.     def download(self):
  12.         print('start thread:%s at %s'%(self.getName(), self.startpos))
  13.         headers = {'Range':'bytes=%s-%s'%(self.startpos,self.endpos)}
  14.         res = requests.get(self.url,headers=headers)
  15.         self.fd.seek(self.startpos)
  16.         self.fd.write(res.content)
  17.         print('Stop shread:%s at %s'%(self.getName(), self.startpos))
  18.         self.fd.close()

  19.     def run(self):
  20.         self.download()

  21. def Download(url, name, type_, path='file'):
  22.     content_size = int(requests.get(url).headers['content-length'])  #大小
  23.     threadnum = 3
  24.     threading.BoundedSemaphore(threadnum)  # 允许线程个数
  25.     step = content_size // threadnum
  26.     file_list = []
  27.     start = 0
  28.     end = -1
  29.     path = './' + str(path) + '/'
  30.     isExists_book = os.path.exists(path)
  31.     if not isExists_book:
  32.         os.makedirs(path)
  33.         print('创建%s成功' % path)
  34.     file_path = path + name + '.' + type_
  35.     with open(file_path, 'wb+') as f:
  36.         fileno = f.fileno() #返回一个整型的文件描述符,可用于底层操作系统的 I/O 操作
  37.         while end < content_size-1:
  38.             start = end + 1
  39.             end = start + step -1
  40.             if end > content_size:
  41.                 end = content_size
  42.             print('start: %s,end: %s'%(start,end))
  43.             dup = os.dup(fileno) #复制文件句柄
  44.             fd = os.fdopen(dup, 'rb+', -1)
  45.             t = Mythread(url,start,end,fd)
  46.             t.start()
  47.             file_list.append(t)
  48.         for i in file_list:
  49.             i.join()

  50. if __name__ == '__main__':
  51.     url = 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1566106547294&di=cc2aedbaa01adf93e26afd14968f838e&imgtype=0&src=http%3A%2F%2Ff.hiphotos.baidu.com%2Fimage%2Fpic%2Fitem%2Fb151f8198618367aa7f3cc7424738bd4b31ce525.jpg'
  52.     #url = 'http://music.163.com/song/media/outer/url?id=189602.mp3'
  53.     name = '111'
  54.     type_ = 'jpg'
  55.     path = 'img'
  56.     Download(url,name,type_,path)
复制代码

最佳答案
2019-8-19 22:39:09
至少你代码中的MP3地址被服务器判断为爬虫给ban了, 给header加上user-agent
threading.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-8-18 21:22:35 | 显示全部楼层
你试一下直接下载
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-19 21:18:06 | 显示全部楼层

我直接下载或者不分段下载,下载下来后都是正常的 都可以播放的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-19 21:57:53 | 显示全部楼层
Tom.Error 发表于 2019-8-19 21:18
我直接下载或者不分段下载,下载下来后都是正常的 都可以播放的

好吧,不懂了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-19 22:39:09 | 显示全部楼层    本楼为最佳答案   
至少你代码中的MP3地址被服务器判断为爬虫给ban了, 给header加上user-agent
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-19 23:10:15 | 显示全部楼层
yjsx86 发表于 2019-8-19 22:39
至少你代码中的MP3地址被服务器判断为爬虫给ban了, 给header加上user-agent

咦~~ 这个忘加了 加了后就好了
但还是不明白为什么不分就没问题 一分就有问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-27 12:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表