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

от автора

Здраствуйте, Хабровчане! Давно было желание написать статейку, но никак не осмеливался.
В моей серии постов будет описан мой путь от 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. Если будет какой-либо фидбек, то следующая статейка не заставит себя ждать


ссылка на оригинал статьи https://habr.com/ru/post/482340/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *