# 3.6. 多进程多线程爬虫
# 目标
- 掌握多线程爬虫
- 掌握多进程爬虫
# 1. 爬取糗事百科段子
页面的URL是:http://www.qiushibaike.com/8hr/page/1 (opens new window)
思路分析:
确定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() #此时线程才会启动
1
2
3
2
3
# 2.2 回顾队列模块的使用
from queue import Queue
q = 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
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# 2.3 多线程实现思路剖析
- 把爬虫中的每个步骤封装成函数,分别用线程去执行
- 不同的函数通过队列相互通信,函数间解耦
# 3. 将上述代码改写成多进程方式实现
# 3.1 回顾多进程程的方法使用
from multiprocessing import Process
t1 = Process(targe=func,args=(,))
t1.daemon = True #设置为守护进程
t1.start() #此时线程才会启动
1
2
3
4
2
3
4
# 3.2 多进程中队列的使用
多进程中使用普通的队列模块会发生阻塞,对应的需要使用multiprocessing
提供的JoinableQueue
模块,其使用过程和在线程中使用的queue方法相同
# 小结
- 本小结重点
- 能够通过多线程多进程实现爬虫
- 掌握queue中put和get以及task_done和join方法的使用