代理的使用
代理的设置
获取代理
1 | 做测试之前,我们需要先获取一个可用代理。搜索引擎搜索“代理”关键字,就可以看到许多代 |
1 | 为 127.0.0.1:9743,另外还会在9742端口创建SOCKS代理服务,即代理为 127.0.0.1:9742。我只要设置了这个代理,就可以成功将本机IP 切换到代理软件连接的服务器的IP了 |
urllib
requests
代理池的维护
1 | 在网上有大量公开的免费代理,或者我们也可以购买付费的代理ip, 但是代理不论是免费的还是付费的,都不能保证都是可用的,因为可能此ip被其他人使用来爬取同样的目标站点而被封禁,或者代理服务器突然发生故障或网络繁忙。 |
准备工作
1 | 首先需要成功安装Redis数据库并启动服务,另外还需要安装aiohttp、 requests、 redis-py、 pyquery、 |
代理池的目标
存储模块
1 | 负责存储抓取下来的代理。首先要保证代理不重复,要标识代理的可用情况,还要动态实时处理每个代理,所以一种比较高效和方便的存储方式就是使用R edis的 Sorted Set , 即有序集合 |
获取模块
1 | 需要定时在各大代理网站抓取代理。代理可以是免费公开代理也可以是付费代 |
检测模块
1 | 需要定时检测数据库中的代理。这里需要设置一个检测链接,最好是爬取哪个网站就检测哪个网站,这样更加有针对性,如果要做一个通用型的代理,那可以设置百度等链接来检测。另外,我们需要标识每一个代理的状态,如设置分数标识, 1 0 0 分代表可用,分数越少代表越不可用。检测一次,如果代理可用,我们可以将分数标识立即设置为100满分,也可以在原基础上加1分 ;如果代理不可用,可以将分数标识减1分,当分数减到一定阈值后,代理就直接从数据库移除。通过这样的标识分数,我们就可以辨别代理的可用情况,选用的时候会更有针对性 |
接口模块
1 | 需 要 用 A P I来提供对外服务的接口。其实我们可以直接连接数据库来取对应的数据 ,但是这样就需要知道数据库的连接信息,并且要配置连接,而比较安全和方便的方式就是提供一个Web A P I接口,我们通过访问接口即可拿到可用代理。另外,由于可用代理可能有多个,那么我们可以设置一个随机返回某个可用代理的接口,这样就能保证每个可用代理都可以取到,实现负载均衡 |
代理池的架构
1 | 存储模块使用Redis的有序集合,用来做代理的去重和状态标识,同时它也是中心模块和基础模块,将其他模块串联起来。 |
代理池的实现
存储模块
1 | 这里我们使用Redis的有序集合,集合的每一个元素都是不重复的,对于代理池来说,集合的元素就变成了一个个代理,也 就 是 IP加端口的形式,如 60.207.237.111:8888,这样的一个代理就是集合的一个元素。 另外,有序集合的每一个元素都有一个分数字段,分数是可以重复的,可以是浮点数类型, 也可以是整数类型。 该集合会根据每一个元素的分数对集合进行排序,数值小的排在前面,数值大的排在后面,这样就可以实现集合元素的排序了。 |
1 | 分数是我们判断代理稳定性的重要标准, 设置分数规则如下所示。 |
1 | 这只是一种解决方案,当然可能还有更合理的方案。之所以设置此方案有如下几个原因。 |
获取模块
检测模块
接口模块
1 | 我们怎样方便地获取可用代理呢?可以用 Redis Client类直接连接Redis,然后调用random() |
1 | from flask import Flask, g |
1 | 在这里,我们声明了一个Flask对象,定义了3个接口,分别是首页、随机代理页、获取数量页。 |
调度模块
1 | TESTER_CYCLE = 20 |
1 | 3 个 常 量 TESTER_ENABLED、 GETTER_ENABLED、 API_ENABLED都是布尔类型,表示测试模块、获取模 |
