使用国内的IP代理池需要认证,通过微信或支付宝获取个人的eid(网络身份证),所以使用国内代理池别干坏事

背景

随着大数据时代的到来,爬虫已经成了获取数据的必不可少的方式,做过爬虫的想必都深有体会,爬取的时候莫名其妙 IP 就被网站封掉了,毕竟各大网站也不想自己的数据被轻易地爬走。

对于爬虫来说,为了解决封禁 IP 的问题,一个有效的方式就是使用代理,使用代理之后可以让爬虫伪装自己的真实 IP,如果使用大量的随机的代理进行爬取,那么网站就不知道是我们的爬虫一直在爬取了,这样就有效地解决了反爬的问题。

测评

[!NOTE]
从安全考虑必须支持SSL,经测试以下IP代理池支持SSL,其他的IP代理池由于不支持SSL或不稳定直接PASS掉了

要做标准的测评,那就必须在标准的测评环境下进行,且尽可能排除一些杂项的干扰,如网络波动、传输延迟等一系列的影响。

  • 现取现测:取一个测一个
  • 时间计算:计算发起请求和得到响应之间的时间差
  • 测试链接:一个稳定的且没有反爬虫的链接,所以我自己写了一个接口,可显示真实IP地址
  • 超时限制:设置为 60 秒,60 秒还没有得到响应,那就视为该代理无效。
  • 测试数量:由于太穷,只设置50个,建议500个
代理商家 测试次数 有效次数 可用率 响应时间均值 响应时间方差
大麦IP1 50 47 94.00% 0.81447333 10.787244
51代理2 50 42 84.00% 1.6799687 15.774886
神龙代理3 50 46 92.00% 1.946256 19.586046
小象代理4 50 48 96.00% 2.0238178 22.192558
bright5 50 48 96.00% 7.7364583 5.921762
  • 表中的响应时间方差越大,代表稳定性越低。

就结果而言“大麦IP”效果不错

测评代码

# Author : xqk 
# Time : 2024/10/11 16:03 
# Function: 测评IP代理池
# GitHub: https://github.com/xqk

import numpy as np
import requests
import time
from tqdm import tqdm
import sys
import urllib.request
import ssl

def get_proxy(apiurl):
    """获取代理地址"""
    if is_proxy(apiurl):
        return True, apiurl
    
    r = requests.get(apiurl)
    if r.status_code != 200:
        return False, ""
    
    return True, r.text


def is_proxy(proxy):
    """判断是否是代理地址"""
    if proxy.find(":") != -1 and proxy.find("http") == -1:
        return True
    
    return False


def testproxy(proxy):
    """测试代理"""
    testurl = "https://httpbin.org/get"
    timeout = 60
    try:
        proxies = {
            'http': 'http://' + proxy,
            'https': 'http://' + proxy
        }
        starttime = time.time()
        res = requests.get(testurl, timeout=timeout, proxies=proxies)
        print(res.text)
        endtime = time.time()
        usedtime = endtime - starttime
        # print('Proxy Valid', 'Used Time:', usedtime)
        return True, usedtime
    except Exception as e:
        print(e)
        print('Proxy Invalid:', proxy)
        return False, None
    

def statsresult(usedtimelist, validcount, totalcount):
    """统计数据"""
    if not usedtimelist or not totalcount:
        return
    usedtimearray = np.asarray(usedtimelist, np.float32)
    # print('测试次数:', totalcount,
    #       '有效次数:', validcount,
    #       '可用率: %.2f%%' % (validcount * 100.0 / totalcount),
    #       '响应时间均值:', usedtimearray.mean(),
    #       '响应时间方差', usedtimearray.var())
    
    return (totalcount,
          validcount,
          '%.2f%%' % (validcount * 100.0 / totalcount),
          usedtimearray.mean(),
          usedtimearray.var())


def do_main(apiurl):
    """开始测评"""
    wait = 1 # 等待时间
    max_loop = 50  # 测试次数
    usedtimelist = [] # 响应时间列表,用于计算均值和方差
    validcount = 0 # 有效次数
    totalcount = 0 # 已测试次数
    
    max_try_loop = 0  # 循环次数
    max_try_count = 100  # 最大可循环次数,可避免死循环,注:要比max_loop大
    
    statinfo = None
    
    def generator():
        while True:
            if max_try_loop > max_try_count:
                break
            if totalcount == max_loop:
                break
            yield
    
    for _ in tqdm(generator()):
        # 防止异常无限循环情况
        max_try_loop += 1
        
        flag, result = get_proxy(apiurl)
        if flag:
            proxy = result.strip()
            # print(proxy)

            if is_proxy(proxy):
                totalcount += 1
                
                testflag, testresult = testproxy(proxy)
                if testflag:
                    validcount += 1
                    usedtimelist.append(testresult)
                    
                statinfo = statsresult(usedtimelist, validcount, totalcount)
                
        time.sleep(wait) 
                
    if statinfo:
        print('测试次数:', statinfo[0],
              '有效次数:', statinfo[1],
              '可用率:', statinfo[2],
              '响应时间均值:', statinfo[3],
              '响应时间方差:', statinfo[4])
# 获取代理网址,一般返回:ip:port 格式的字符串,如获取代理地址http://xxx.com/xxxx请求后返回代理地址121.121.33.11:3343
apiurl = "获取代理网址"
do_main(apiurl)
  1. 大麦IP;优点:1、获取IP快 2、响应快;缺点:1、需要实名认证

  2. 51代理;优点:1、获取IP快;缺点:1、需要实名认证

  3. 神龙代理;优点:1、获取IP快;缺点:1、需要实名认证

  4. 小象代理;缺点:1、有获取IP频率限制,大概10秒钟,这严重影响效率 2、需要实名认证

  5. bright;优点:1、国外不需要认证 2、有效次数高 3、IP池多;缺点:1、响应慢