Source code for proxybroker.providers

import asyncio
import re
import warnings
from base64 import b64decode
from html import unescape
from math import sqrt
from urllib.parse import unquote, urlparse

import aiohttp

from .errors import BadStatusError
from .utils import IPPattern, IPPortPatternGlobal, get_headers, log


[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) try: self._loop = loop or asyncio.get_running_loop() except RuntimeError: # No running event loop, will be set later self._loop = 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 ) 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) )
[docs] 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: timeout = aiohttp.ClientTimeout(total=self._timeout) async with ( self._sem_provider, self._session.request( method, url, data=data, headers=headers, timeout=timeout ) 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
[docs] 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_[^'"]*)['"]""" # noqa 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?))""" # noqa 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]+)'))""", # noqa 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>"): # noqa: W605 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 Proxylist_download(Provider): domain = "www.proxy-list.download" async def _pipe(self): urls = [ "https://www.proxy-list.download/api/v1/get?type=http", "https://www.proxy-list.download/api/v1/get?type=https", "https://www.proxy-list.download/api/v1/get?type=socks4", "https://www.proxy-list.download/api/v1/get?type=socks5", ] await self._find_on_pages(urls) class ProxyProvider(Provider): def __init__(self, *args, **kwargs): warnings.warn( "`ProxyProvider` is deprecated, use `Provider` instead.", DeprecationWarning, stacklevel=2, ) super().__init__(*args, **kwargs) PROVIDERS = [ Provider( url="http://www.proxylists.net/", proto=("HTTP", "CONNECT:80", "HTTPS", "CONNECT:25"), ), # 49 Provider( url="https://api.proxyscrape.com/?request=getproxies&proxytype=http", proto=("HTTP", "CONNECT:80", "HTTPS", "CONNECT:25"), ), # added by ZerGo0 Provider( url="https://api.proxyscrape.com/?request=getproxies&proxytype=socks4", proto=("SOCKS4"), ), # added by ZerGo0 Provider( url="https://api.proxyscrape.com/?request=getproxies&proxytype=socks5", proto=("SOCKS5"), ), # added by ZerGo0 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 Provider( url="http://pubproxy.com/api/proxy?limit=20&format=txt", proto=("HTTP", "CONNECT:80", "HTTPS", "CONNECT:25"), ), # 20 Proxy_list_org(proto=("HTTP", "CONNECT:80", "HTTPS", "CONNECT:25")), # noqa: E501 Xseo_in(proto=("HTTP", "CONNECT:80", "HTTPS", "CONNECT:25")), # noqa: E501 Spys_ru(proto=("HTTP", "CONNECT:80", "HTTPS", "CONNECT:25")), # noqa: E501 Proxylistplus_com(proto=("HTTP", "CONNECT:80", "HTTPS", "CONNECT:25")), # noqa: E501 Proxylist_me(proto=("HTTP", "CONNECT:80", "HTTPS", "CONNECT:25")), # noqa: E501 Foxtools_ru(proto=("HTTP", "CONNECT:80", "HTTPS", "CONNECT:25"), max_conn=1), # noqa: E501 Gatherproxy_com(proto=("HTTP", "CONNECT:80", "HTTPS", "CONNECT:25")), # noqa: E501 Nntime_com(proto=("HTTP", "CONNECT:80", "HTTPS", "CONNECT:25")), # noqa: E501 Blogspot_com(proto=("HTTP", "CONNECT:80", "HTTPS", "CONNECT:25")), # noqa: E501 Gatherproxy_com_socks(proto=("SOCKS4", "SOCKS5")), # noqa: E501 Blogspot_com_socks(proto=("SOCKS4", "SOCKS5")), # noqa: E501 Tools_rosinstrument_com(proto=("HTTP", "CONNECT:80", "HTTPS", "CONNECT:25")), # noqa: E501 Tools_rosinstrument_com_socks(proto=("SOCKS4", "SOCKS5")), # noqa: E501 My_proxy_com(max_conn=2), # noqa: E501 Checkerproxy_net(), # noqa: E501 Aliveproxy_com(), # noqa: E501 Freeproxylists_com(), # noqa: E501 Webanetlabs_net(), # noqa: E501 Maxiproxies_com(), # noqa: E501 Proxylist_download(), # noqa: E501 # # 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 ]