Лайфхаки

Маленькие, полезные хитрости

Пишем парсер на Python. Scrapy vs. Beautiful Soup

27.01.2023 в 03:29

Пишем парсер на Python. Scrapy vs. Beautiful Soup

В этом разделе будет дан обзор одного из самых популярных инструментов для парсинга, BeautifulSoup, и проведено его сравнение со Scrapy.

Scrapy — это Python-фреймворк, предлагающий полноценный набор инструментов и позволяющий разработчикам не думать о настройке кода.

BeautifulSoup также широко используется для веб-скрапинга. Это пакет Python для парсинга документов в форматах HTML и XML и извлечения данных из них. Он доступен для Python 2.6+ и Python 3.

Вот основные отличия между ними:

Scrapy BeautifulSoup
Функциональность
Scrapy — это самый полный набор инструментов для загрузки веб-страниц, их обработки и сохранения в файлы и базы данныхBeautifulSoup — это в принципе просто парсер HTML и XML, требующий дополнительных библиотек, таких как requests и urlib2 для открытия ссылок и сохранения результатов.
Кривая обучения
Scrapy — это движущая сила веб-сканирования, предлагающая массу способов парсинга страниц. Обучение тому, как он работает, требует много времени, но после освоения процесс сканирования превращается в одну строку кода. Потребуется время, чтобы стать экспертом в Scrapy и изучить все его особенностиBeautifulSoup относительно прост для понимания новичкам в программировании и позволяет решать маленькие задачи за короткий срок.
Скорость и нагрузка
Scrapy с легкостью выполняет крупную по объему работу. Он может сканировать несколько ссылок одновременно менее чем за минуту в зависимости от общего количества. Это происходит плавно благодаря Twister, который работает асинхронно (без блокировки)BeautifulSoup используется для простого и эффективного парсинга. Он работает медленнее Scrapy, если не использоватьmultiprocessing.
Расширяемость
Scrapy предоставляет функциональностьItem pipelines, с помощью которой можно писать функции для веб-сканера. Они будут включать инструкции о том, как робот должен проверять, удалять и сохранять данные в базу данных.Spider Contractsиспользуются для проверки парсеров, благодаря чему можно создавать как базовые, так и глубокие парсеры. Он же позволяет настраивать множество переменных: повторные попытки, перенаправление и т. д.Если проект не предполагает большого количества логики, BeautifulSoup отлично для этого подходит, но если нужна настраиваемость, например прокси, управление куки и распределение данных, то Scrapy справляется лучше.

Парсинг сайтов Python пример. Учимся парсить веб-сайты на Python + BeautifulSoup

Интернет, пожалуй, самый большой источник информации (и дезинформации) на планете. Самостоятельно обработать множество ресурсов крайне сложно и затратно по времени, но есть способы автоматизации этого процесса. Речь идут о процессе скрейпинга страницы и последующего анализа данных. При помощи этих инструментов можно автоматизировать сбор огромного количества данных. А сообщество Python создало несколько мощных инструментов для этого. Интересно? Тогда погнали!

И да. Хотя многие сайты ничего против парсеров не имеют, но есть и те, кто не одобряет сбор данных с их сайта подобным образом. Стоит это учитывать, особенно если вы планируете какой-то крупный проект на базе собираемых данных.

С сегодня я предлагаю попробовать себя в этой интересной сфере при помощи классного инструмента под названием(Красивый суп?). Название начинает иметь смысл если вы хоть раз видели HTML кашу загруженной странички.

В этом примере мы попробуем стянуть данные сначала из специального сайта для обучения парсингу. А в следующий раз я покажу как я собираю некоторые блоки данных с сайта Minecraft Wiki, где структура сайта куда менее дружелюбная.

Этот гайд я написал под вдохновением и впечатлением от подобного на сайте, так что многие моменты и примеры совпадают, но содержимое и определённые части были изменены или написаны иначе, т.к. это не перевод. Оригинал:.

Этот сайт прост и понятен. Там есть список данных, которые нам и нужно будет вытащить из загруженной странички.

Понятное дело, что обработать так можно любой сайт. Буквально все из тех, которые вы можете открыть в своём браузере. Но для разных сайтов нужен будет свой скрипт, сложность которого будет напрямую зависеть от сложности самого сайта.

Главным инструментом в браузере для вас станет Инспектор страниц. В браузерах на базе хромиума его можно запустить вот так:

Он отображает полный код загруженной странички. Из него же мы будем извлекать интересующие нас данные. Если вы выделите блоки html кода, то при помощи подсветки легко сможете понять, что за что отвечает.

Ладно, на сайт посмотрели. Теперь перейдём в редактор.

Пишем код парсера для Fake Python

Для работы нам нужно будет несколько библиотек: requests и beautifulsoup4 . Их устанавливаем через терминал при помощи команд:

и

После чего пишем следующий код:

Тут мы импортируем новые библиотеки. URL это строка, она содержит ссылку на сайт. При помощи requests.get мы совершаем запрос к веб страничке. Сама функция возвращает ответ от сервера (200, 404 и т.д.), а page.content предоставляет нам полный код загруженной страницы. Тот же код, который мы видели в инспекторе.

Парсинг сайтов Python это. Введение

Представьте, что мы хотим произвести скрапинг платформы, содержащей общедоступные объявления о недвижимости. Мы хотим получить цену недвижимости, ее адрес, расстояние, название станции и ближайший до нее тип транспорта для того, чтобы узнать, как цены на недвижимость распределяются в зависимости от доступности общественного транспорта в конкретном городе.

Предположим, что запрос приведет к странице результатов, которая выглядит следующим образом:
Как только мы узнаем, в каких элементах сайта хранятся необходимые данные, нам нужно придумать логику скрапинга, которая позволит нам получить всю нужную информацию из каждого объявления.
Нам предстоит ответить на следующие вопросы:

  1. Как получить одну точку данных для одного свойства (например данные из тега price в первом объявлении)?
  2. Как получить все точки данных для одного свойства со всей страницы (например все теги price с одной страницы)?
  3. Как получить все точки данных для одного свойства всех страниц с результатами (например все теги price со всех страниц с результатами)?
  4. Как устранить несоответствие, когда данные могут быть разных типов (например, есть некоторые объявления, в которых в поле цены указана цена по запросу. В конечном итоге у нас будет столбец, состоящий из числовых и строковых значений, что в нашем случае не позволяет провести анализ)?

Парсинг на Python. Инструменты


Для отправки http-запросов есть немало python-библиотек, наиболее известные urllib/urllib2 и Requests. На мой вкусудобнее и лаконичнее, так что, буду использовать ее.Также необходимо выбрать библиотеку для парсинга html, небольшой research дает следующие варианты:
  • re
    Регулярные выражения, конечно, нам пригодятся, но использовать только их, на мой взгляд, слишком хардкорный путь, и они немного не для этого . Были придуманы более удобные инструменты для разбора html, так что перейдем к ним.
  • BeatifulSoup , lxml
    Это две наиболее популярные библиотеки для парсинга html и выбор одной из них, скорее, обусловлен личными предпочтениями. Более того, эти библиотеки тесно переплелись: BeautifulSoup стал использовать lxml в качестве внутреннего парсера для ускорения, а в lxml был добавлен модуль soupparser. Подробнее про плюсы и минусы этих библиотек можно почитать в обсуждении . Для сравнения подходов я буду парсить данные с помощью BeautifulSoup и используя XPath селекторы в модуле lxml.html.
  • scrapy
    Это уже не просто библиотека, а целый open-source framework для получения данных с веб-страниц. В нем есть множество полезных функций: асинхронные запросы, возможность использовать XPath и CSS селекторы для обработки данных, удобная работа с кодировками и многое другое (подробнее можно почитать тут ). Если бы моя задача была не разовой выгрузкой, а production процессом, то я бы выбрала его. В текущей постановке это overkill.

Парсинг сайтов Python. Почему и зачем использовать веб-парсинг?

Необработанные данные можно использовать в различных областях. Давайте посмотрим на использование веб-скрапинга:

  • Динамический мониторинг цен

Широко используется для сбора данных с нескольких интернет-магазинов, сравнения цен на товары и принятия выгодных ценовых решений. Мониторинг цен с использованием данных, переданных через Интернет, дает компаниям возможность узнать о состоянии рынка и способствует динамическому ценообразованию. Это гарантирует компаниям, что они всегда превосходят других.

  • Исследования рынка

Web Scrapping идеально подходит для анализа рыночных тенденций. Это понимание конкретного рынка. Крупной организации требуется большой объем данных, и сбор данных обеспечивает данные с гарантированным уровнем надежности и точности.

  • Сбор электронной почты

Многие компании используют личные данные электронной почты для электронного маркетинга. Они могут ориентироваться на конкретную аудиторию для своего маркетинга.

  • Новости и мониторинг контента

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

  • Тренды в социальных сетях

Web Scrapping играет важную роль в извлечении данных с веб-сайтов социальных сетей, таких как Twitter, Facebook и Instagram, для поиска актуальных тем.

  • Исследования и разработки

Большой набор данных, таких как общая информация, статистика и температура, удаляется с веб-сайтов, который анализируется и используется для проведения опросов или исследований и разработок.

Парсинг многостраничных сайтов Python. Парсинг сайтов при помощи Python -4

UPD: Ввиду бурной реакции обозначу в начале — это просто обзорный tutorial возможного быстрого парсинга страниц)

Объем данных, доступных в Интернете, постоянно растет как по количеству, так и по форме. И эти данные очень часто бывают нужны для обучения ИИ. Большая часть этих данных доступна через API, но в то же время многие ценные данные по-прежнему доступны только через парсинг.

В данном руководстве будут рассмотрены несколько вариантов получения данных.

Для примера данных возьмем списокПосмотрим исходный код страницы, чтобы понимать откуда мы будем извлекать данные

Как видно — все события выводятся в слое —

отдельное событие выводится в слое —

и каждое событие имеет определенные атрибуты, которые мы и будем собирать

  • Тип

  • Заголовок

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

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

    Для начала установим библиотеки

    $ pip install requests

    $ pip install bs4

    После установки приступим непосредственно к парсингу

    Начнем с подключения библиотеки Requests и проверки правильно ли отрабатывается запрос

    import requests url = 'https://runet-id.com/events/' requests.get(url)

    Получим вывод в консоли:

    >

    Значит все верно сделано и страница получена.

    Простой парсер на Python. Анализ HTML и извлечение данных

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

    В Python есть две библиотеки, которые могут помочь нам с синтаксическим анализом HTML: BeautifulSoup и Lxml . Lxml – это более низкоуровневый фреймворк, чем BeautifulSoup, и мы можем использовать Lxml в качестве бэкэнда в BeautifulSoup, поэтому для простых целей синтаксического анализа HTML BeautifulSoup будет предпочтительной библиотекой.

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

    Но, к счастью, нам не придется открывать исходный код в редакторе и вручную понимать и соотносить каждый элемент HTML с соответствующими данными на отображаемой странице. Большинство браузеров предлагают инспектор, например инструменты разработчика Chrome, который позволяет нам быстро просматривать HTML-код любого элемента, просто щелкнув по нему.

    Для этого в Chrome откройте веб-страницу, затем щелкните правой кнопкой мыши данные, которые вы хотите очистить, и выберите «Проверить». В Firefox эта опция называется «Исследовать» или Inspect.

    Вы заметите, что в нижней части окна Chrome открывается панель, содержащая исходный код элемента, на котором вы щелкнули. Просмотрите исходный код, чтобы получить представление о том, как данные, которые мы хотим очистить, структурированы в коде HTML.

    Как вы можете понять после небольшого изучения, каждая цитата содержится в div с атрибутом class = “quote”. Внутри этого div текст цитаты находится в диапазоне с class = “text”, а имя автора находится в небольшом теге с class = “author”. Эта информация потребуется, когда мы фактически приступим к синтаксическому анализу HTML и извлечению наших данных.

    Парсинг youtube Python. Вступление


    Чтобы подгрузить данные контента на ютубе, обычно используют либо Selenium, либо YouTube API. Однако везде есть свои минусы.
    1. Selenium слишком медленный для парсинга. Представьте себе парсинг плейлиста из ~1000 роликов селениумом.
    2. YouTube API, конечно, наилучший вариант, если у вас какое-то свое приложение или проект, но там требуется зарегистрировать приложение и т.д. В «пробной» версии вам нужно постоянно авторизовываться для использования апи, еще там присутствует быстро заканчиваемая квота.
    3. В нашем методе, я бы сказал, очень сложные структуры данных, выдаваемыми ютубом. Особенно нестабильно работает парсинг поиска ютуб.

    как подгружать данные на ютубе?

    для этого есть токен, который можно найти в html коде страницы. потом в дальнейшем его используем, как параметр для запроса к ютубу, выдающему нам новый контент. сам ютуб прогружает контент с помощью запроса, где как раз используется этот токен.там есть дополнительные исходящие параметры, которые нам будут нужны в следующем шаге.

    Получение токена через скрипт

    Составляем параметр headers для запроса к ютубу. Помимо user-agent вставляем два дополнительных, которые вы видите ниже.

    headers = { 'User-Agent': 'Вы можете взять свой или сгенерировать онлайн, но возможно он не будет работать', 'x-youtube-client-name': '1', 'x-youtube-client-version': '2.20200529.02.01' }

    Делаем запрос с помощью библиотеки requests. Ставляете ссылку на страницу, которую нужно прогрузить, а также добавляете headers.

    token_page = requests.get(url, headers=headers)

    Токен невозможно найти парсерами, т.к он спрятан в тэге script. Чтобы сохранить его в переменную, я прописываю такой некрасивый код:

    nextDataToken = token_page.text.split('"nextContinuationData":{"continuation":"').split('","')

    Обычно это токен длиной 80 символов.

    Делаем запрос на получение контента

    service = 'https://www.youtube.com/browse_ajax' params = { "ctoken": nextDataToken, "continuation": nextDataToken } r = requests.post(service, params=params, headers=headers)

    Разные типы подгружаемых данных имеют разные service ссылки. Наша подойдет для плейлистов и видео с каналов.Данные Ютуб присылает в json формате. Поэтому пишем r.json(), но вам прилетит список, нам нужен второй элемент списка, поэтому r.json(). Далее у нас уже имеются данные. Остается парсить.

    Парсинг json ответа

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

    r_jsonResponse = r_json dataContainer = r_jsonResponse nextDataToken = dataContainer

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