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

Пишем парсер на Python за 5 минут

Уровень сложностиПростой

В данной статье мы рассмотрим, как парсить сайты быстро и эффективно при помощи нового инструмента LxmlSoup. Библиотека является аналогом популярной BeautifuulSoup, повторяющий её синтаксис. Что касается скорости, LxmlSoup превосходит BeautifulSoup в 5 раз, за счёт библиотеки lxml под капотом. Мы будем парсить сайт который являлся моей первой задачей - Sunlight. Тогда я ещё мало что понимал в программировании и парсинге, зато было море желания научиться этому полезному навыку. Итак, поехали!

Пример скорости библиотек

0.020386695861816406 - LxmlSoup
0.10153651237487793 - BeautifulSoup

Начало парсинга

Для начала импортируем библиотеки requests и LxmlSoup. Requests используется для получения html кода сайта, в котором находится вся нужная информация для извлечения.

from LxmlSoup import LxmlSoup
import requests

После сделаем GET запрос к сайту с целью получения html кода.

html = requests.get('https://sunlight.net/catalog').text

Далее создаём экземпляр объекта LxmlSoup в который передаём переменную html. Это нужно, так как LxmlSoup является классом хранящим в себе нужные нам методы для извлечения информации из html кода.

soup = LxmlSoup(html)

Теперь обратим внимание на структуру html. Для того чтобы извлечь ссылку на товар нужно за что-то зацепиться в коде сайта. В данном случае мы можем сделать это за тэг элемента и его класс.

В данном случае тэг является "a", а класс - "cl-item-link js-cl-item-link js-cl-item-root-link"
В данном случае тэг является "a", а класс - "cl-item-link js-cl-item-link js-cl-item-root-link"

Также нужно применить метод .get в котором мы передаем строку "href", для извлечения содержимого переменной href.

links = soup.find_all('a', class_='cl-item-link js-cl-item-link js-cl-item-root-link')

Теперь пройдемся циклом по полученным элементам и извлечем их url.

for link in links:
    url = link.get("href")

Наконец получим html блок с ценой и наименованием товара, которые извлечём с помощью метода .text() и красиво выведем все имеющееся в терминал.

for i, link in enumerate(links):
    url = link.get("href")  # получаем ссылку товара
    name = link.text()  # извлекаем наименование из блока со ссылкой
    price = soup.find_all("div", class_="cl-item-info-price-discount")[i].text()  # извлекаем цену
    print(i)
    print(f"Url - {url}")
    print(f"Name - {name}")
    print(f"Price - {price}\n")

Вот полный код получившегося парсера:

from LxmlSoup import LxmlSoup
import requests

html = requests.get('https://sunlight.net/catalog').text  # получаем html код сайта
soup = LxmlSoup(html)  # создаём экземпляр класса LxmlSoup

links = soup.find_all('a', class_='cl-item-link js-cl-item-link js-cl-item-root-link')  # получаем список ссылок и наименований
for i, link in enumerate(links):
    url = link.get("href")  # получаем ссылку товара
    name = link.text()  # извлекаем наименование из блока со ссылкой
    price = soup.find_all("div", class_="cl-item-info-price-discount")[i].text()  # извлекаем цену
    print(i)
    print(f"Url - {url}")
    print(f"Name - {name}")
    print(f"Price - {price}\n")

На этом всё. Вы можете записать данные в файлы и использовать их для своих целей. Буду рад комментариям и замечаниям. До новых встреч!

Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.