S
S
S1NYA2021-08-22 12:27:58
Python
S1NYA, 2021-08-22 12:27:58

Why doesn't it issue a new proxy each time?

I made a code, according to the idea, every time it should give me a new proxy from my .txt file, and it gives me the same constant.

class Proxy:
    proxy_list = []
    proxy_num = 0

    def __init__(self):
        with open('C:\\Users\\sinto\\PycharmProjects\\AutoREG\\Proxy.txt') as file:
            proxyesss = self.list = [line.strip() for line in file.readlines() if line.strip()]
    def random_proxy(self):
        with open('C:\\Users\\sinto\\PycharmProjects\\AutoREG\\Proxy.txt', 'r') as file:
            proxy_base = ''.join(file.readlines()).strip().split('\n')
            if proxy_base == '[]':
                print('Прокси кончились')
            proxy_r = proxy_base[Proxy.proxy_num]
            proxy_base.remove(proxy_r)
            print(proxy_r)
            Proxy.proxy_num += 1
            return proxy_r
    def get_proxy(self, proxy1=None):
        for proxy in self.list:
            if 'https://' + proxy == proxy1:
                global massiv
                massiv = massiv + [proxy]
            url = 'http://' + proxy
            try:
                r = requests.get('http://speed-tester.info/check_ip.php', proxies={'http': url})
                if r.status_code == 200:
                    return url
            except requests.exceptions.ConnectionError:
                continue
proxy = Proxy()
proxy = proxy.get_proxy()
print(proxy)

Answer the question

In order to leave comments, you need to log in

1 answer(s)
V
Vindicar, 2021-08-22
@S1NYA

What a cruel gesture. Why the hell are all these conversions from a list to a string and vice versa?
I'm assuming that one line in the file is one proxy, and the file isn't so monstrously large that it avoids loading it completely into memory. Then if on your fingers:
1. Describe a function that parses a string into a proxy description (for example, into a tuple "address, port"). For example, if proxies are specified in the form address:port, then something like

@staticmethod
def parse_proxy_line(line):
    # сработает, если на каждой строке указан порт
    addr, _, port = line.strip().rpartition(':')
    return (addr, int(port))

2. In the constructor you pass a collection of strings with a proxy. Can you do something like
def __init__(self, source):
  self.proxies = list(map(parse_proxy_line, source))

Considering that a text file is also a collection of strings, you can simply pass an open file.
with open('whatever.txt', 'rt') as src:
  proxy_list = ProxyList(src)

After that, you do not work with the file - there is no need.
3. You create a class field in which you store the index of the next proxy to issue. You can do without this index if the list will not be reused - then you can simply give the zero element of the list, and immediately delete it.
4. You write a method that, upon request, takes the list element with the specified index, then increments the index. This is repeated until a working proxy is found, or until the index is out of range.
Everything! Code for 15 lines (including verification).
In general, you can do without a class.
from typing import Tuple
def parse_proxy_line(line: str) -> Tuple[str, int]:
    # сработает, если на каждой строке указан порт
    addr, _, port = line.strip().rpartition(':')
    return (addr, int(port))
def is_good_proxy(proxy: Tuple[str, int]) -> bool:
    host, port = proxy
    return ... #тут проверяешь, хороший ли прокси и возвращаешь True если да

src = open('proxies.txt', 'rt')
# Это - ленивое вычисление. Когда мы запросим следующий прокси, 
# filter() будет запрашивать элементы, пока не найдёт "хороший",
# т.е. такой, для которого is_good_proxy() вернуло True
# В свою очередь, эти элементы будут запрашиваться из map(), 
# которая будет брать элементы из src и вызывать для каждого parse_proxy_line()
# А элементы в файле src - это текстовые строки, которые будут читаться по запросу.
# Таким образом, нет необходимости хранить весь список прокси в памяти, 
# они будут подгружаться по мере возникновения потребности.
proxies = iter(filter(is_good_proxy, map(parse_proxy_line, src)))

#когда нужно получить ещё один прокси:
host, port = next(proxies) #next - встроенная функция
#если прокси закончились, выкинет исключение StopIteration, которое можешь поймать и обработать как хочешь.

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question