为了应对大规模爬虫,可食用分布式爬虫技术,分布式爬虫技术中有一项技术必须解决:多态主机共同爬取大量url地址,如何剔除或者识别已爬取的url,为了解决这项技术问题,可以借助redis中列表数据类型,实现url的存储,然后通过一台主机负责爬取url,其他主机负责请求redis数据库中保存的url,具体代码如下:
'''负责产生url地址''' import redis import random import time r = redis.Redis(host='127.0.0.1', port=6379, db=0, password=123456) # 生成很多URL地址,放到redis列表中 for i in range(1, 51): url = 'http://app.mi.com/#page=' + str(i) # 放入到redis列表 r.lpush('xiaomi:urls', url) # 随机休眠3~5秒 time.sleep(random.randint(3, 5)) =================================================== '''从xiaomi:urls中获取地址,进行数据抓取''' import redis r = redis.Redis(host='127.0.0.1', port=6379, db=0, password=123456) while True: # 从列表中获取地址,结果为元组,或者None url = r.brpop('xiaomi:urls', 6) print(url) if url: print(url[1].decode()) print('正在抓取.....') else: print('抓取结束') break