Pull to refresh

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

Level of difficultyEasy

В данной статье мы рассмотрим, как парсить сайты быстро и эффективно при помощи нового инструмента 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")

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

Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.