import re
import socket
import asyncio
import warnings
from math import sqrt
from html import unescape
from base64 import b64decode
from urllib.parse import unquote, urlparse
import aiohttp
from .errors import *
from .utils import log, get_headers, IPPattern, IPPortPatternGlobal
[docs]class Provider:
"""Proxy provider.
Provider - a website that publish free public proxy lists.
:param str url: Url of page where to find proxies
:param tuple proto:
(optional) List of the types (protocols) that may be supported
by proxies returned by the provider. Then used as :attr:`Proxy.types`
:param int max_conn:
(optional) The maximum number of concurrent connections on the provider
:param int max_tries:
(optional) The maximum number of attempts to receive response
:param int timeout:
(optional) Timeout of a request in seconds
"""
_pattern = IPPortPatternGlobal
def __init__(self, url=None, proto=(), max_conn=4,
max_tries=3, timeout=20, loop=None):
if url:
self.domain = urlparse(url).netloc
self.url = url
self.proto = proto
self._max_tries = max_tries
self._timeout = timeout
self._session = None
self._cookies = {}
self._proxies = set()
# concurrent connections on the current provider
self._sem_provider = asyncio.Semaphore(max_conn)
self._loop = loop or asyncio.get_event_loop()
@property
def proxies(self):
"""Return all found proxies.
:return:
Set of tuples with proxy hosts, ports and types (protocols)
that may be supported (from :attr:`.proto`).
For example:
{('192.168.0.1', '80', ('HTTP', 'HTTPS'), ...)}
:rtype: set
"""
return self._proxies
@proxies.setter
def proxies(self, new):
new = [(host, port, self.proto) for host, port in new if port]
self._proxies.update(new)
[docs] async def get_proxies(self):
"""Receive proxies from the provider and return them.
:return: :attr:`.proxies`
"""
log.debug('Try to get proxies from %s' % self.domain)
async with aiohttp.ClientSession(headers=get_headers(),
cookies=self._cookies,
loop=self._loop) as self._session:
await self._pipe()
log.debug('%d proxies received from %s: %s' % (
len(self.proxies), self.domain, self.proxies))
return self.proxies
async def _pipe(self):
await self._find_on_page(self.url)
async def _find_on_pages(self, urls):
if not urls:
return
tasks = []
if not isinstance(urls[0], dict):
urls = set(urls)
for url in urls:
if isinstance(url, dict):
tasks.append(self._find_on_page(**url))
else:
tasks.append(self._find_on_page(url))
await asyncio.gather(*tasks)
async def _find_on_page(self, url, data=None, headers=None, method='GET'):
page = await self.get(url, data=data, headers=headers, method=method)
oldcount = len(self.proxies)
try:
received = self.find_proxies(page)
except Exception as e:
received = []
log.error('Error when executing find_proxies.'
'Domain: %s; Error: %r' % (self.domain, e))
self.proxies = received
added = len(self.proxies) - oldcount
log.debug('%d(%d) proxies added(received) from %s' % (
added, len(received), url))
async def get(self, url, data=None, headers=None, method='GET'):
for _ in range(self._max_tries):
page = await self._get(url, data=data, headers=headers, method=method)
if page:
break
return page
async def _get(self, url, data=None, headers=None, method='GET'):
page = ''
try:
with (await self._sem_provider),\
aiohttp.Timeout(self._timeout, loop=self._loop):
async with self._session.request(
method, url, data=data, headers=headers) as resp:
page = await resp.text()
if resp.status != 200:
log.debug(
'url: %s\nheaders: %s\ncookies: %s\npage:\n%s' % (
url, resp.headers, resp.cookies, page))
raise BadStatusError('Status: %s' % resp.status)
except (UnicodeDecodeError, BadStatusError, asyncio.TimeoutError,
aiohttp.ClientOSError, aiohttp.ClientResponseError,
aiohttp.ServerDisconnectedError) as e:
page = ''
log.debug('%s is failed. Error: %r;' % (url, e))
return page
def find_proxies(self, page):
return self._find_proxies(page)
def _find_proxies(self, page):
proxies = self._pattern.findall(page)
return proxies
class Freeproxylists_com(Provider):
domain = 'freeproxylists.com'
async def _pipe(self):
exp = r'''href\s*=\s*['"](?P<t>[^'"]*)/(?P<uts>\d{10})[^'"]*['"]'''
urls = ['http://www.freeproxylists.com/socks.html',
'http://www.freeproxylists.com/elite.html',
'http://www.freeproxylists.com/anonymous.html']
pages = await asyncio.gather(*[self.get(url) for url in urls])
params = re.findall(exp, ''.join(pages))
tpl = 'http://www.freeproxylists.com/load_{}_{}.html'
# example: http://www.freeproxylists.com/load_socks_1448724717.html
urls = [tpl.format(t, uts) for t, uts in params]
await self._find_on_pages(urls)
class Blogspot_com_base(Provider):
_cookies = {'NCR': 1}
async def _pipe(self):
exp = r'''<a href\s*=\s*['"]([^'"]*\.\w+/\d{4}/\d{2}/[^'"#]*)['"]>'''
pages = await asyncio.gather(*[
self.get('http://%s/' % d) for d in self.domains])
urls = re.findall(exp, ''.join(pages))
await self._find_on_pages(urls)
class Blogspot_com(Blogspot_com_base):
domain = 'blogspot.com'
domains = ['sslproxies24.blogspot.com', 'proxyserverlist-24.blogspot.com',
'freeschoolproxy.blogspot.com', 'googleproxies24.blogspot.com']
class Blogspot_com_socks(Blogspot_com_base):
domain = 'blogspot.com^socks'
domains = ['www.socks24.org', ]
class Webanetlabs_net(Provider):
domain = 'webanetlabs.net'
async def _pipe(self):
exp = r'''href\s*=\s*['"]([^'"]*proxylist_at_[^'"]*)['"]'''
page = await self.get('https://webanetlabs.net/publ/24')
urls = ['https://webanetlabs.net%s' % path
for path in re.findall(exp, page)]
await self._find_on_pages(urls)
class Checkerproxy_net(Provider):
domain = 'checkerproxy.net'
async def _pipe(self):
exp = r'''href\s*=\s*['"](/archive/\d{4}-\d{2}-\d{2})['"]'''
page = await self.get('https://checkerproxy.net/')
urls = ['https://checkerproxy.net/api%s' % path
for path in re.findall(exp, page)]
await self._find_on_pages(urls)
class Proxz_com(Provider):
domain = 'proxz.com'
def find_proxies(self, page):
return self._find_proxies(unquote(page))
async def _pipe(self):
exp = r'''href\s*=\s*['"]([^'"]?proxy_list_high_anonymous_[^'"]*)['"]'''
url = 'http://www.proxz.com/proxy_list_high_anonymous_0.html'
page = await self.get(url)
urls = ['http://www.proxz.com/%s' % path
for path in re.findall(exp, page)]
urls.append(url)
await self._find_on_pages(urls)
class Proxy_list_org(Provider):
domain = 'proxy-list.org'
_pattern = re.compile(r'''Proxy\('([\w=]+)'\)''')
def find_proxies(self, page):
return [b64decode(hp).decode().split(':')
for hp in self._find_proxies(page)]
async def _pipe(self):
exp = r'''href\s*=\s*['"]\./([^'"]?index\.php\?p=\d+[^'"]*)['"]'''
url = 'http://proxy-list.org/english/index.php?p=1'
page = await self.get(url)
urls = ['http://proxy-list.org/english/%s' % path
for path in re.findall(exp, page)]
urls.append(url)
await self._find_on_pages(urls)
class Aliveproxy_com(Provider):
# more: http://www.aliveproxy.com/socks-list/socks5.aspx/United_States-us
domain = 'aliveproxy.com'
async def _pipe(self):
paths = [
'socks5-list', 'high-anonymity-proxy-list', 'anonymous-proxy-list',
'fastest-proxies', 'us-proxy-list', 'gb-proxy-list', 'fr-proxy-list',
'de-proxy-list', 'jp-proxy-list', 'ca-proxy-list', 'ru-proxy-list',
'proxy-list-port-80', 'proxy-list-port-81', 'proxy-list-port-3128',
'proxy-list-port-8000', 'proxy-list-port-8080']
urls = ['http://www.aliveproxy.com/%s/' % path for path in paths]
await self._find_on_pages(urls)
# редиректит хуй поми кудаъ
class Maxiproxies_com(Provider):
domain = 'maxiproxies.com'
async def _pipe(self):
exp = r'''<a href\s*=\s*['"]([^'"]*example[^'"#]*)['"]>'''
page = await self.get('http://maxiproxies.com/category/proxy-lists/')
urls = re.findall(exp, page)
await self._find_on_pages(urls)
class _50kproxies_com(Provider):
domain = '50kproxies.com'
async def _pipe(self):
exp = r'''<a href\s*=\s*['"]([^'"]*-proxy-list-[^'"#]*)['"]>'''
page = await self.get('http://50kproxies.com/category/proxy-list/')
urls = re.findall(exp, page)
await self._find_on_pages(urls)
class Proxylist_me(Provider):
domain = 'proxylist.me'
async def _pipe(self):
exp = r'''href\s*=\s*['"][^'"]*/?page=(\d+)['"]'''
page = await self.get('https://proxylist.me/')
lastId = max([int(n) for n in re.findall(exp, page)])
urls = ['https://proxylist.me/?page=%d' % n for n in range(lastId)]
await self._find_on_pages(urls)
class Foxtools_ru(Provider):
domain = 'foxtools.ru'
async def _pipe(self):
urls = ['http://api.foxtools.ru/v2/Proxy.txt?page=%d' % n
for n in range(1, 6)]
await self._find_on_pages(urls)
class Gatherproxy_com(Provider):
domain = 'gatherproxy.com'
_pattern_h = re.compile(
r'''(?P<ip>(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?))'''
r'''(?=.*?(?:(?:(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?))|'(?P<port>[\d\w]+)'))''',
flags=re.DOTALL)
def find_proxies(self, page):
# if 'gp.dep' in page:
# proxies = self._pattern_h.findall(page) # for http(s)
# proxies = [(host, str(int(port, 16))) for host, port in proxies if port]
# else:
# proxies = self._find_proxies(page) # for socks
return [(host, str(int(port, 16)))
for host, port in self._pattern_h.findall(page) if port]
async def _pipe(self):
url = 'http://www.gatherproxy.com/proxylist/anonymity/'
expNumPages = r'href="#(\d+)"'
method = 'POST'
# hdrs = {'Content-Type': 'application/x-www-form-urlencoded'}
urls = []
for t in ['anonymous', 'elite']:
data = {'Type': t, 'PageIdx': 1}
page = await self.get(url, data=data, method=method)
if not page:
continue
lastPageId = max([int(n) for n in re.findall(expNumPages, page)])
urls = [{'url': url, 'data': {'Type': t, 'PageIdx': pid},
'method': method} for pid in range(1, lastPageId + 1)]
# urls.append({'url': 'http://www.gatherproxy.com/sockslist/',
# 'method': method})
await self._find_on_pages(urls)
class Gatherproxy_com_socks(Provider):
domain = 'gatherproxy.com^socks'
async def _pipe(self):
urls = [{'url': 'http://www.gatherproxy.com/sockslist/',
'method': 'POST'}]
await self._find_on_pages(urls)
class Tools_rosinstrument_com_base(Provider):
# more: http://tools.rosinstrument.com/cgi-bin/
# sps.pl?pattern=month-1&max=50&nskip=0&file=proxlog.csv
domain = 'tools.rosinstrument.com'
sqrtPattern = re.compile(r'''sqrt\((\d+)\)''')
bodyPattern = re.compile(r'''hideTxt\(\n*'(.*)'\);''')
_pattern = re.compile(
r'''(?:(?P<domainOrIP>(?:[a-z0-9\-.]+\.[a-z]{2,6})|'''
r'''(?:(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}'''
r'''(?:25[0-5]|2[0-4]\d|[01]?\d\d?))))(?=.*?(?:(?:'''
r'''[a-z0-9\-.]+\.[a-z]{2,6})|(?:(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)'''
r'''\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?))|(?P<port>\d{2,5})))''',
flags=re.DOTALL)
def find_proxies(self, page):
x = self.sqrtPattern.findall(page)
if not x:
return []
x = round(sqrt(float(x[0])))
hiddenBody = self.bodyPattern.findall(page)[0]
hiddenBody = unquote(hiddenBody)
toCharCodes = [ord(char) ^ (x if i % 2 else 0)
for i, char in enumerate(hiddenBody)]
fromCharCodes = ''.join([chr(n) for n in toCharCodes])
page = unescape(fromCharCodes)
return self._find_proxies(page)
class Tools_rosinstrument_com(Tools_rosinstrument_com_base):
domain = 'tools.rosinstrument.com'
async def _pipe(self):
tpl = 'http://tools.rosinstrument.com/raw_free_db.htm?%d&t=%d'
urls = [tpl % (pid, t) for pid in range(51) for t in range(1, 3)]
await self._find_on_pages(urls)
class Tools_rosinstrument_com_socks(Tools_rosinstrument_com_base):
domain = 'tools.rosinstrument.com^socks'
async def _pipe(self):
tpl = 'http://tools.rosinstrument.com/raw_free_db.htm?%d&t=3'
urls = [tpl % pid for pid in range(51)]
await self._find_on_pages(urls)
class Xseo_in(Provider):
domain = 'xseo.in'
charEqNum = {}
def char_js_port_to_num(self, matchobj):
chars = matchobj.groups()[0]
num = ''.join([self.charEqNum[ch] for ch in chars if ch != '+'])
return num
def find_proxies(self, page):
expPortOnJS = r'\(""\+(?P<chars>[a-z+]+)\)'
expCharNum = r'\b(?P<char>[a-z])=(?P<num>\d);'
self.charEqNum = {char: i for char, i in re.findall(expCharNum, page)}
page = re.sub(expPortOnJS, self.char_js_port_to_num, page)
return self._find_proxies(page)
async def _pipe(self):
await self._find_on_page(
url='http://xseo.in/proxylist', data={'submit': 1}, method='POST')
class Nntime_com(Provider):
domain = 'nntime.com'
charEqNum = {}
_pattern = re.compile(
r'''\b(?P<ip>(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}'''
r'''(?:25[0-5]|2[0-4]\d|[01]?\d\d?))(?=.*?(?:(?:(?:(?:25'''
r'''[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)'''
r''')|(?P<port>\d{2,5})))''',
flags=re.DOTALL)
def char_js_port_to_num(self, matchobj):
chars = matchobj.groups()[0]
num = ''.join([self.charEqNum[ch] for ch in chars if ch != '+'])
return num
def find_proxies(self, page):
expPortOnJS = r'\(":"\+(?P<chars>[a-z+]+)\)'
expCharNum = r'\b(?P<char>[a-z])=(?P<num>\d);'
self.charEqNum = {char: i for char, i in re.findall(expCharNum, page)}
page = re.sub(expPortOnJS, self.char_js_port_to_num, page)
return self._find_proxies(page)
async def _pipe(self):
tpl = 'http://www.nntime.com/proxy-updated-{:02}.htm'
urls = [tpl.format(n) for n in range(1, 31)]
await self._find_on_pages(urls)
class Proxynova_com(Provider):
domain = 'proxynova.com'
async def _pipe(self):
expCountries = r'"([a-z]{2})"'
page = await self.get('https://www.proxynova.com/proxy-server-list/')
tpl = 'https://www.proxynova.com/proxy-server-list/country-%s/'
urls = [tpl % isoCode for isoCode in re.findall(expCountries, page)
if isoCode != 'en']
await self._find_on_pages(urls)
class Spys_ru(Provider):
domain = 'spys.ru'
charEqNum = {}
def char_js_port_to_num(self, matchobj):
chars = matchobj.groups()[0].split('+')
# ex: '+(i9w3m3^k1y5)+(g7g7g7^v2e5)+(d4r8o5^i9u1)+(y5c3e5^t0z6)'
# => ['', '(i9w3m3^k1y5)', '(g7g7g7^v2e5)', '(d4r8o5^i9u1)', '(y5c3e5^t0z6)']
# => ['i9w3m3', 'k1y5'] => int^int
num = ''
for numOfChars in chars[1:]: # first - is ''
var1, var2 = numOfChars.strip('()').split('^')
digit = self.charEqNum[var1] ^ self.charEqNum[var2]
num += str(digit)
return num
def find_proxies(self, page):
expPortOnJS = r'(?P<js_port_code>(?:\+\([a-z0-9^+]+\))+)'
# expCharNum = r'\b(?P<char>[a-z\d]+)=(?P<num>[a-z\d\^]+);'
expCharNum = r'[>;]{1}(?P<char>[a-z\d]{4,})=(?P<num>[a-z\d\^]+)'
# self.charEqNum = {char: i for char, i in re.findall(expCharNum, page)}
res = re.findall(expCharNum, page)
for char, num in res:
if '^' in num:
digit, tochar = num.split('^')
num = int(digit) ^ self.charEqNum[tochar]
self.charEqNum[char] = int(num)
page = re.sub(expPortOnJS, self.char_js_port_to_num, page)
return self._find_proxies(page)
async def _pipe(self):
expSession = r"'([a-z0-9]{32})'"
url = 'http://spys.one/proxies/'
page = await self.get(url)
sessionId = re.findall(expSession, page)[0]
data = {'xf0': sessionId, # session id
'xpp': 3, # 3 - 200 proxies on page
'xf1': None} # 1 = ANM & HIA; 3 = ANM; 4 = HIA
method = 'POST'
urls = [{'url': url, 'data': {**data, 'xf1': lvl},
'method': method} for lvl in [3, 4]]
await self._find_on_pages(urls)
# expCountries = r'>([A-Z]{2})<'
# url = 'http://spys.ru/proxys/'
# page = await self.get(url)
# links = ['http://spys.ru/proxys/%s/' %
# isoCode for isoCode in re.findall(expCountries, page)]
class My_proxy_com(Provider):
domain = 'my-proxy.com'
async def _pipe(self):
exp = r'''href\s*=\s*['"]([^'"]?free-[^'"]*)['"]'''
url = 'https://www.my-proxy.com/free-proxy-list.html'
page = await self.get(url)
urls = ['https://www.my-proxy.com/%s' % path
for path in re.findall(exp, page)]
urls.append(url)
await self._find_on_pages(urls)
class Free_proxy_cz(Provider):
domain = 'free-proxy.cz'
_pattern = re.compile(
r'''decode\("([\w=]+)".*?\("([\w=]+)"\)''', flags=re.DOTALL)
def find_proxies(self, page):
return [(b64decode(h).decode(), b64decode(p).decode())
for h, p in self._find_proxies(page)]
async def _pipe(self):
tpl = 'http://free-proxy.cz/en/proxylist/main/date/%d'
urls = [tpl % n for n in range(1, 15)]
await self._find_on_pages(urls)
# _urls = []
# for url in urls:
# if len(_urls) == 15:
# await self._find_on_pages(_urls)
# print('sleeping on 61 sec')
# await asyncio.sleep(61)
# _urls = []
# _urls.append(url)
# =========
# expNumPages = r'href="/en/proxylist/main/(\d+)"'
# page = await self.get('http://free-proxy.cz/en/')
# if not page:
# return
# lastPageId = max([int(n) for n in re.findall(expNumPages, page)])
# tpl = 'http://free-proxy.cz/en/proxylist/main/date/%d'
# urls = [tpl % pid for pid in range(1, lastPageId+1)]
# _urls = []
# for url in urls:
# if len(_urls) == 15:
# await self._find_on_pages(_urls)
# print('sleeping on 61 sec')
# await asyncio.sleep(61)
# _urls = []
# _urls.append(url)
# под вопросом
class Proxyb_net(Provider):
domain = 'proxyb.net'
_port_pattern_b64 = re.compile(r"stats\('([\w=]+)'\)")
_port_pattern = re.compile(r"':(\d+)'")
def find_proxies(self, page):
if not page:
return []
_hosts, _ports = page.split('","ports":"')
hosts, ports = [], []
for host in _hosts.split('<\/tr><tr>'):
host = IPPattern.findall(host)
if not host:
continue
hosts.append(host[0])
ports = [self._port_pattern.findall(b64decode(port).decode())[0]
for port in self._port_pattern_b64.findall(_ports)]
return [(host, port) for host, port in zip(hosts, ports)]
async def _pipe(self):
url = 'http://proxyb.net/ajax.php'
method = 'POST'
data = {'action': 'getProxy', 'p': 0,
'page': '/anonimnye_proksi_besplatno.html'}
hdrs = {'X-Requested-With': 'XMLHttpRequest'}
urls = [{'url': url, 'data': {**data, 'p': p},
'method': method, 'headers': hdrs} for p in range(0, 151)]
await self._find_on_pages(urls)
class Proxylistplus_com(Provider):
domain = 'list.proxylistplus.com'
async def _pipe(self):
names = ['Fresh-HTTP-Proxy', 'SSL', 'Socks']
urls = ['http://list.proxylistplus.com/%s-List-%d' % (i, n)
for i in names for n in range(1, 7)]
await self._find_on_pages(urls)
class ProxyProvider(Provider):
def __init__(self, *args, **kwargs):
warnings.warn('`ProxyProvider` is deprecated, use `Provider` instead.',
DeprecationWarning)
super().__init__(*args, **kwargs)
PROVIDERS = [
Provider(url='http://www.proxylists.net/',
proto=('HTTP', 'CONNECT:80', 'HTTPS', 'CONNECT:25')), # 49
Provider(url='http://ipaddress.com/proxy-list/',
proto=('HTTP', 'CONNECT:80', 'HTTPS', 'CONNECT:25')), # 53
Provider(url='https://www.sslproxies.org/',
proto=('HTTP', 'CONNECT:80', 'HTTPS', 'CONNECT:25')), # 100
Provider(url='https://freshfreeproxylist.wordpress.com/',
proto=('HTTP', 'CONNECT:80', 'HTTPS', 'CONNECT:25')), # 50
Provider(url='http://proxytime.ru/http',
proto=('HTTP', 'CONNECT:80', 'HTTPS', 'CONNECT:25')), # 1400
Provider(url='https://free-proxy-list.net/',
proto=('HTTP', 'CONNECT:80', 'HTTPS', 'CONNECT:25')), # 300
Provider(url='https://us-proxy.org/',
proto=('HTTP', 'CONNECT:80', 'HTTPS', 'CONNECT:25')), # 200
Provider(url='http://fineproxy.org/eng/fresh-proxies/',
proto=('HTTP', 'CONNECT:80', 'HTTPS', 'CONNECT:25')), # 5500
Provider(url='https://socks-proxy.net/',
proto=('SOCKS4', 'SOCKS5')), # 80
Provider(url='http://www.httptunnel.ge/ProxyListForFree.aspx',
proto=('HTTP', 'CONNECT:80', 'HTTPS', 'CONNECT:25')), # 200
Provider(url='http://cn-proxy.com/',
proto=('HTTP', 'CONNECT:80', 'HTTPS', 'CONNECT:25')), # 70
Provider(url='https://hugeproxies.com/home/',
proto=('HTTP', 'CONNECT:80', 'HTTPS', 'CONNECT:25')), # 800
Provider(url='http://proxy.rufey.ru/',
proto=('HTTP', 'CONNECT:80', 'HTTPS', 'CONNECT:25')), # 153
Provider(url='https://geekelectronics.org/my-servisy/proxy',
proto=('HTTP', 'CONNECT:80', 'HTTPS', 'CONNECT:25')), # 400
Proxy_list_org(proto=('HTTP', 'CONNECT:80', 'HTTPS', 'CONNECT:25')), # 140
Xseo_in(proto=('HTTP', 'CONNECT:80', 'HTTPS', 'CONNECT:25')), # 240
Spys_ru(proto=('HTTP', 'CONNECT:80', 'HTTPS', 'CONNECT:25')), # 660
Proxylistplus_com(proto=('HTTP', 'CONNECT:80', 'HTTPS', 'CONNECT:25')), # 450
Proxylist_me(proto=('HTTP', 'CONNECT:80', 'HTTPS', 'CONNECT:25')), # 2872
Foxtools_ru(proto=('HTTP', 'CONNECT:80', 'HTTPS', 'CONNECT:25'), max_conn=1), # 500
Gatherproxy_com(proto=('HTTP', 'CONNECT:80', 'HTTPS', 'CONNECT:25')), # 3212
Nntime_com(proto=('HTTP', 'CONNECT:80', 'HTTPS', 'CONNECT:25')), # 1050
Blogspot_com(proto=('HTTP', 'CONNECT:80', 'HTTPS', 'CONNECT:25')), # 24800
Gatherproxy_com_socks(proto=('SOCKS4', 'SOCKS5')), # 30
Blogspot_com_socks(proto=('SOCKS4', 'SOCKS5')), # 1486
Tools_rosinstrument_com(proto=('HTTP', 'CONNECT:80', 'HTTPS', 'CONNECT:25')), # 4000
Tools_rosinstrument_com_socks(proto=('SOCKS4', 'SOCKS5')), # 1800
My_proxy_com(max_conn=2), # 1000
Checkerproxy_net(), # 60000
Aliveproxy_com(), # 210
Freeproxylists_com(), # 1338
Webanetlabs_net(), # 5000
Maxiproxies_com(), # 430
# # Bad...
# http://www.proxylist.ro/
# Provider(url='http://proxydb.net/',
# proto=('HTTP', 'CONNECT:80', 'HTTPS', 'CONNECT:25', 'SOCKS4', 'SOCKS5')),
# Provider(url='http://www.cybersyndrome.net/pla6.html',
# proto=('HTTP', 'CONNECT:80', 'HTTPS', 'CONNECT:25')), # 1100
# Provider(url='https://www.ip-adress.com/proxy-list',
# proto=('HTTP', 'CONNECT:80', 'HTTPS', 'CONNECT:25')), # 57
# Provider(url='https://www.marcosbl.com/lab/proxies/',
# proto=('HTTP', 'CONNECT:80', 'HTTPS', 'CONNECT:25')), # 89
# Provider(url='http://go4free.xyz/Free-Proxy/', proto=('HTTP', 'CONNECT:80', 'HTTPS', 'CONNECT:25')), # 196
# Provider(url='http://blackstarsecurity.com/proxy-list.txt'), # 7014
# Provider(url='http://www.get-proxy.net/proxy-archives'), # 519
# Proxyb_net(proto=('HTTP', 'CONNECT:80', 'HTTPS', 'CONNECT:25')), # 857
# Proxz_com(proto=('HTTP', 'CONNECT:80', 'HTTPS', 'CONNECT:25'), max_conn=2), # 443
# Proxynova_com(proto=('HTTP', 'CONNECT:80', 'HTTPS', 'CONNECT:25')), # 818
# _50kproxies_com(), # 822
# Free_proxy_cz(), # 420
]