Статья Пишем парсер на Python - грабим Proxy ч.1

Приветствую тебя читатель!

Продолжение здесь: Пишем парсер на Python - грабим Proxy ч.2

Конечно же все вы когда-нибудь пользовались прокси, и сегодня мы научимся делать парсер для добычи оных.

proxy.jpg


Прокси-сервер — промежуточный сервер, позволяющий замаскировать собственное местоположение.
Парсер - это программа, которая автоматизирует сбор информации с заданных ресурсов.

Приступим:

Для начала мы накидаем такую конструкцию

Python:
import requests
from bs4 import BeautifulSoup


if __name__ == '__main__':
    main()

Модуль requests нужен для обращения к серверу, BeautifulSoup анализирует html код, и последняя запись это точка входа в главную функцию main() которую мы напишем в самом конце программы.

Далее создадим функцию get_html которая принимает аргумент site. Переменная r обращается к requests методом get и получает чтение site. Функция возвращает r выведенную в текст.

Python:
def get_html(site):
    r = requests.get(site)
    return r.text

Далее создаём вторую функцию get_page_data для получения данных со страницы html. Эти сырые данные попадают в переменную soup. Обрабатывает данные BeautifulSoup, принимая код html. И в качестве парсера указываем 'lxml.

Python:
def get_page_data(html):
    soup = BeautifulSoup(html, 'lxml')

Добывать прокси мы будем с поэтому заходим по этому адресу, открываем инструменты разработчика кнопкой F12. Удобнее всего, на мой взгляд реализовано в ГуглХром. Кому-то нравится в лисе, но это не так важно. Наша задача определить в исходном коде, где находятся нужные нам строки.

В исходнике мы видим что proxy заключены в таблицу, и у этой таблицы есть id 'theProxyList'

table.png


Внутри таблицы находится тег tbody

tboby.png


А внутри тега tbody есть теги tr при наведении на которые выделяется строка (линия) с нужными данными.

tr.png


Значит чтобы спарсить эту линию добавим в нашу функцию такую строку

Python:
line = soup.find('table', id='theProxyList').find('tbody').find_all('tr')
# Ищем с помощью find 'tbody' и с помощью find_all все 'tr'

Прекрасно, начало есть. Но это ещё не всё друзья, не так быстро дела делаются :)
В функцию get_page_data теперь добавим цикл, в котором мы будем обращаться по индексу к нужным данным. Дата и время проверки не будем парсить, так как это не такая нужная информация. Остальное преобразуем в текст с помощью text

Python:
for tr in line:
        td = tr.find_all('td')
        ip = td[1].text
        port = td[2].text
        country = td[3].text
        anonym = td[4].text
        types = td[5].text
        time = td[6].text

Теперь полученные данные запишем в словарь

Python:
       data = {'ip': ip,
                'Порт': port,
                'Страна': country,
                'Анонимность': anonym,
                'Тип': types,
                'Время отклика': time}

И выведем на печать print(data).

Осталось написать главную функцию, в ней мы принимаем url сайта, и по цепочке идёт обработка предыдущими функциями.


Python:
def main():
    url = 'http://foxtools.ru/Proxy'
    get_page_data(get_html(url))

Наконец-то запускаем скрипт и видим следующую картину:

tdd.png


Данные успешно спарсились, но картинка не такая как хотелось бы. Присутствует куча мусора в виде \xa0, \r\n, \r\n\t\t\t\t\t
Значит будем от него избавляться. С помощью replace удалим всё лишнее, и для этого поправим наш цикл


Python:
    for tr in line:
        td = tr.find_all('td')
        ip = td[1].text
        port = td[2].text
        country = td[3].text.replace('\xa0', '')
        anonym = td[4].text.replace('\r\n        ', '')
        types = td[5].text.replace('\r\n\t\t\t\t\t', '').replace('\r\n        ', '')
        time = td[6].text

Запускаем по новой - другое дело, уже всё читабельно.

tddd.png


Python:
import requests
from bs4 import BeautifulSoup


def get_html(site):
    r = requests.get(site)
    return r.text


def get_page_data(html):
    soup = BeautifulSoup(html, 'lxml')
    line = soup.find('table', id='theProxyList').find('tbody').find_all('tr')

    for tr in line:
        td = tr.find_all('td')
        ip = td[1].text
        port = td[2].text
        country = td[3].text.replace('\xa0', '')
        anonym = td[4].text.replace('\r\n        ', '')
        types = td[5].text.replace('\r\n\t\t\t\t\t', '').replace('\r\n        ', '')
        time = td[6].text

        data = {'ip': ip,
                'Порт': port,
                'Страна': country,
                'Анонимность': anonym,
                'Тип': types,
                'Время отклика': time}

        print(data)


def main():
    url = 'http://foxtools.ru/Proxy'
    get_page_data(get_html(url))


if __name__ == '__main__':
    main()


Ну вот мы и научились некоторым приёмам парсинга страниц. В следующей статье мы продолжим работать с этим парсером и добавим функционал.
До встречи! ;)
 
Последнее редактирование:

Cop999

New member
06.11.2020
2
0
BIT
0
Переписал парсер под этот сайт. Учите Python, 10 минут заняло. Работает в Windows и Linux.


Python:
import requests
from bs4 import BeautifulSoup


def get_html(site):
    r = requests.get(site)
    return r.text


def get_page_data(html):
    soup = BeautifulSoup(html, 'html.parser')
    line = soup.find('table', {'class': 'htable proxylist'}).find('tbody').find_all('tr')

    for tr in line:
        td = tr.find_all('td')
        proxy = td[0].text
        types = td[1].text
        country = td[2].text
        last_checked = td[3].text

        data = {'Proxy': proxy,
                'Type': types,
                'Country': country,
                'Last Checked': last_checked
                }

        print(str(data)[1:-1])


def main():
    url = 'https://www.ip-adress.com/proxy-list'
    get_page_data(get_html(url))


if __name__ == '__main__':
    main()
Благодарю вас! В файл он не сохраняет, сам допишу. Спасибо.
 

KDST

New member
13.11.2020
1
0
BIT
0
Переписал парсер под этот сайт. Учите Python, 10 минут заняло. Работает в Windows и Linux.


Python:
import requests
from bs4 import BeautifulSoup

.....

Спасибо за код!
А как правильно добавить условие, например чтоб считывать только если country = 'United States' ?
 

explorer

Platinum
05.08.2018
1 080
2 475
BIT
0
А как правильно добавить условие, например чтоб считывать только если country = 'United States' ?

Это легко:


Python:
import requests
from bs4 import BeautifulSoup


def get_html(site):
    r = requests.get(site)
    return r.text


def get_page_data(html):
    soup = BeautifulSoup(html, 'html.parser')
    line = soup.find('table', {'class': 'htable proxylist'}).find('tbody').find_all('tr')

    for tr in line:
        td = tr.find_all('td')
        proxy = td[0].text
        types = td[1].text
        country = td[2].text
        last_checked = td[3].text

        data = {'Proxy': proxy,
                'Type': types,
                'Country': country,
                'Last Checked': last_checked
                }
        if 'United States' in td[2].text:
            print(str(data)[1:-1])


def main():
    url = 'https://www.ip-adress.com/proxy-list'
    get_page_data(get_html(url))


if __name__ == '__main__':
    main()
 
  • Нравится
Реакции: KDST

gydman

New member
13.02.2020
2
0
BIT
0
Просьба к Explorer’y...
Ты не мог бы написать пример парсера, которые уже работает через прокси (через те что награбили) + автозамена user-agenta
 

explorer

Platinum
05.08.2018
1 080
2 475
BIT
0
Просьба к Explorer’y...
Ты не мог бы написать пример парсера, которые уже работает через прокси (через те что награбили) + автозамена user-agenta
Для смены юзерагентов есть уже готовая библиотека
И прежде чем использовать награбленные прокси, их нужно чекать на валидность, так как халявные прокси очень быстро имеют свойства умирать. Используете библиотеку проверяете ответ сервера, если сервер ответил кодом 200, значит прокси работает. Если работает, то используем прокси, если нет, то пропускаем и проверяем следующий.

Использовать прокси в коде просто:
headers ={здесь постоянный или рандомный юзер-агент пишется}
proxies = {"https": " "}
здесь указывает протокол и адрес
page = requests.get(headers=headers, proxies=proxies) запрос через прокси и юзерагента
 
  • Нравится
Реакции: gydman

gydman

New member
13.02.2020
2
0
BIT
0
Для смены юзерагентов есть уже готовая библиотека
И прежде чем использовать награбленные прокси, их нужно чекать на валидность, так как халявные прокси очень быстро имеют свойства умирать. Используете библиотеку проверяете ответ сервера, если сервер ответил кодом 200, значит прокси работает. Если работает, то используем прокси, если нет, то пропускаем и проверяем следующий.

Использовать прокси в коде просто:
headers ={здесь постоянный или рандомный юзер-агент пишется}
proxies = {"https": " "}
здесь указывает протокол и адрес
page = requests.get(headers=headers, proxies=proxies) запрос через прокси и юзерагента
Благодарю
 

Je3mboo

One Level
02.12.2021
2
1
BIT
0
Всем привет.
Получаю вот такое.
line 12, in get_page_data
line = soup.find('table', {'class': 'htable proxylist'}).find('tbody').find_all('tr')
AttributeError: 'NoneType' object has no attribute 'find'
Переписал парсер под этот сайт. Учите Python, 10 минут заняло. Работает в Windows и Linux.


Python:
import requests
from bs4 import BeautifulSoup


def get_html(site):
    r = requests.get(site)
    return r.text


def get_page_data(html):
    soup = BeautifulSoup(html, 'html.parser')
    line = soup.find('table', {'class': 'htable proxylist'}).find('tbody').find_all('tr')

    for tr in line:
        td = tr.find_all('td')
        proxy = td[0].text
        types = td[1].text
        country = td[2].text
        last_checked = td[3].text

        data = {'Proxy': proxy,
                'Type': types,
                'Country': country,
                'Last Checked': last_checked
                }

        print(str(data)[1:-1])


def main():
    url = 'https://www.ip-adress.com/proxy-list'
    get_page_data(get_html(url))


if __name__ == '__main__':
    main()
И ваш код не исправил эту ошибку.

Не бейте сильно, только учусь ))
 

explorer

Platinum
05.08.2018
1 080
2 475
BIT
0
Названия тегов на сайте я вижу по вашему скрину сменились, значит код нужно править, старый не актуален.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!