Привет Хабр!
Сегодня я бы хотел написать об такой нише как парсинг, так-как я пристрастился к Python только благодаря тому что я люблю халяву свободные данные, а так-же и с пониманием того что данные в удобном формате это не просто куча структурированных данных это будущее. Что сейчас мы и видим в эру ИИ.
Из чего будет состоять это статья? Она будет разбита на 3 части:
-
Что такое парсинг? (Для новичков)
-
Для чего нужен парсинг? (Как на этом можно заработать, и где использовать)
-
Как вкатиться в парсинг? (DevTools, HTML, Python)
Хочу предупредить для продвинутых, что в статье я не затрону глубоко selenium, playwright, headers обходы, proxy, и иные обходы так-как я захотел написать всё простым языком, что-бы новички которые хотят поковыряться в парсинге понимали на что подписываются.
Что такое парсинг (Простыми словами)
Парсинг — это автоматизированный сбор, анализ и структурирование данных из внешних источников (чаще всего сайтов) с помощью специальных программ-парсеров
Так пишет Google при запросе парсинг, это коротко и ясно, но по моему мнению она закрывает целый спектр эмоций которое вызывает это творчество. Я считаю что парсинг это про умение думать как разработчик, как человек который проектировал сайт Backend, это про умение находить наилучшие решение, с помощью анализа, это как играть в детектива. Вот моё определение слово парсинг
Парсинг — это автоматический сбор, структурирование и фильтрация данных с поиском малейших лазеек для более качественного результата. Это умение думать как разработчик и детектив одновременно.
Для чего нужен парсинг
Вы видели сайты по продаже разной техники, инструментов, или вообще носков? Но во время более тщательного поиска находили точно такой-же товар на другом сайте, с тем же названием, описанием и даже артикулом но где цена немного ниже? Это отличный пример парсинга, в данном примере сайты являются ретрансляторами и просто выкладывают готовые данные на своём сайте по более высокой цене в надежде что их кто-то купит. Я могу это подтвердить так-как я работаю на бирже, и у меня были заказы данного характера.
Как на этом заработать?
Заработать в такой нише всё сложнее и сложнее, так-как конкуренция растёт молодые программисты как я борются за каждого покупателя. Это проблема которая может вас преследовать в начале пути, и у меня на этот счёт нет совета, или формулы. Но могу с уверенностью сказать, что если вы найдёте покупателя держите его зубами, и не отпускайте, предлагайте альтернативные решение, уступайте и поддакивайте, таким образом я смог найти пару верных покупателей которые всегда отзывчивы, и готовы идти на уступки.
Я сижу на бирже Помойка Kwork, не могу сказать что это, худшая биржа но однозначно не из самых лучших, высокие комиссии, конкуренция, и буквально рабские условия для разработчика, поэтому я предлагаю вам тут искать покупателей, но потом в будущем переманивать их на телеграмм, что-бы избавиться от комиссий.
Где можно ещё использовать?
Парсинг открывает гору возможностей до создание сайта с мангой, до обучение ИИ. Но перечислю по порядку:
-
Обучение ИИ на своём дата сете, этот вариант самый сложный, но и самый сладкий.
-
Создание собственного ТГ бота, с парсингом погоды в вашем городе и рассылкой всем пользователям.
-
Создать сайт как и говорилось в начале этого отрывка.
Вы можете увидеть пример данного проекта в моей прошлой статье
Как вкатиться в парсинг?
После моих сладких речей может показаться что парсинг это что-то сложное, но хочу вас обрадовать, парсинг прост в начале, но сложен в конце. Так-как по мере надобности будут появляться новые способы защиты, такие как: reCAPTCHA, Cloudflare.
Базовый пример парсера
import requestsfrom bs4 import BeautifulSoupresponse = requests.get("http://example.com") # Делаем запрос к сайтуsoup = BeautifulSoup(response.text, "html.parser") # Парсим страницуtitle = soup.find("h1") # ищетprint(title.text)
Поздравляю это ваш первый парсер, конечно это всего-то тестовый пример, и он скрывает за собой кучи нюансов, по типу ошибки со статусами, недоступен интернет но для первого раза сойдёт.
DevTools — друг, а не враг
Нажмите F12 на клавиатуре, что вы видите? Наверное странное поле с кучей данных, это DevTools, набор разработчика для отладки, и мы будем его использовать, для примера будем использовать мой сайт из прошлой статьи.
API — Лучший вариант из всех возможных
API — данные приходят прямо, уже в удобной форме, нужно лишь найти такие запросы
Мы видим как мы получаем данные прямо из API, из ссылки «pages?page=1&per_page=24«, это бинго! При дальнейшем анализа мы узнаём что данные возвращаются при условии что в конце есть page и per_page. Значение этих параметров и за что они отвечают нам сразу ясны, но во многих сайтах есть иные параметры что требуют более глубокого анализа.
Конечно мы не будем ручками переписывать все заголовки запроса, а просто их скопируем и засунем их в сайт, я обычно использую curlconverter по итогу получаем такую красоту
import requestsheaders = { 'Accept': 'application/json', 'Accept-Language': 'ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7,eu;q=0.6', 'Connection': 'keep-alive', 'Origin': 'http://192.168.0.50:8000', 'Referer': 'http://192.168.0.50:8000/',}params = { 'page': '1', 'per_page': '24',}response = requests.get('http://192.168.0.50:8080/api/v1/pages', params=params, headers=headers, verify=False)data = response.json()
Данный код даёт возможность полностью повторить запрос, от начало и до конца.
Голый парсинг — имеем что имеем
Если данные не приходят через fetch то придётся довольствоваться тем что нам пришло прямо в документе, для этого существует прекрасная библиотека beautifulsoup, интуитивный парсинг find, find_all. Это идеально инструмент, но в будущем рекомендуется поменять find, на select так-как они гибче, и пишутся проще.
мы видим что данные хранятся в классе «manga» с тэгом «a» как это будет выглядеть в BS4?
import requestsfrom bs4 import BeautifulSoupresponse = requests.get("http://192.168.0.50:8000") # Делаем запрос к сайтуsoup = BeautifulSoup(response.text, "html.parser") # Парсим страницуfor manga in soup.find_all("a", class_ = "manga"): print(manga.get("href"))
Мы получим только ссылки, так-как мы выводим то что в атрибуте. Это уже можно назвать парсером, и вроде-бы вопрос где тут сложность? И вы будете правы, так-как на моём сайте 0 защиты, и что было-бы если была анти бот защита?
import requestsresponse = requests.get("https://www.dns-shop.ru/")print(response.status_code)
Мы увидим 401, и не увидим наших данных, так-как сайт имеет защиту Qrator, что за гранью моего понимание, и для этого были созданы такие специальные инструменты как Selenium, playwright, и. т. д. Но о них по позже.
Заключение
Мы узнали что такое парсинг поверхностно, поняли базовые инструменты, и узнали пару новых словечек. В следующей статье хочу углубиться на тему обходов защит и использование уже готовых библиотек.
ссылка на оригинал статьи https://habr.com/ru/articles/1025760/