Всем доброго дня! Сегодня покажу вам один из способов получить данные с web-сайта.
А загрузим мы объявления с Telegram паблика Dart Jobs при помощи Python библиотек BeautifulSoup и Requests. Давайте приступим!
Структура проекта
Для начала создадим два файла main.py и scraper.py, поместив в директорию проекта под названием web_scraping. Также вы можете создать виртуальное окружение, чтобы зависимости проекта устанавливались не глобально, а локально. Подробнее про можно почитать тут.
Установка зависимостей
Нам понадобятся:
- Requests. Устанавливается командой pip install requests.
- BeautifulSoup. Устанавливается командой pip install beautifulsoup4.
scaper.py
Чтобы воспользоваться нашими библиотеками, их нужно импортировать.
import requests
from bs4 import BeautifulSoup
from datetime import datetime
Создадим функцию, принимающую адрес страницы и возвращающую массив из вакансий и времени их добавления.
def scrape_vacancies(url):
page = requests.get(url)
soup = BeautifulSoup(page.content, "parser.html")
Получаем html код страницы и помещаем в page, создаем экземпляр класса BeautifulSoup, являющейся структурой данных обработанного HTML документа, который мы получили с помощью requests.get(url).
Затем нам нужно достать из всей этой каши то, что нам нужно. Как же это сделать? Правильно, нужно проанализировать HTML код сайта и найти блоки, в которых содержится текст постов. Сделаем это с помощью инструментов разработчика браузера.
Наведя мышкой на текст с легкостью находим нужный нам div – это tgme_widget_message_text.
У BeautifulSoup есть замечательный метод find_all(), с помощью которого можно вычленить все нужные div'ы из страницы.
vacancies = soup.find_all("div", { 'class' :"tgme_widget_message_text"})
times = soup.find_all('time')
Если вывести в консоль vacancies и times, то увидим, что find_all возвращает список нужных <div>'ов и <time>.
Обратите внимание на то, что у нас в массивах – это HTML теги. Как же нам извлечь из них текст? У BeautifulSoup и на этот счет есть решение. Чтобы получить весь текст из div, достаточно для каждого элемента список применить get_text().
vacancies = [vacancy.get_text() for vacancy in vacancies]
А чтобы получить время нужно пройтись по списку times:
times = [time['datetime'] for time in times]
Заметьте, что дата лежит не в очень удобной и наглядной форме. Поэтому воспользуемся datetime.strptime(), чтобы привести в более приятный читаемый вид типа Год-месяц-день час:минута:секунда.
times = [datetime.strptime(timeTag[0:19],"%Y-%m-%dT%H:%M:%S") for timeTag in times]
Соберем всё вместе:
import requests
from bs4 import BeautifulSoup
from datetime import datetime
def scrape_vacancies(url):
page = requests.get(url)
soup = BeautifulSoup(page.content, "html.parser")
vacancies = soup.find_all('div', { 'class' :'tgme_widget_message_text'})
vacancies = [vacancyDiv.get_text() for vacancyDiv in vacancies]
times = soup.find_all('time')
times = [timeTag['datetime'] for timeTag in times]
times = [datetime.strptime(timeTag[0:19],'%Y-%m-%dT%H:%M:%S') for
timeTag in times]
return {
'vacancies': vacancies,
'times': times
}
Приступим к файлу main.py, в котором мы воспользуемся уже написанной функцией и запишем результат в CSV файл.
Импортируем scraper.py и библиотеку csv:
import scraper
import csv
Вызовем нашу функцию scrape_vacancies() и поместим ее в переменную result. Из result вытащим vacancies и times.
result = scraper.scrape_vacancies('https://t.me/s/dartlang_jobs')
vacancies = result['vacancies']
times = result['times']
Теперь осталось создать CSV файл и записать туда наши полученные данные.
with open("vacancies.csv", "wt", encoding='utf-8') as file:
writer = csv.writer(file)
writer.writerow(["Описание вакансии", 'Дата добавления'])
for i in range(len(vacancies)):
writer.writerow([vacancies[i], times[i]])
file.close()
Вводим python3 main.py в терминал из дериктории проекта и вуаля! Создался новый файл.
А внутри него наши вакансии и даты их публикаций.
Спасибо за то, что вы дочитали до конца. Надеюсь, что материал был доступно объяснен. Если остались вопросы или замечания, буду рад видеть ваши комментарии.