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

в 15:19, , рубрики: bs4, parser, python, requests

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

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

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

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 + 'nn')

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

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

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

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

P.S. Если будет какой-либо фидбек, то следующая статейка не заставит себя ждать

Автор: Krau5

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js