예제 #1
0
    def __init__(self):
        # Будем притворяться браузером, иначе доступа к странице с списком прокси hideme.ru не даст
        self.headers = {
            'User-agent':
            choice(USER_AGENTS),
            'Accept':
            'text/xml,application/xml,application/xhtml+xml,text/html;'
            'q=0.9,text/plain;q=0.8,image/png,*/*;q=0.%d' % randint(2, 5),
            'Accept-Language':
            'en-us,en;q=0.%d' % randint(5, 9),
            'Accept-Charset':
            'utf-8,windows-1251;q=0.7,*;q=0.%d' % randint(5, 7),
            'Keep-Alive':
            '300',
        }

        self.proxy_list = list()

        logger.debug('Инициализация парсера капчи.')
        self.port_parser = PortImgParser()
    def __init__(self):
        # Будем притворяться браузером, иначе доступа к странице с списком прокси hideme.ru не даст
        self.headers = {
            "User-agent": choice(USER_AGENTS),
            "Accept": "text/xml,application/xml,application/xhtml+xml,text/html;"
            "q=0.9,text/plain;q=0.8,image/png,*/*;q=0.%d" % randint(2, 5),
            "Accept-Language": "en-us,en;q=0.%d" % randint(5, 9),
            "Accept-Charset": "utf-8,windows-1251;q=0.7,*;q=0.%d" % randint(5, 7),
            "Keep-Alive": "300",
        }

        self.proxy_list = list()

        logger.debug("Инициализация парсера капчи.")
        self.port_parser = PortImgParser()
예제 #3
0
class HidemeRuParser:
    """Класс для парсинга сайта hideme.ru"""
    def __init__(self):
        # Будем притворяться браузером, иначе доступа к странице с списком прокси hideme.ru не даст
        self.headers = {
            'User-agent':
            choice(USER_AGENTS),
            'Accept':
            'text/xml,application/xml,application/xhtml+xml,text/html;'
            'q=0.9,text/plain;q=0.8,image/png,*/*;q=0.%d' % randint(2, 5),
            'Accept-Language':
            'en-us,en;q=0.%d' % randint(5, 9),
            'Accept-Charset':
            'utf-8,windows-1251;q=0.7,*;q=0.%d' % randint(5, 7),
            'Keep-Alive':
            '300',
        }

        self.proxy_list = list()

        logger.debug('Инициализация парсера капчи.')
        self.port_parser = PortImgParser()

    def process_el_port(self, url, port_el):
        """Функция получает ссылку на адрес страницы с прокси и элемент, содержащий порт.

        Далее функция парсит элемент с портом и возвращает строку с портом.

        """

        # Получаем ссылку на изображение с портом
        (port_img_src, ) = port_el.xpath('img/@src')
        port_img_src = urljoin(url, port_img_src)

        logger.debug('Скачиваю картинку с портом.')
        port_img = download_image(port_img_src, self.headers)
        if port_img is None:
            raise Exception(
                'Не удалось загрузить картинку с портом. url: {}.'.format(
                    port_img_src))

        logger.debug('Закончено скачивание картинки с портом.')

        # Разбираем картинку с портом
        port = self.port_parser.run(port_img)
        if '-' in port:
            raise Exception(
                'Картинка распарсена не полностью. port: {}.\n'.format(port))

        logger.debug('Картинка распарсена. port: %s.', port)
        return port

    def run(self, url='http://hideme.ru/proxy-list/'):
        """Функция парсит указанный адрес сайта hideme.ru,
        заполняет proxy_list и возвращает его.

        """

        data = go_url(url, self.headers)
        if data is None:
            raise Exception('Страница не получена.')

        logger.info('Страница загружена.')

        tree = etree.HTML(data.decode('cp1251'))

        # Вытаскиваем список строк таблицы с атрибутом class="pl", у строк должны быть вложены теги td
        xpath = '//table[@class="pl"]/tr[td]'

        logger.debug('Начинаю парсить загруженную страницу.\n')

        try:
            rows = tree.xpath(xpath)
            if len(rows) == 0:
                raise Exception('Список прокси пустой')

            for i, row in enumerate(rows, 1):
                logger.debug('Начинаю разбирать %s строку с прокси.', i)

                ip, port, country, city, speed, proxy_type, anonymity, checked = row.xpath(
                    'td')

                try:
                    port = self.process_el_port(url, port)
                    proxy_type = tag_text(proxy_type).split(', ')

                    proxy = Proxy(tag_text(ip), port, tag_text(country),
                                  tag_text(city), tag_text(speed), proxy_type,
                                  tag_text(anonymity), tag_text(checked))

                    self.proxy_list.append(proxy)

                except Exception as e:
                    logger.exception("Error:")
                    continue

                logger.info('Закончен парсинг строки с прокси: %s.\n', proxy)

        except Exception as e:
            if isinstance(e, ValueError):
                logger.error(
                    'Изменилось количество столбцов таблицы. Ошибка: %s. xpath: %s',
                    e, xpath)
            else:
                logger.error('Ошибка: %s. xpath: %s', e, xpath)

            logger.error(traceback.format_exc())

        logger.debug('Закончен разбор. Найдено %s прокси.',
                     len(self.proxy_list))

    def save(self, out='proxy-list.txt'):
        """Функция сохраняет прокси из proxy_list в файл."""

        if self.proxy_list:
            logger.debug('Сохраняю прокси в файл: %s.', out)

            # Сохраним найденные прокси в файл
            with open(out, mode='w') as f:
                for proxy in self.proxy_list:
                    f.write('{0.ip}:{0.port}\n'.format(proxy))
        else:
            logger.warn('Список прокси пустой, отмена сохранения.')
class HidemeRuParser:
    """Класс для парсинга сайта hideme.ru"""

    def __init__(self):
        # Будем притворяться браузером, иначе доступа к странице с списком прокси hideme.ru не даст
        self.headers = {
            "User-agent": choice(USER_AGENTS),
            "Accept": "text/xml,application/xml,application/xhtml+xml,text/html;"
            "q=0.9,text/plain;q=0.8,image/png,*/*;q=0.%d" % randint(2, 5),
            "Accept-Language": "en-us,en;q=0.%d" % randint(5, 9),
            "Accept-Charset": "utf-8,windows-1251;q=0.7,*;q=0.%d" % randint(5, 7),
            "Keep-Alive": "300",
        }

        self.proxy_list = list()

        logger.debug("Инициализация парсера капчи.")
        self.port_parser = PortImgParser()

    def process_el_port(self, url, port_el):
        """Функция получает ссылку на адрес страницы с прокси и элемент, содержащий порт.

        Далее функция парсит элемент с портом и возвращает строку с портом.

        """

        # Получаем ссылку на изображение с портом
        (port_img_src,) = port_el.xpath("img/@src")
        port_img_src = urljoin(url, port_img_src)

        logger.debug("Скачиваю картинку с портом.")
        port_img = download_image(port_img_src, self.headers)
        if port_img is None:
            raise Exception("Не удалось загрузить картинку с портом. url: {}.".format(port_img_src))

        logger.debug("Закончено скачивание картинки с портом.")

        # Разбираем картинку с портом
        port = self.port_parser.run(port_img)
        if "-" in port:
            raise Exception("Картинка распарсена не полностью. port: {}.\n".format(port))

        logger.debug("Картинка распарсена. port: %s.", port)
        return port

    def run(self, url="http://hideme.ru/proxy-list/"):
        """Функция парсит указанный адрес сайта hideme.ru,
        заполняет proxy_list и возвращает его.

        """

        data = go_url(url, self.headers)
        if data is None:
            raise Exception("Страница не получена.")

        logger.info("Страница загружена.")

        tree = etree.HTML(data.decode("cp1251"))

        # Вытаскиваем список строк таблицы с атрибутом class="pl", у строк должны быть вложены теги td
        xpath = '//table[@class="pl"]/tr[td]'

        logger.debug("Начинаю парсить загруженную страницу.\n")

        try:
            rows = tree.xpath(xpath)
            if len(rows) == 0:
                raise Exception("Список прокси пустой")

            for i, row in enumerate(rows, 1):
                logger.debug("Начинаю разбирать %s строку с прокси.", i)

                ip, port, country, city, speed, proxy_type, anonymity, checked = row.xpath("td")

                try:
                    port = self.process_el_port(url, port)
                    proxy_type = tag_text(proxy_type).split(", ")

                    proxy = Proxy(
                        tag_text(ip),
                        port,
                        tag_text(country),
                        tag_text(city),
                        tag_text(speed),
                        proxy_type,
                        tag_text(anonymity),
                        tag_text(checked),
                    )

                    self.proxy_list.append(proxy)

                except Exception as e:
                    logger.warn(e)
                    continue

                logger.info("Закончен парсинг строки с прокси: %s.\n", proxy)

        except Exception as e:
            if isinstance(e, ValueError):
                logger.error("Изменилось количество столбцов таблицы. Ошибка: %s. xpath: %s", e, xpath)
            else:
                logger.error("Ошибка: %s. xpath: %s", e, xpath)

            logger.error(traceback.format_exc())

        logger.debug("Закончен разбор. Найдено %s прокси.", len(self.proxy_list))

    def save(self, out="proxy-list.txt"):
        """Функция сохраняет прокси из proxy_list в файл."""

        if self.proxy_list:
            logger.debug("Сохраняю прокси в файл: %s.", out)

            # Сохраним найденные прокси в файл
            with open(out, mode="w") as f:
                for proxy in self.proxy_list:
                    f.write("{0.ip}:{0.port}\n".format(proxy))
        else:
            logger.warn("Список прокси пустой, отмена сохранения.")