更快的爬虫实现

目标

掌握多线程爬虫

掌握多进程爬虫

  1. 爬取糗事百科段子

页面的URL是:http://www.qiushibaike.com/8hr/page/1

思路分析:

确定url地址

url地址的规律非常明显,一共只有13页url地址确定数据的位置

数据都在id=’content-left’的div下的div中,在这个区域,url地址对应的响应和elements相同

  1. 上述代码改写成多线程方式实现

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 多线程实现思路剖析

把爬虫中的每个步骤封装成函数,分别用线程去执行

不同的函数通过队列相互通信,函数间解耦 

  1. 将上述代码改写成多进程方式实现

3.1 回顾多进程程的方法使用

frommultiprocessingimportProcesst1=Process(targe=func,args=(,))t1.daemon=True#设置为守护进程t1.start()#此时线程才会启动

3.2 多进程中队列的使用

多进程中使用普通的队列模块会发生阻塞,对应的需要使用multiprocessing提供的JoinableQueue模块,其使用过程和在线程中使用的queue方法相同

小结

本小结重点

能够通过多线程多进程实现爬虫

掌握queue中put和get以及task_done和join方法的使用

文章来源于互联网:多进程和多线程爬虫

发表评论