CoderCastrov logo
CoderCastrov
Питон

Изучите современные техники парсинга с использованием Python

Изучите современные техники парсинга с использованием Python
просмотров
4 мин чтение
#Питон

Парсинг всегда был табу в технологических компаниях. Мы все хотя бы раз становились жертвами парсинга.

Если вы никогда не читали о парсинге, то вначале может показаться немного сложным. Позвольте мне поделиться с вами основными концепциями парсинга.

Парсинг данных - это процесс извлечения данных с веб-сайта с использованием автоматизированного процесса. Парсинг может выполняться на практически любом языке программирования. В этой статье мы собираемся научиться парсить данные с демонстрационного веб-сайта http://books.toscrape.com/ с использованием Python. Смело парсьте этот сайт. Этот веб-сайт был разработан Scrapinghub для обучения.



Классические библиотеки для парсинга в Python

В Python есть несколько альтернатив для парсинга веб-сайтов. Самые распространенные библиотеки:

Scrapy** **- это фреймворк с открытым исходным кодом от Scrapinghub. Пауки Scrapy предназначены для загрузки HTML, парсинга и обработки данных, а также сохранения их в форматах CSV, JSON или XML.

  • Он очень хорошо интегрирован с Scrapinghub.

  • Позволяет запускать пауков периодически на их платформе.

  • Позволяет использовать селекторы XPath и CSS.

  • Так как он был разработан командой Scrapinghub, он будет поддерживаться в будущем.

Beautiful Soup - это библиотека Python для извлечения данных из файлов HTML и XML. Она работает с вашим парсером, чтобы предоставить идиоматические способы навигации, поиска и модификации дерева разбора.

  • Она не так мощна, как Scrapy, но решает 99% ваших проблем.
  • Это не полноценный фреймворк, он очень легкий.

  • Позволяет навигировать по XML- или HTML-документу.

  • Он не поддерживает селекторы XPath.

Что такое селектор?

Селектор позволяет вам получить данные после того, как вы разобрали ответ веб-сайта. Существует два типа селекторов:

  • HTML и CSS селекторы. Для получения данных мы используем HTML селекторы из DOM. Мы можем использовать HTML теги, CSS селекторы и идентификаторы HTML элементов. Этот синтаксис более читабелен.
  • XPath селекторы. XPath - это язык, который позволяет выбирать узлы XML-документа и вычислять значения из его содержимого. HTML имеет структуру, аналогичную XML, что позволяет навигировать по HTML, как если бы это был XML. Этот синтаксис не очень удобен для чтения.

Основные проблемы при парсинге современных веб-сайтов

В прошлом было обычной практикой рендерить весь HTML на сервере. Это означает, что если мы отправим запрос на веб-сайт и сохраним ответ в виде текста, вся информация уже будет находиться в HTML DOM. В этом случае мы могли бы использовать ранее показанные библиотеки для обработки этих веб-сайтов и извлечения данных.

В настоящее время современные веб-сайты обычно используют JavaScript для построения DOM на клиентской стороне. Это делает парсинг очень сложным, потому что нам нужен веб-браузер, чтобы отрисовать DOM, выполняя JavaScript веб-сайта. Пока JavaScript веб-сайта не будет выполнен, данные, которые мы хотим извлечь, не будут присутствовать в HTML.

Современный парсинг с использованием Request-HTML

Библиотеки, показанные ранее, по умолчанию не поддерживают выполнение JavaScript. Хотя Scrapy позволяет установить промежуточное программное обеспечение для отображения веб-сайтов в экземпляре chromium, эта задача может показаться немного пугающей.

Request-HTML позволяет запускать безголовый браузер и выполнять JavaScript-код веб-сайта всего лишь вызовом функции рендеринга.

Поехали!

$ pip install requests-html

Прежде всего, нам нужно установить пакет Python с помощью установщика пакетов Python. Вы можете использовать pipenv или pip.

**from** **requests_html** **import** HTMLSessionsession = HTMLSession()
response = session.get('[http://books.toscrape.com/](http://books.toscrape.com/)')

Обратите внимание, что для парсинга демонстрационного сайта нам не нужно отображать какой-либо JavaScript. Самая крутая особенность Request-HTML заключается в том, что он легко справляется с этой задачей. Если вам нужно отобразить веб-сайт для выполнения парсинга, вам нужно всего лишь вызвать функцию рендеринга. Избегайте вызова функции рендеринга, поскольку это замедлит процесс парсинга из-за накладных расходов на запуск веб-браузера для отображения веб-сайта.

response.html.render()

После выполнения запроса мы можем получить доступ к данным с помощью поддерживаемых селекторов.

from requests_html import HTMLSession
session = HTMLSession()
response = session.get('http://books.toscrape.com/')

books_elements = response.html.find('article.product_pod')

books = []
for book_element in books_elements:

    stars = None
    stars_node = book_element.find('p.star-rating', first=True)
    if stars_node and len(stars_node.attrs['class']) == 2:
        stars = stars_node.attrs['class'][1]

    url = None
    url_node = book_element.find('a', first=True)
    if url_node:
        url = url_node.attrs['href']

    title = book_element.find('h3', first=True).text

    price = book_element.find('p.price_color', first=True).text

    has_stock = (
        book_element.find('i.icon-ok', first=True) is not None
    )

    book = {
        'title': title,
        'price': price,
        'stars': stars,
        'has_stock': has_stock,
        'url': url
    }
    books.append(book)

Если вы выполните приведенный выше код, вы увидите, что мы перебираем каждый div книги, чтобы извлечь информацию. Результат сохраняется в списке словарей с именем books.

[
  {
    'has_stock': True,
    'price': '£51.77',
    'stars': 'Three',
    'title': 'A Light in the ...',
    'url': 'catalogue/a-light-in-the-attic_1000/index.html'
  },
  {
    'has_stock': True,
    'price': '£53.74',
    'stars': 'One',
    'title': 'Tipping the Velvet',
    'url': 'catalogue/tipping-the-velvet_999/index.html'
  },
   ...
  {
    'has_stock': True,
    'price': '£45.17',
    'stars': 'Two',
    'title': "It's Only the Himalayas",
    'url': 'catalogue/its-only-the-himalayas_981/index.html'
  }
]

Request-HTML - это проект Python Software Foundation. Не забудьте ознакомиться с их полной документацией на Github!

Вот и все на сегодня. Не забудьте поаплодировать и поделиться, чтобы получить больше статей о технологиях, подобных этой!