在写爬虫的过程中常常遇到下载大文件的情况,比如说视频之类的。如果只是传统的直接下载保存,速度就比较慢,所有就想写个多线程同步下载大文件的模块。
使用到的库
模块中使用到的库都比较简单:requests(写爬虫的都知道吧),threading(多线程,必须的),os(文件操作需要用到)。
主要的难点
一个是多线程下载的同步问题,另一个是文件中断下载后,再次开始从上次中断的地方继续下载。
其实我觉得就这两个问题,迅雷之类的下载器早就已经给我们做了个解决方法事例,那就是在下载文件的路径添加一个管理下载进度的文件。
具体实现
模块中有两个类,一个负责处理管理文件的更新和创建等,还有一个是线程任务,发下载请求,写入文件等。
管理文件类
文件内的格式使用的是很简单的用“=”分割的配置文件的形式,包括四个配置信息,分别是:【已写入的字节】range,【未写入的字节】range,【写入中的字节】range和文件下载的url。之前所说的比较难处理的问题都是用这个管理文件解决的。
配置文件
writing_range=(42991616,46137344)]
unwritten_range=(46137344,10633872234)]
written_range=(0,42991616)]
url_in_file=https:xxxxxxxxxxxxxxxxxxxxxxxxxxxxx
主要思路是,刚开始下载时创建这个文件,获取带下载文件的大小,并填入【未下载字节】中去。然后其他线程同步的不断从这个【未下载字节】的中提取一小部分写到【下载中字节】,发请求下载,并写入到文件中去,之后再把已经下载好的字节写入到【已下载字节】中去。因为考虑到下载的字节可能时一段一段分隔开的,所有写成图中所示的形式。
其实对range的分割,合并(也就是这个类的主要功能)还是需要一些小技巧的,如果想要自己先练练的话可以前往https://leetcode.com/problems/insert-interval/
之前也是写的时候感觉很熟悉,发现在leetcode上做过类似的题目。
多线程下载类
这个类就没有什么比较复杂的处理了,主要就是读取待下载字节的同步,获得文件大小,下载文件Range。(在http(s)中,文件下载是分了很多次请求的,每次请求的headers中带上Range可以指明需要下载文件的哪一部分,格式为:Range:bytes=1024-2048)获取文件大小可以先发一个Range:bytes=0-0这样的请求过去,响应中的header会带有content-Range的头部(如果他需要的话,一般都会有),这个值就是文件的总大小。
多线程同步,就用普通的锁就好了(threading.Lock类),文件内容的写入和配置的读取都需要。写入到文件的指定位置用的是file的seek函数,不清楚的可以百度一下,就跟c里面的移动文件位置指针一样。
对了,外面还有一个创建这些下载线程的守护线程。
总结
这样子,大文件的多线程下载和中断续传功能就得以实现了。
python和Java哪个更值得学
Java作为发展已经很成熟的编程语言,可以说是无处不在,学好Java就业机会非常多。而python随着人工智能时代的到来而火爆,容易入门,未来发展空间巨大。可以说,python和Java都是非常值得学的。
python和Java的优劣势对比
从语言本身来说,dupython语法简单,更易上手,具有非常强大的第三方库,使得开发效率更高,但python相对Java来说,它的运行速度更慢。
从就业方向来说,随着人工智能和大数据的发展,让python颇受关注,python岗位的需求量也在日益增加,但是普及度还是没有Java广,尤其是在三四线城市,Java的岗位相对会更多一些。也因为Java技术相对成熟,其岗位竞争压力也更大。
从发展前景来说,python作为人工智能和数据分析的热门应用,尤其是在人工智能方兴未艾的今天,python的应用和发展前景还是很被看好的。
python和Java学哪个好
Python:简单易学、数据分析能力强
Python是一种面向对象的解释型计算机程序设计语言,具有丰富强大的库,常被称为胶水语言,能够把其他语言制作的各种模块轻松链接在一起。因此Python具有:简单易学、数据分析能力强的特点。
Python开发于1991年,一项民意调查表明,在开发AI时,超过57%的开发者将 Python 作为首选编程语言,而不是C++。因为易于学习,Python让程序员和数据科学家可以更轻松地进入开发AI的世界。
Java:进可攻前端,退可守后端
Java被公认为世界上最好的编程语言之一,它在过去20年间的使用情况就是最好的证明。
作为使用最广泛的编程语言,Java的地位一直是不可撼动的。世界上累计有150亿台设备运行Java,全球Java开发者的数量超过1000万人,Java程序员更是进可攻前端,退可守后端。
如果选择Java作为你的人生的第一门编程语言的话,只要花时间便可以轻松学会JavaScript、R、C#、Objective-C、Sw、Go等语言;如果把Python作为第一门编程语言,想要学习其他语言,相对Java来说会复杂一些。