利用Python的爬虫抓取网站公开信息,能够便利的处理很多事情。这里用一个图书网站为例,通过差串行爬取方式,并导入到excel表中,爬去的顺利,但是最终的耗时却非常长,仅仅200多页的都要花费将近10分钟的时间,这显然是远远达不到想要的效果的,所以这就需要提高爬行效率了,这里就简单分析利用python的多线程机制来完成。
仔细想想就可以发现,其实爬10页(每页25本),这10页爬的先后关系是无所谓的,因为写入的时候没有依赖关系,各写各的,所以用串行方式爬取是吃亏的.显然可以用并发来加快速度,而且由于没有同步互斥关系,所以连锁都不用上.
既然考虑并发,那么就有多进程和多线程两种方式,各自的优缺点比较可以见:这里简单来说,多进程稳定,因为一个进程挂掉其他进程不受影响,但是开销大,建立太多进程会消耗系统大量资源,并且切换慢,因为要通过系统进程调度.
多线程作为"轻量级的进程",是操作系统调度的基本单位,切换快速,只消耗极少的资源,但是缺点就是一个线程崩掉整个进程包括其他线程都会崩掉,所以稳定性欠佳.
这里虽然进程数/线程数很少(只有10个),即使采用多进程也不会有多大的开销,但是为了更快地爬取,且爬取豆瓣这样的大站,稳定性不会太差,所以还是采用多线程比较实惠.
多线程有两个模块,一个Thread模块,一个threading模块,但是前者现在用的很少了,后者更加方便实用.所以采用后者.
在程序中实用线程有两种方法,一种是自己写一个class,并重写此class中的__init__方法和run()方法,创建一个这个class的对象并调用start()时run()方法自动调用.另一种是在threading.Thread构造函数中传入要用线程运行的函数及其参数.我采用的是后者.