Как стать автором
Обновить

От Junior'a до Middle'a: Парсер

Время на прочтение2 мин
Количество просмотров11K
Здраствуйте, Хабровчане! Давно было желание написать статейку, но никак не осмеливался.
В моей серии постов будет описан мой путь от Junior'a до Middle'a, а потом возможно даже до Senior'a. Программировать будем на Python.

P.S. Документация к некоторым малоизвестным библиотекам будет прикреплена в конце.

Кратко о себе: Python начал изучать два года назад, особых продвижений не было.
Разочарованием стали сами основы, поскольку учил я их полтора года. Сейчас же углубленно изучаю язык, понимаю его структуру и как все происходит. В следующих статьях буду выкладывать код, использую все новые, и новые библиотеки, а их как вы знаете у питона очень много :)

С чего бы начать? Пару месяцев назад я написал свой первый парсер. Оказалось, что писать парсеры довольно просто и на них даже можно зарабатывать. Пока что покажу пару примеров, используя стек из bs4 + requests. Парсить будем наш любимый Хабр.

#для начала импортируем нужные нам модули
from bs4 import BeautifulSoup as bs
import requests
from fake_useragent import UserAgent

Не уверен, что все знакомы с библиотекой fake_useragent. Довольно удобна для парсинга, создает фейк user-agent'a.

ua = UserAgent()
headers = {'accept': '*/*', 'user-agent': ua.firefox}

Это следующий небольшой блок нашего кода. В первой строке, мы создали переменную ua, которая использует методы класса UserAgent. Во второй строке, мы создали словарь, который в будущем поможет нам при парсинге.

Теперь создаем саму функцию для парсинга.

def without_post(url, headers):
	response = requests.get(url, headers=headers)
	if response.status_code == 200:
		soup = bs(response.text, 'html.parser')
		links = {}
		for i in soup.find_all('a', {'class': 'post__title_link'}):
			links.update({i.text: i.get('href')})
		return links
	else:
		print("Connection Error")

Данная функция будет парсить ссылку, которую мы укажем на наличие тега с классом «post__title_link».

Самый простой способ сохранить данные — сохранить их в файл. Так и сделаем.

url = "https://habr.com/ru/all/"
links = without_post(url, headers)
with open('parsed.txt', 'w') as f_obj:
	for name, href in links.items():
		f_obj.write(name + ':\n' + href + '\n\n')

В конце получаем файл, в котором записаны названия и ссылки постов, которые мы собрали с первой страницы.

Исходный(полный) код, только уже без комментариев:

from bs4 import BeautifulSoup as bs
from fake_useragent import UserAgent
import requests

ua = UserAgent()
headers = {'accept': '*/*', 'user-agent': ua.firefox}

def without_post(url, headers):
	response = requests.get(url, headers=headers)
	if response.status_code == 200:
		soup = bs(response.text, 'html.parser')
		links = {}
		for i in soup.find_all('a', {'class': 'post__title_link'}):
			links.update({i.text: i.get('href')})
		return links
	else:
		print("Connection Error")

url = "https://habr.com/ru/all/"
links = without_post(url, headers)
with open('parsed.txt', 'w') as f_obj:
	for name, href in links.items():
		f_obj.write(name + ':\n' + href + '\n\n')

Хороший результат! Если не считать пропусков строк и комментариев, то мы уложились ровно в 20 строк. Для начала довольно-таки хорошо :)

Как и обещал, ссылки на документации использованных библиотек:

Requests: *жмяк*
bs4: *жмяк*
fake_useragent: *жмяк*

Всем спасибо за внимание! До встреч!

P.S. Если будет какой-либо фидбек, то следующая статейка не заставит себя ждать
Теги:
Хабы:
Всего голосов 18: ↑8 и ↓10+4
Комментарии29

Публикации

Истории

Работа

Data Scientist
92 вакансии
Python разработчик
189 вакансий

Ближайшие события

19 августа – 20 октября
RuCode.Финал. Чемпионат по алгоритмическому программированию и ИИ
МоскваНижний НовгородЕкатеринбургСтавропольНовосибрискКалининградПермьВладивостокЧитаКраснорскТомскИжевскПетрозаводскКазаньКурскТюменьВолгоградУфаМурманскБишкекСочиУльяновскСаратовИркутскДолгопрудныйОнлайн
3 – 18 октября
Kokoc Hackathon 2024
Онлайн
24 – 25 октября
One Day Offer для AQA Engineer и Developers
Онлайн
25 октября
Конференция по росту продуктов EGC’24
МоскваОнлайн
26 октября
ProIT Network Fest
Санкт-Петербург
7 – 8 ноября
Конференция byteoilgas_conf 2024
МоскваОнлайн
7 – 8 ноября
Конференция «Матемаркетинг»
МоскваОнлайн
15 – 16 ноября
IT-конференция Merge Skolkovo
Москва
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань