Меню Рубрики

Как написать парсер сайта на python

Почему стоит научиться > сайты, или как написать свой первый парсер на Python

В этой статье я постараюсь понятно рассказать о парсинге данных и его нюансах.

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

Перейдем к этапам парсинга.

  • Поиск данных
  • Извлечение информации
  • Сохранение данных

И так, рассмотрим первый этап парсинга — Поиск данных.

Так как нужно парсить что-то полезное и интересное давайте попробуем спарсить информацию с сайта work.ua.
Для начала работы, установим 3 библиотеки Python.

pip install beautifulsoup4

Без цифры 4 вы ставите старый BS3, который работает только под Python(2.х).

pip install requests
pip install pandas

Теперь с помощью этих трех библиотек Python, можно проанализировать нашу веб-страницу.

Второй этап парсинга — Извлечение информации.

Попробуем получить структуру html-кода нашего сайта.
Давайте подключим наши новые библиотеки.

И сделаем наш первый get-запрос.

Статус 200 состояния HTTP — означает, что мы получили положительный ответ от сервера. Прекрасно, теперь получим код странички.

Получилось очень много, правда? Давайте попробуем получить названия вакансий на этой страничке. Для этого посмотрим в каком элементе html-кода хранится эта информация.

У нас есть тег h2 с классом «add-bottom-sm», внутри которого содержится тег a. Отлично, теперь получим title элемента a.

Хорошо, мы получили названия вакансий. Давайте спарсим теперь каждую ссылку на вакансию и ее описание. Описание находится в теге p с классом overflow. Ссылка находится все в том же элементе a.

И последний этап парсинга — Сохранение данных.

Давайте соберем всю полученную информацию по страничке и запишем в удобный формат — csv.

После запуска появится файл test.csv — с результатами поиска.

«Кто владеет информацией, тот владеет миром» (Н. Ротшильд).

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

Источник статьи: http://habr.com/ru/sandbox/134528/

Осваиваем парсинг сайта: короткий туториал на Python

Постоянно в Интернете, ничего не успеваете? Парсинг сайта спешит на помощь! Разбираемся, как автоматизировать получение нужной информации.

Чтобы быть в курсе, кто получит кубок мира в 2019 году, или как будет выглядеть будущее страны в ближайшие 5 лет, приходится постоянно зависать в Интернете. Но если вы не хотите тратить много времени на Интернет и жаждете оставаться в курсе всех событий, то эта статья для вас. Итак, не теряя времени, начнём!

Доступ к новейшей информации получаем двумя способами. Первый – с помощью API, который предоставляют медиа-сайты, а второй – с помощью парсинга сайтов (Web Scraping).

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

Парсинг сайта

Это метод извлечения информации с веб-сайтов. Эта методика преимущественно фокусируется на преобразовании неструктурированных данных – в формате HTML – в Интернете в структурированные данные: базы данных или электронные таблицы. Парсинг сайта включает в себя доступ к Интернету напрямую через HTTP или через веб-браузер. В этой статье будем использовать Python, чтобы создать бот для получения контента.

Последовательность действий

  • Получить URL страницы, с которой хотим извлечь данные.
  • Скопировать или загрузить HTML-содержимое страницы.
  • Распарсить HTML-содержимое и получить необходимые данные.

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

Пакеты

Для анализа HTML-содержимого и получения необходимых данных используется библиотека Beautiful Soup. Это удивительный пакет Python для парсинга документов формата HTML и XML.

Для входа на веб-сайт, перехода к нужному URL-адресу в рамках одного сеанса и загрузки HTML-содержимого будем использовать библиотеку Selenium. Selenium Python помогает при нажатии на кнопки, вводе контента и других манипуляциях.

Погружение в код

Сначала импортируем библиотеки, которые будем использовать:

Затем укажем драйверу браузера путь к Selenium, чтобы запустить наш веб-браузер (Google Chrome). И если не хотим, чтобы наш бот отображал графический интерфейс браузера, добавим опцию headless в Selenium.

Браузеры без графического интерфейса (headless) предоставляют автоматизированное управление веб-страницей в среде, аналогичной популярным веб-браузерам, но выполняются через интерфейс командной строки или с использованием сетевых коммуникаций.

После настройки среды путём определения браузера и установки библиотек приступаем к HTML. Перейдём на страницу входа и найдём идентификатор, класс или имя полей для ввода адреса электронной почты, пароля и кнопки отправки, чтобы ввести данные в структуру страницы.

Затем отправим учётные данные в эти HTML-теги, нажав кнопку «Отправить», чтобы ввести информацию в структуру страницы.

После успешного входа в систему перейдём на нужную страницу и получим HTML-содержимое страницы.

Когда получили HTML-содержимое, единственное, что остаётся, – парсинг. Распарсим содержимое с помощью библиотек Beautiful Soup и html5lib.

html5lib – это пакет Python, который реализует алгоритм парсинга HTML5, на который сильно влияют современные браузеры. Как только получили нормализованную структуру содержимого, становится доступным поиск данных в любом дочернем элементе тега html . Искомые данные присутствуют в теге table , поэтому ищем этот тег.

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

Чтобы выполнить указанную программу, установите библиотеки Selenium, Beautiful Soup и html5lib с помощью pip. После установки библиотек команда #python

выведет значения в консоль.

Так парсятся данные с любого сайта.

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

Используете парсинг сайта?

Для вывода результатов необязательно ограничиваться консолью, правда?

Источник статьи: http://proglib.io/p/web-scraping/

Пишем изящный парсер на Питоне

В C++17 (нет-нет, Питон скоро будет, вы правильно зашли!) появляется новый синтаксис для оператора if , позволяющий объявлять переменные прямо в заголовке блока. Это довольно удобно, поскольку конструкции вида

довольно общеупотребительны. Код выше лёгким движением руки программиста (и тяжёлым движением руки комитета по стандартизации) превращается в:

Стало чуть-чуть лучше, хотя всё ещё не выглядит идеально. В Python нет и такого, но если вы ненавидите if в Python-коде так же сильно, как я, и хотите научиться быстро писать простые парсеры, то добро пожаловать под кат. В этой статье мы попытаемся написать короткий и изящный парсер для JSON на Python 2 (без каких-либо дополнительных модулей, конечно же).

Что такое парсинг и с чем его едят

Парсинг (по-русски «синтаксический анализ») — это бессмертная задача разобрать и преобразовать в осмысленные единицы нечто, написанное на некотором фиксированном языке, будь то язык программирования, язык разметки, язык структурированных запросов или главный язык жизни, Вселенной и всего такого. Типичная последовательность этапов решения задачи выглядит примерно так:

    Описать язык. Конечно, сначала надо определиться, какую именно задачу мы решаем. Обычно описание языка — это очередная вариация формы Бэкуса-Наура. (Вот, например, описание грамматики Python, использующееся при построении его парсера.) При этом устанавливаются как правила «построения предложений» в языке, так и правила определения валидных слов.

Разбить ввод на токены. Пишется лексический анализатор (в народе токенайзер), который разбивает входную строку или файл на последовательность токенов, то есть валидных слов нашего языка (или ноет, что это нельзя сделать).

Проверить синтаксис и построить синтаксическое дерево. Проверяем, соответствует ли последовательность токенов описанию нашего языка. Здесь в ход идут алгоритмы вроде метода рекурсивного спуска. Каждое валидное предложение языка включает какое-то конечное количество валидных слов или других валидных предложений; если токены смогли сложиться в стройную картину, то на выходе мы автоматически получаем дерево, которое и называется абстрактным синтаксическим деревом.

  • Сделать, наконец, работу. У вас есть синтаксическое дерево и вы можете наконец сделать то, что хотели: посчитать значение арифметического выражения, организовать запрос в БД, скомпилировать программу, отобразить веб-страницу и так далее.
  • Вообще область эта изучена вдоль и поперёк и полна замечательных результатов, и по ней написаны сотни (возможно, хороших) книг. Однако, теоретическая разрешимость задачи и написание кода — не одно и то же.

    Модельная задача

    Написание парсера проиллюстрируем на простом, но не до конца тривиальном примере — парсинге JSON. Грамматика выглядит примерно так:

    Здесь нет правил для string и number — они, вместе со всеми строками в кавычках, будут нашими токенами.

    Парсим JSON

    Полноценный токенайзер мы писать не станем (это скучно и не совсем тема статьи) — будем работать с целой строкой и бить её на токены по мере необходимости. Напишем две первые функции:

    (Я обещал без if’ов, но это последние, чесслово!)

    Для всего остального напишем одну функцию, генерящую простенькие функции-парсеры:

    Итого, по какому принципу мы строим наши функции:

    1. Они принимают строку, которую нужно парсить.
    2. Они возвращают пару (результат, оставшаяся_строка) при успехе (то есть когда требуемая конструкция нашлась в начале строки) и None при провале.
    3. Они отправляют в небытие все пробельные символы между токенами. (Не делайте так, если пишете парсер Питона!)

    Собственно, на этих трёх функциях проблемы с токенами решены, и мы можем перейти к интересной части.

    Парсим правило с ветвлением

    Как должна выглядеть функция parse_value , соответствующая грамматике выше? Обычно как-то так:

    Ну уж нет, эти if достали меня!

    Давайте поменяем три функции выше самым неожиданным образом: заменим return на yield ! Теперь они возвращают генераторы — пустые, если парсинг не удался, и ровно с одним элементом, если удался. Да-да, мы разворачиваем на 90 градусов наш принцип номер 2: все наши функции мы будем теперь писать в таком стиле:

    Во что же превратится наша parse_value ? На первый взгляд во что-то такое:

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

    При этом эффективность остаётся на прежнем уровне — каждая функция начнёт выполняться (а стало быть, делать работу, проверяя регулярные выражения) только тогда, когда предыдущая не даст результата. return гарантирует, что лишняя работа не будет выполнена, если где-то в середине списка парсинг удался.

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

    Перейдём к следующему номеру нашей программы — функции parse_array . Выглядеть она должна как-то так:

    Ни одного if , как и обещано, но что-то всё равно не так… Давайте напишем небольшую вспомогательную функцию, которая поможет нам соединять функции-парсеры в последовательности подобно тому, как chain помогла соединять их в режиме «или». Эта функция должна будет аккуратно брать все результаты и вернуть все первые элементы результатов (результаты анализа) и последний второй элемент (оставшуюся непроанализированной часть строки). Мой вариант выглядит так:

    С этим мощным (пусть и страшноватым) инструментом наша функция перепишется в виде:

    Ну а дописать функцию parse_comma_separated_values — раз плюнуть:

    Приведёт ли такое решение к бесконечной рекурсии? Нет! Однажды функция parse_comma не найдёт очередной запятой, и до последующей parse_comma_separated_values выполнение уже не дойдёт.

    Ну, что там дальше?

    Собственно, всё! Остаётся добавить простую интерфейсную функцию:

    130 строк. Попробуем запустить:

    Заключение

    Конечно, я рассмотрел далеко не все ситуации, которые могут возникнуть при написании парсеров. Иногда программисту может потребоваться ручное управление выполнением, а не запуск последовательности chain ов и sequence ов. К счастью, это не так неудобно в рассмотренном подходе, как может показаться. Так, если нужно попытаться распарсить необязательную конструкцию и сделать действие в зависимости от её наличия, можно написать:

    Здесь мы пользуемся малопопулярной фишкой Питона — блоком else у циклов, который выполняется, если цикл дошёл до конца без break . Это выглядит не так привлекательно, как наш код в статье, но точно не хуже, чем те if , от которых мы столь изящно избавились.

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

    Как обычно, не откладывая пишите в личку обо всех обнаруженных неточностях, орфографических, грамматических и фактических ошибках — иначе я сгорю от стыда!

    Источник статьи: http://habr.com/ru/post/309242/

    Парсинг сайтов на Python. Часть 1

    Что такое Парсинг и что это означает ?

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

    В этой статье мы будем автоматически вытаскивать нужную нам информации со страницы веб-сайта и сохранять в формате CSV.

    CSV (от англ. CommaSeparated Values — значения, разделённые запятыми) — текстовый формат, предназначенный для представления табличных данных.

    Задача номер ноль.

    Что бы получить данные с сайта первым делом надо получить код (html) страницы этого сайта. Для решения этой задачи будем использовать библиотеку requests . requests это по сути обертка библиотеке urllib которая упрощает работу с запросами к веб-серверу и т.д. Что очень удобно, получить страницу занимает всего две строчки :

    Мы отправляем GET запрос серверу requests.get(url) . И возвращаем данные которые содержаться в поле text .

    Задача номер один.

    Собственно теперь у нас есть данные что бы их парсить. В качестве самого парсера мы будем использовать библиотеку BeautifulSoup . Soup переводиться как суп , не поверите. Вот такое забавное название, будем варить суп ) Есть и другие библиотеки в том числе и входящие уже в Питон.

    Теперь нам надо придумать откуда мы будем вытаскивать информацию и какую. Для примера возьмем сайт 3dnews.ru и будем собирать все заголовки статей с раздела Новости Hardwear .

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

    Давайте перейдем к коду парсера и я вам постараюсь все разъяснить:

    Создаем сам объект , передаем в него наш код страницы (html) и ‘lxml’ , в качестве интерпретатора кода. LXML библиотека для обработки XML и HTML .

    Теперь с помощью метода find() найдем блок со статьями,

    методом find_all() в которых собственно и содержится название статьи. Нам вернеться список всех заголовков в этом блоке.

    find(name, attrs, recursive, text, **kwargs)

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

    Кроме id есть еще class, но слово класс зарезервировано в питон по этому в библиотеке используется class_ = ‘что то там’

    Наш список все еще является объектом BeautifulSoup и мы можем к нему применять все методы библиотеки. Переберем весь список тегов и вытащим из него текст методом .string .

    Возвращаем уже текстовый список с заголовками статей.

    Но одни заголовки это мало , давайте еще вытащим ссылки на эти статьи. Смотрим внимательно на код страницы. По факу заголовки и есть ссылки , тег

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

    Создадим словарь и отправим его на запись в файл:

    Задача номер три.

    Теперь создадим функцию записи в файл в формате CSV.

    Открываем\создаем файл , ‘a’ — значит добавить данные в конец файла, если файла нет создать.

    Для записи нам надо получить объект writer, который возвращается функцией csv.writer(file) . В эту функцию передается открытый файл. А собственно запись производится с помощью метода writer.writerows(data) Этот метод принимает набор строк.

    Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

    Источник статьи: http://xn--90aeniddllys.xn--p1ai/parsing-sajtov-na-python-chast-1/


    0 0 голоса
    Article Rating
    Подписаться
    Уведомить о
    guest

    0 Комментарий
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии