В данной статье мы рассмотрим, как парсить сайты быстро и эффективно при помощи нового инструмента 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"](https://webcf.waybackmachine.org/web/20240902222824/https://habrastorage.org/getpro/habr/upload_files/bd8/31c/efd/bd831cefd231a5ce13f307889ed14f09.png)
Также нужно применить метод .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")
На этом всё. Вы можете записать данные в файлы и использовать их для своих целей. Буду рад комментариям и замечаниям. До новых встреч!