使用多进程爬取网页url放入redis列表中
用到的知识点:
1.生产者消费者模型
2.分布式爬虫
3.python自定义进程类(父进程管理子进程干活)
4.redis
import redis
from multiprocessing import Process
import time
import random
#自定义进程类
class XiaomiSpider(Process):
#用初始化函数创建redis对象
def __init__(self):
self.r = redis.Redis(host='数据库服务器IP',
port=6379, #6379为redis默认端口
db='redis数据库号',
password='xxx'
)
#创建生产者子进程事件函数
def product(self):
#使用 format() 拼出网页格式化字符串
url = 'http://app.mi.com/category/2#page={}'
for i in range(67):
page_link = url.format(i)
#将url lpush 入redis列表中
self.r.lpush('xiaomispider:urls',page_link)
time.sleep(random.randint(1,3))
#创建消费者子进程事件函数
def consumer(self):
while True:
#将存入列表中的url brpop 出来,阻塞等待列表中有数据时间设置为 4 seconds,没有时返回None
result = self.r.brpop('xiaomispider:urls',4)
if result:
print('正在抓取:',result[1].decode())
else:
print('抓取结束')
break
#入口函数(重写父类提供的run()接口,专门用于让子进程干活)
def run(self):
#创建子进程对象
p1 = Process(target=self.product)
p2 = Process(target=self.consumer)
#正式生成子进程并让他们干活
p1.start()
p2.start()
#阻塞等待回收子进程
p1.join()
p2.join()
if __name__ == '__main__':
spider = XiaomiSpider()
spider.run()