更快的爬虫实现
目标
掌握多线程爬虫
掌握多进程爬虫
1. 爬取糗事百科段子
页面的URL是:http://www.qiushibaike.com/8hr/page/1
思路分析:
确定url地址
url地址的规律非常明显,一共只有13页url地址确定数据的位置
数据都在id='content-left'的div下的div中,在这个区域,url地址对应的响应和elements相同
2. 上述代码改写成多线程方式实现
2.1 回顾多线程的方法使用
在python3中,主线程主进程结束,子线程,子进程不会结束
为了能够让主线程回收子线程,可以把子线程设置为守护线程,即该线程不重要,主线程结束,子线程结束
t1=threading.Thread(targe=func,args=(,))t1.setDaemon(True)t1.start()#此时线程才会启动
2.2 回顾队列模块的使用
fromqueueimportQueueq=Queue(maxsize=100)item={}q.put_nowait(item)#不等待直接放,队列满的时候会报错q.put(item)#放入数据,队列满的时候回等待q.get_nowait()#不等待直接取,队列空的时候会报错q.get()#取出数据,队列为空的时候会等待q.qsize()#获取队列中现存数据的个数 q.join()#队列中维持了一个计数,计数不为0时候让主线程阻塞等待,队列计数为0的时候才会继续往后执行q.task_done()# put的时候计数+1,get不会-1,get需要和task_done 一起使用才会-1
2.3 多线程实现思路剖析
把爬虫中的每个步骤封装成函数,分别用线程去执行
不同的函数通过队列相互通信,函数间解耦
3. 将上述代码改写成多进程方式实现
3.1 回顾多进程程的方法使用
frommultiprocessingimportProcesst1=Process(targe=func,args=(,))t1.daemon=True#设置为守护进程t1.start()#此时线程才会启动
3.2 多进程中队列的使用
多进程中使用普通的队列模块会发生阻塞,对应的需要使用multiprocessing提供的JoinableQueue模块,其使用过程和在线程中使用的queue方法相同
小结
本小结重点
能够通过多线程多进程实现爬虫
掌握queue中put和get以及task_done和join方法的使用