付费代理个人测评及选取——重复率、可用率、响应时间、稳定性、价格(只供参考)

  由于公司业务要求,西瓜代理已经不满足需求,准备更换新的代理IP池,所以调研测试了一下市面上的各家付费代理(免费代理可用率低故不考虑),功能限制和价格情况等如何,以便从中挑选满足要求的代理。

  1、目标站

        

  2、情报收集

  整理套餐的价格和类型,API频率,每秒提取上限,每天提取上限,使用时长等信息:

  (ps:这里建表格很费劲,所以传的图,如果图片看不清,请单独打开图片或者下载,超清哦!)

  备注:

  • 使用时长和可用率来源 (1)目标网站上写的(2)联系客服告知的
  • 类型大体上可以分为两类,API(请求对方接口给你返回IP)和HTTP隧道(用对方软件或者直接给对方发请求,对方用代理IP请求待爬网站,最后对方给你返回response,免去囤、验IP的步骤)。
  • 说明1:HTTP隧道代理(动态转发)
    HTTP隧道代理:接入固定代理服务器,动态转发请求
    统一入口,随机动态出口,每一个请求一个随机IP。
    无须切换IP,连接上他们的代理服务器后,每一个请求都是一个随机IP,按并发数/转发数计费。
    动态转发就是你把你代码的proxy设置成他们的服务器,那么每次请求他们会使用一个随机的IP,每次都会变化,也就是说,你只需设置一次代理,就可以得到随机变化的IP,免去频繁更换代理的麻烦,省去了代理池的维护这一个步骤。

  • 说明2:
    1.汇总依据:以上根据知乎代回答中,所有提到的代理名称,
    以及崔庆才做的测评中可用率在8成以上的代理相结合所做的汇总。
    (已剔除免费代理--西刺,可用率低/稳定性差--快代理、大象代理)
    2.因业务对IP需求量较大且使用频繁,已剔除按数量计费的套餐

  3、初步筛选

   剔除条件:

  可接受的价格(100+ ~ 300+),每天提取上限(大于3000),且不使用隧道和软件代理(因为线上业务和爬虫共用,所以不能把软件放到线上服务器上)。

  最后筛选出来这几家需要测评的:

        

   4、测评

    我把上面的套餐都买了一遍,以供下面的评测使用(有的买的是一天使用权有的是网站有免费测试,所以此篇文章应该至少值几十块钱吧哈哈)。

  (1)测评指标

    我关心的测试指标为:重复率,可用率(以访问百度为基准),响应时间,稳定性

  重复率

    因为线上业务需要用代理,会有封IP的情况,而且一封就是一天,所以重复率一定要低。这里以500个为基准,每个IP都存入数据库,最后查重,用重复的数量/总数量算出重复率。

  可用率

    可用率就是提取的这些代理中可以正常使用的比率。假如我们无法使用这个代理请求某个网站或者访问超时,那么就代表这个代理不可用,在这里我的测试样本大小为 500,即提取 500 个代理,看看里面可用的比率多少。

  响应速度

    响应速度可以用耗费时间来衡量,即计算使用这个代理请求网站一直到得到响应所耗费的时间。时间越短,证明代理的响应速度越快,这里同样是 500 个样本,计算时只对正常可用的代理做统计,计算耗费时间的平均值。

  稳定性

    由于爬虫时我们需要使用大量代理,如果一个代理响应速度特别快,很快就能得到响应,而下一次请求使用的代理响应速度特别慢,等了三十秒才得到响应,那势必会影响爬取效率,所以我们需要看下商家提供的这些代理稳定性怎样,总不能这一个特别快,下一个又慢的不行。所以这里我们需要统计一下耗费时间的方差,方差越大,证明稳定性越差。

  (2)测评标准

  测试环境

    公司的生产环境

  测试原则

    现取现测,即取一个测一个。现在很多付费代理网站都提供了 API 接口,我们可以一次性提取多个代理,但是这样会导致一个问题,每个代理在提取出来的时候,商家是会尽量保证它的可用性的,但过一段时间,这个代理可能就不好用了,所以假如我们一次性提取出来了 100 个代理,但是这 100 个代理并没有同时参与测试,后面的代理就会经历一个的等待期,过一段时间再测这些代理的话,肯定会影响后半部分代理的有效性,所以这里我们将提取的数量统一设置成 1,即请求一次接口获取一个代理,然后立即进行测试,这样可以保证测试的公平性,排除了不同代理有效期的干扰。

  时间计算

    计算程序请求之前和得到响应之后的时间差,这里我们使用的测试 Python 库是 requests,所以我们就计算发起请求和得到响应之间的时间差即可,时间计算方法如下所示:

start_time = time.time()
requests.get(test_url, timeout=timeout, proxies=proxies)
end_time = time.time()
used_time = end_time - start_time
知识兔View Code

    这里 used_time 就是使用代理请求的耗时,这样测试的就仅仅是发起请求到得到响应的时间。

  测试链接

    测试时我们也需要使用一个稳定的且没有反爬虫的链接,这样可以排除服务器的干扰,这里我们使用百度来作为测试目标。

  超时限制

    在测试时免不了的会遇到代理请求超时的问题,所以这里我们也需要统一一个超时时间,这里设置为 60 秒,如果使用代理请求百度,60 秒还没有得到响应,那就视为该代理无效。

  测试数量

    要做测评,那么样本不能太小,如只有十几次测试是不能轻易下结论的,这里我选取了一个适中的测评数量 500,即每个套餐获取 500 个代理进行测试。

   

  (3)测评过程

    主要说一下测评的代码逻辑,首先测的时候是取一个测一个的,所以这里定义了一个 test_proxy() 方法:  

test_url = 'https://www.baidu.com/'
timeout = 60

def test_proxy(proxy):
    try:
        proxies = {
            'https': 'http://' + proxy
        }
        start_time = time.time()
        requests.get(test_url, timeout=timeout, proxies=proxies)
        end_time = time.time()
        used_time = end_time - start_time
        print('Proxy Valid', 'Used Time:', used_time)
        return True, used_time
    except (ProxyError, ConnectTimeout, SSLError, ReadTimeout, ConnectionError):
        print('Proxy Invalid:', proxy)
        return False, None
知识兔View Code

    这里需要传入一个参数 proxy,代表一个代理,即 IP 加端口组成的代理,然后这里使用了 requests 的 proxies 参数传递给 get() 方法。对于代理无效的检测,这里判断了 ProxyError, ConnectTimeout, SSLError, ReadTimeout, ConnectionError 这几种异常,如果发生了这些异常统统视为代理无效,返回错误。如果在 timeout 60 秒内得到了响应,那么就计算其耗费时间并返回。

    在主程序里,就是获取 API 然后统计结果了,代码如下:

max = 500

def main():
    print('Testing')
    used_time_list = []
    valid_count = 0
    total_count = 0
    while True:
        flag, result = get_page(api_url)
        if flag:
            proxy = result.strip()
            if is_proxy(proxy):
                total_count += 1
                print('Testing proxy', proxy)
                test_flag, test_result = test_proxy(proxy=proxy)
                if test_flag:
                    valid_count += 1
                    used_time_list.append(test_result)
                stats_result(used_time_list, valid_count, total_count)
        time.sleep(wait)
        if total_count == max:
            break
知识兔View Code

    这里加了一些判断,如 is_proxy() 方法判断了获取的是不是符合有效的代理规则,即判断它是不是 IP 加端口的形式,这样可以排除 API 返回一些错误信息的干扰。另外这里设置了 total_count 和 valid_count 变量,只有符合代理规则的代理参与了测试,这样才算一次有效测试,total_count 加一,如果测试可用,那么 valid_count 加一并记录耗费时间。最后调用了 stats_results 方法进行了统计: