记一次企业级爬虫系统升级改造(六):基于R

      2020-09-17 03:56      HTML5

前言:

  首先表示抱歉,春节后一直较忙,未及时更新该系列文章。

  近期,由于监控的站源越来越多,就偶有站源做了反爬机制,造成我们的SupportYun系统小爬虫服务时常被封IP,不能进行数据采集。

  这时候,前面有园友提到的IP代理就该上场表演了。

IP代理池设计:

  博主查阅与调研了多方资料,最终决定先通过爬取网络上各大IP代理网站免费代理的方式,来建立自己的IP代理池。

  最终爬取了五家较为优质的IP代理站点:

    1.西刺代理

    2.快代理

    3.逼格代理

    4.proxy360

    5.66免费代理

  IP代理池方案设计如下:

  简单点说就是把在采集的站源里面已知具有反爬机制的站源打上标签,修改所有的爬虫服务,遇到有此标签的站源先从IP代理池随机获取可用的代理IP再进行数据爬取。

  

安装Redis:

  首先,我们需要一台服务器来部署我们的Redis服务(先不考虑集群什么的)。

  博主一向不喜欢弹个小黑框,不停敲命令行进行操作的各种方式。个人认为,GUI是推动计算机快速发展的重要因素之一(非喜勿喷)。

  翻阅了资料,找到了简易的redis安装客户端(windows版本,安装简单到爆),地址如下:

  

  在博客园找到一篇介绍redis配置文件的博文,贴出来供大家参考:

  话说博主就简单的修改了一下内存限制,设置了允许外网连接,设置了一个密码,也没多改其他东西。

  注意,配置文件在安装完成后的目录下,名称是:Redis.window-server.conf

  熟悉一点都知道,redis的c#驱动ServiceStack.Redis,NuGet就可以直接安装。比较坑的是4.0版本后商业化了,限制每小时6000次,要么下载3.9版本,要么考虑其他的驱动,例如:StackExchange。

  博主使用的是ServiceStack V3.9版本,附上下载地址:

  下面附上博主基于ServiceStack写的RedisManageService,由于业务简单,只使用到了几个API,大家凑合着看。

基于ServiceStack的redis操作管理服务 3/// 当前用到set存储 RedisManageService 6 {redisAddress = ConfigurationManager.AppSettings[];redisPassword = ; 获取某set集合 随机一条数据 GetRandomItemFromSet(RedisSetNameEnum setName)17 {18using (RedisClient client = new RedisClient(redisAddress, 6379, redisPassword))19 {20var result = client.GetRandomItemFromSet(setName.ToString());21if (result == null)22 {Exception(+setName.ToString()+);24 }25return result;26 }27 } 从某set集合 删除指定数据RemoveItemFromSet(RedisSetNameEnum setName, string value)36 {37using (RedisClient client = new RedisClient(redisAddress, 6379, redisPassword))38 {39 client.RemoveItemFromSet(setName.ToString(), value);40 }41 } 添加一条数据到某set集合AddItemToSet(RedisSetNameEnum setName, string value)49 {50using (RedisClient client = new RedisClient(redisAddress, 6379, redisPassword))51 {52 client.AddItemToSet(setName.ToString(), value);53 }54 } 添加一个列表到某set集合AddItemListToSet(RedisSetNameEnum setName, List<string> values)62 {63using (RedisClient client = new RedisClient(redisAddress, 6379, redisPassword))64 {65 client.AddRangeToSet(setName.ToString(), values);66 }67 } 判断某值是否已存在某set集合中JudgeItemInSet(RedisSetNameEnum setName, string value)76 {77using (RedisClient client = new RedisClient(redisAddress, 6379, redisPassword))78 {79return client.Sets[setName.ToString()].Any(t => t == value);80 }81 } 获取某set数据总数 GetSetCount(RedisSetNameEnum setName)89 {90using (RedisClient client = new RedisClient(redisAddress, 6379, redisPassword))91 {92return client.GetSetCount(setName.ToString());93 }94 }95}

免费代理IP抓取服务实现:

  我们首先设计一个最简单的IpProxy对象: