Что такое парсинг?
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀Источник:Парсинг (Parsing) – это принятое в информатике определение синтаксического анализа. Для этого создается математическая модель сравнения лексем с формальной грамматикой, описанная одним из языков программирования. Например, PHP, Perl, Ruby, Python.
Когда человек читает, то, с точки зрения науки филологии, он совершает синтаксический анализ, сравнивая увиденные на бумаге слова (лексемы) с теми, что есть в его словарном запасе (формальной грамматикой).
Программа (скрипт), дающая возможность компьютеру «читать» – сравнивать предложенные слова с имеющимися во Всемирной сети, называется парсером. Сфера применения таких программ очень широка, но все они работают практически по одному алгоритму.
Ссылка скрыта от гостей
План действий
Сегодня я вам расскажу как правильно парсить данные с помощью языка Python, и будем мы парсить именно codeby ресурсы.
Если зайти на страницу ресурсов:
то мы увидим обычные ресурсы, которые видит любой пользователь Codeby (парсинг контента для авторизованных пользователей я сделаю позже), а сейчас мы должны спарсить эти ресурсы, что именно мы будем получать с сайта?
Мы должны спарсить этот блок, включая: название ресурса, автор ресурса, дата создания ресурса и так же описание ресурса ("Исходник в векторе, png и jpg"), ну и конечно же после этого мы должны всё это экспортировать в CSV файле.
Надеюсь вы поняли, приступим к коду.
Пишем парсер
Перед написанием кода нужно установить 3 библиотеки - requests, csv, bs4
установка библиотеки requests
pip install requests
установка библиотеки BeautifulSoup(bs4)
pip install bs4
установка библиотеки Csv
pip install csv
●︎ requests - нужен для запросов, обращение к сайту(codeby.net);
●︎ beautifulSoup - нужен для парсинга, а именно для нас парсинг блоков;
●︎ csv - нужен для порядка данных, таблица.
После установки библиотек создадим несколько библиотек данных Codeby:
Python:
import requests
from bs4 import BeautifulSoup
import csv
CSV = 'resources.csv' # создания csv файла после запуска парсинга (можете указать путь)
HOST = "https://codeby.net/" # хост
URL = "https://codeby.net/resources/categories/brending-codeby.11/" # страница где мы именно будем парсить\
pages = requests.get(URL) # передаем наш URL ссылку к pages'y
первые три строчки для импортирования, переменная CSV это путь создания csv файла (таблица), в нашем случае он создастся в текущем каталоге, где находится python файл;
переменная HOST хранит ссылку на сайт, в нашем случае codeby;
переменная URL хранит ссылку страницы где мы будем парсить;
переменная pages хранит тот самый URL в качестве requests, без этого у вас не получится подключиться к этой странице.
После того как мы это сделали, нам нужны заголовки, а точнее юзер-агент и accept, их указывать обязательно не нужно, но без них некоторые сайты блокируют ваш IP, так что в случае такой ситуации рекомендуется это сделать.
Нам нужны User-agent и Accept, где их достать? Заходим на сайт где ресурсы кодебай (не приватные), дальше открываем код элемента, и нажимаем на Netwrok, не закрывая окна обновляем страницу, здесь у нас появятся вот эти фильтры:
где указано стрелочками нажимаем, и дальше откроется окошко с данными, но нам нужны именно User-Agent и Accept:
сразу копируем.
где указано стрелочками нажимаем, и дальше откроется окошко с данными, но нам нужны именно User-Agent и Accept:
сразу копируем.
А теперь нам надо эти данные впихнуть в словаре, для этого в питоне нужно сделать словарь:
Python:
HEADERS = {
"accept": "ext/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8",
"user-agent": "Mozilla/5.0 (X11; Linux x86_64; rv:100.0) Gecko/20100101 Firefox/100.0"
}
вот и всё, словарь заполнен, переходим к функциям.
Создаем функцию get_html()
Данная функция предназначена для запроса к сайту, использовании заголовков (HEADERS) и параметров, давайте напишем эту функцию:
Python:
# подключение к странице
def get_html(url, params=''):
r = requests.get(url, headers=HEADERS, params=params)
return r
get_html принимает два аргумента url, params. Аргумент url принимает саму ссылку. А вот params уже не так важен. Он нужен, если на сайте будут какие-то параметры, типа: codeby.net...?page. Так как на странице ресурсов отсутствуют такие параметры, то аргумент вы можете просто оставить пустым. В переменной r уже происходит GET-запрос к сайту с помощью библиотеки requests, где мы передаем headers, url и params. Затем возвращаем ответ c помощью return.
Создаем функцию get_content()
Вот и дошли до функции, которая будет отвечать за парсинг. Давайте её напишем:
Python:
# полученные html элементы: парсим с bs4
def get_content(html):
soup = BeautifulSoup(pages.text, 'html.parser')
items = soup.find_all("div", class_="structItem")
resources = [] # место где добавляются ресурсы
Все блоки имеют div элементы, а так же класс StructItem (скопировать весь класс необязательно). Теперь у нас будет доступ ко всем блокам.
В списке resources уже будут внутренние блоки, а именно: название ресурса, дата создания ресурса, автор ресурса и описание, для этого сделаем небольшой цикл for:
Python:
# цикл: перебираем все данные ресурса включая:(Название ресурса, автор, дата создание)
for item in items:
resources.append(
{
"title":item.find("div", class_="structItem-title").get_text(), # название ресурса
"author": item.find("a", class_="username").get_text(), # автор ресурса
"time": item.find("time", class_="u-dt").get_text(), # дата создание ресурса
"desc": item.find("div", class_="structItem-resourceTagLine").get_text() # описание ресурса
}
)
return resources
Здесь создаем цикл, который перебирает и добавляет все данные уже в список resources с помощью функции append():
Похожие блоки включают в себя время создания ресурса, его автора и т.п. Я думаю, что сделать это будет не так уж и сложно.
Похожие блоки включают в себя время создания ресурса, его автора и т.п. Я думаю, что сделать это будет не так уж и сложно.
Вот и всё, мы закончили с парсингом (наконец-то), а теперь сделаем функцию, которая всё это сохранит в CSV-файл,
Создаем функцию save_documents_csv()
Эта функция, которая будет сохранять все наши данные в CSV-файл. Лет'с гоу:
Python:
def save_documents_csv(items, path):
with open(path, "w", newline='') as file:
writer = csv.writer(file, delimiter=";")
writer.writerow(['Название ресурсов', "Автор ресурсов", "Дата создание ресурсов", "Описание"])
resources = []
for item in items:
writer.writerow([item['title'], item["author"], item["time"], item["desc"]])
Делаем режим для записи файла (w - write), затем с помощью writerow создаем блоки, где каждый блок будет иметь соответствующие данные. Например, в ключе title хранится значение об авторе ресурса.
Создаем функцию parser()
Это последняя функция, которая нужна для запуска парсинга, вывода и сохранении в csv файле)
Код функции:
Python:
def parser():
html = get_html(URL)
if html.status_code == 200:
resource = []
resource.extend(get_content(html.text))
save_documents_csv(resource, CSV)
#print(get_content(html))
#save_documents_csv(CSV)
parser()
Переменная html хранит исходный код страницы. С помощью условия if html.status_code == 200: мы проверяем, что статус ответа от сервера равен 200(успешное подключение), то у нас запустится парсинг. Функция save_documents_csv сохранит эти данные в CSV-файле.
Вот и всё!
Весь код
Python:
import requests # нужен запросы, обращаться сайт, статус и т.п
from bs4 import BeautifulSoup # парсинг, собрирать данные и многое другое
import csv # таблица данных, лучше чем в терминале))
# Resources [https://codeby.net/resources/categories/brending-codeby.11/]
# Domain [https://codeby.net/]
# Block Resource(test): DIV structItem structItem--resource is-prefix2 js-inlineModContainer js-resourceListItem-896
# All block resources: structItem-cell structItem-cell--icon structItem-cell--iconExpanded
CSV = 'resources.csv'
HOST = "https://codeby.net/"
URL = "https://codeby.net/resources/categories/brending-codeby.11/"
pages = requests.get(URL)
# User-Agent Mozilla/5.0 (X11; Linux x86_64; rv:100.0) Gecko/20100101 Firefox/100.0
# ext/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
HEADERS = {
"accept": "ext/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8",
"user-agent": "Mozilla/5.0 (X11; Linux x86_64; rv:100.0) Gecko/20100101 Firefox/100.0"
}
# подключение к странице
def get_html(url, params=''):
r = requests.get(url, headers=HEADERS, params=params)
return r
# полученные html элементы: парсим с bs4
def get_content(html):
soup = BeautifulSoup(pages.text, 'html.parser')
items = soup.find_all("div", class_="structItem")
resources = [] # место где добавляются ресурсы
# цикл: перебираем все данные ресурса включая:(Название ресурса, автор, дата создание)
for item in items:
resources.append(
{
"title":item.find("div", class_="structItem-title").get_text(), # название ресурса
"author": item.find("a", class_="username").get_text(), # автор ресурса
"time": item.find("time", class_="u-dt").get_text(), # дата создание ресурса
"desc": item.find("div", class_="structItem-resourceTagLine").get_text() # описание ресурса
}
)
return resources
def save_documents_csv(items, path):
with open(path, "w", newline='') as file:
writer = csv.writer(file, delimiter=";")
writer.writerow(['Название ресурсов', "Автор ресурсов", "Дата создание ресурсов", "Описание"])
resources = []
for item in items:
writer.writerow([item['title'], item["author"], item["time"], item["desc"]])
def parser():
html = get_html(URL)
if html.status_code == 200:
resource = []
resource.extend(get_content(html.text))
save_documents_csv(resource, CSV)
#print(get_content(html))
#save_documents_csv(CSV)
parser()
Результат работы парсинга:
Результат кода парсинга в CSV формате. Всё успешно работает.
Важные ссылки
Документация по библиотеке requests -
Ссылка скрыта от гостей
Документация по библиотеке BeautifulSoup -
Ссылка скрыта от гостей
Уроки по библиотеке csv -
Ссылка скрыта от гостей
Нашли ошибку в тексте или коде? Срочно сообщите!
Последнее редактирование модератором: