‘’’
- 创建 URL队列, 响应队列, 数据队列 在init方法中
- 在生成URL列表中方法中,把URL添加URL队列中
- 在请求页面的方法中,从URL队列中取出URL执行,把获取到的响应数据添加响应队列中
- 在处理数据的方法中,从响应队列中取出页面内容进行解析, 把解析结果存储数据队列中
- 在保存数据的方法中, 从数据队列中取出数据,进行保存
- 开启几个线程来执行上面的方法
‘’’
def run_forever(func):
def wrapper(obj):
while True:
func(obj)
return wrapper
class JiubaiSpider(object):
def init(self):
self.headers = {
‘User-Agent’: ‘Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36’
}
self.url_pattern = ‘https://www.baike.com/8hr/page/{}/’
# url 队列
self.url_queue = Queue()
# 响应队列
self.page_queue = Queue()
# 数据队列
self.data_queue = Queue()
def add_url_to_queue(self):
pass
@run_forever
def add_page_to_queue(self):
pass
@run_forever
def add_dz_to_queue(self):
pass
def get_first_element(self, list):
pass
@run_forever
def save_dz_list(self):
pass
def run_use_more_task(self, func, count=1):
'''把func放到线程中执行, count:开启多少线程执行'''
for i in range(0, count):
t = threading.Thread(target=func)
t.setDaemon(True)
t.start()
def run(self):
# 开启线程执行上面的几个方法
url_t = threading.Thread(target=self.add_url_to_queue)
# url_t.setDaemon(True)
url_t.start()
self.run_use_more_task(self.add_page_to_queue, 3)
self.run_use_more_task(self.add_dz_to_queue, 2)
self.run_use_more_task(self.save_dz_list, 2)
# 使用队列join方法,等待队列任务都完成了才结束
self.url_queue.join()
self.page_queue.join()
self.data_queue.join()
if name == ‘main’:
qbs = JiubaiSpider()
qbs.run()