背景:崔庆才的爬虫学习笔记
整体架构:
获取模块【各大网址爬取代理】----->存储模块【redis有序集合存储】<==========>检测模块
||
V
接口模块【web接口】
============================================================================================
创建代理池项目
项目结构如下:
第一:存储模块
1、存储模块,选中redis数据库中的有序集合。
------------------------------------------------------------------------------------------------------------------------
说明:1、redis有序集合:
- a、有序集合,有键值对构成的数据集合,键又叫成员member,值又叫分值score。
- b、分值必须是浮点数/整数型,并且按照分值的由低到高排序。
- c、键【member】必须唯一,分值可重复
例子:键【member】:220.12.23.62 :6666 值【score】:98
-------------------------------------------------------------------------------------------------------------------------
2、代理作为键【member】,每个代理设置对应的值【score】
a、初始值init_score设置为10
b、最大值设置为100
c、检测不通过减一分,通过设置满分,得分为0自动删除
3、定义一个类RedisClient()实现如下功能
a、一旦实例化该类,自动初始化【连接数据库】,并作为该实例的一个属性
b、类实现以下方法:
4、相关代码
import redis
from proxy_pool_new.settings import REDIS_HOST,REDIS_PORT,REDIS_PASSWORD,REDIS_KEY
from proxy_pool_new.settings import MAX_SCRORE,MIN_SCORE,INITIAL_SCORE
from proxy_pool_new.error import PoolEmptyerror
from random import choice
import re
from .logger_proxy import mylogger
logger=mylogger.get_logger(name='db')
class RedisClient(object):
def __init__(self, host=REDIS_HOST, port=REDIS_PORT, password=REDIS_PASSWORD):
"""
初始化
:param host: redis 地址
:param part: redis 端口
:param password: redis 密码
decode_responses=True,写入的键值对中的value为str类型,不加这个参数写入的则为字节类型。
例子:不加,结果前多一个b, b'hello world'
"""
self.db = redis.StrictRedis(host= host, port=port, password=password, decode_responses=True)
def add(self,proxy,score=INITIAL_SCORE):#score 已经又默认值,如果不特别指定
"""
添加代理,至代理池,并设置初始分值
:param proxy: 获取的单个代理
:param intial_socore: 初始评分值
:return:
"""
if not re.match('\d+\.\d*\.\d*\.\d+\:\d*',proxy):
logger.info('不符合规范 %s' % proxy)
return
if not self.db.zscore(REDIS_KEY,proxy):
logger.info('代理添加到数据库')
#