使用国内的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)