@S1NYA

Почему не выдаёт каждый раз новое прокси?

Сделал код, по идеи он каждый раз должен выдавать мне новое прокси из моего .txt файла, а он выдаёт постоянное одно и тоже.
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)
  • Вопрос задан
  • 109 просмотров
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
Какая лютая жесть. Нахрена все эти преобразования из списка в строку и обратно?
Я предполагаю, что в файле одна строка - это один прокси, и файл не настолько чудовищно велик, чтобы избегать его полной загрузки в память. Тогда если на пальцах:
1. Описываешь функцию, которая разбирает строку в описание прокси (например, в кортеж "адрес,порт"). Например, если прокси указаны в виде адрес:порт, то подойдёт что-то типа
@staticmethod
def parse_proxy_line(line):
    # сработает, если на каждой строке указан порт
    addr, _, port = line.strip().rpartition(':')
    return (addr, int(port))

2. В конструктор передаёшь коллекцию строк с прокси. Можно сделать что-то типа
def __init__(self, source):
  self.proxies = list(map(parse_proxy_line, source))

Учитывая, что текстовый файл - это тоже коллекция строк, можно просто передать открытый файл.
with open('whatever.txt', 'rt') as src:
  proxy_list = ProxyList(src)

После этого с файлом не работаешь - незачем.
3. Создаёшь поле класса, в котором хранишь индекс следующего прокси для выдачи. Можно обойтись без этого индекса, если список не будет использоваться повторно - тогда можно просто отдавать нулевой элемент списка, и сразу же удалять его.
4. Пишешь метод, который по запросу берёт элемент списка с указанным индексом, затем увеличивает индекс. Это повторяется, пока не найдётся рабочий прокси или пока индекс не выйдет за пределы списка.

Всё! Кода на 15 строчек (с учётом проверки).

А вообще можно обойтись и без класса.
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, которое можешь поймать и обработать как хочешь.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы