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

    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, которое можешь поймать и обработать как хочешь.
    Ответ написан
    8 комментариев
  • Как брать каждый раз новый прокси из текстового документа?

    @aab137
    file.readline(n) прочитает n-ную строку в файле. соответственно, нужно менять n, или как счетчик, или рандомом
    Ответ написан
    9 комментариев