Как написать скрипт на python для сайта
Перейти к содержимому

Как написать скрипт на python для сайта

  • автор:

Скрапинг сайта с помощью Python: гайд для новичков

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

Отличие от вызовов API

Альтернативный метод получения данных сайта — вызовы API. Взаимодействие с API — это официально предоставляемый владельцем сайта способ получения данных прямо из БД или обычных файлов. Обычно для этого требуется разрешение владельца сайта и специальный токен. Однако апи доступен не всегда, поэтому скрапинг так привлекателен, однако его законность вызывает вопросы.

Юридические соображения

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

Установка Beautiful Soup в Python

Beautiful Soup — это Python библиотека для скрапинга данных сайтов через HTML код.
Установите последнюю версию библиотеки.

Чтобы делать запросы, установите requests (библиотеку для отправки HTTP запросов):

Импортируйте библиотеки в файле Python или Jupiter notebook:

И несколько стандартных библиотек, которые потребуются для скрапинга на Python:

Введение

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

Результаты поиск для скрапинга на Python

Предположим, что запрос приведет к странице результатов, которая выглядит следующим образом:

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

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

Логика получения одной точки данных

Все примеры кода для скрапинга на Python можно найти в Jupiter Notebook файле на GitHub автора.

Запрос кода сайта

Во-первых, мы используем поисковый запрос, который мы сделали в браузере в скрипте Python:

Переменная soup содержит полный HTML-код страницы с результатами поиска.

Поиск тегов-свойств

Для этого нам потребуется браузер. Некоторые популярные браузеры предлагают удобный способ получения информации о конкретном элементе напрямую. В Google Chrome вы можете выбрать любой элемент сайта и, нажав правой кнопкой, выбрать пункт «Исследовать элемент» . Справа откроется код сайта с выделенным элементом.

HTML классы и атрибут id

HTML-классы и id в основном используются для ссылки на класс в таблице стилей CSS, чтобы данные могли отображаться согласованным образом.
В приведенном выше примере, класс, используемый для получения информации о ценах из одного объявления, также применяется для получения цен из других объявлений (что соответствует основной цели класса).

Обратите внимание, что HTML-класс также может ссылаться на ценники за пределами раздела объявлений (например, специальные предложения, которые не связаны с поисковым запросом, но все равно отображаются на странице результатов). Однако для целей этой статьи мы фокусируемся только на ценах в объявлениях о недвижимости.
Вот почему мы сначала ориентируемся на объявление и ищем HTML-класс только в исходном коде для конкретного объявления:

Использование .text в конце метода find() позволяет нам возвращать только обычный текст, как показано в браузере. Без .text он вернет весь исходный код строки HTML, на которую ссылается класс:


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

Логика получения всех точек данных с одной страницы

Чтобы получить ценники для всех объявлений, мы применяем метод find.all() вместо find():

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

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

Важное примечание: использование идентификатора позволяет находить объявления в словаре:

Получение точек данных со всех страниц

Обычно результаты поиска либо разбиваются на страницы, либо бесконечно прокручиваются вниз.

Вариант 1. Веб-сайт с пагинацией

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

ссылки на страницы результатов поиска

Как видно на рисунке выше, окончание URL-адреса относится к номеру страницы результатов.

Важное примечание: номер страницы в URL-адресе обычно становится видимым со второй страницы. Использование базового URL-адреса с дополнительным фрагментом &pn=1 для вызова первой страницы по-прежнему будет работать (в большинстве случаев).

Применение одного цикла for-loop поверх другого позволяет нам перебирать страницы результатов:

Определение последней страницы результатов

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

Чтобы решить эту проблему, мы будем проверять, есть ли на странице кнопка с такой ссылкой:

Вариант 2. Сайт с бесконечным скроллом

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

Устранение несогласованности данных

Если нам нужно избавиться от ненужных данных в самом начале скрапинга на Python, мы можем использовать обходной метод:

Функция для определения аномалий

И применить его при сборе данных:

Форматирование данных на лету

Мы могли заметить, что цена хранится в строке вместе с запятыми с символом валюты. Мы можем исправить это ещё на этапе скрапинга:

Используем эту функцию:

Получение вложенных данных

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

Отбор информации по правилам

Каждый кусочек данных представлен в виде: число миль, название станции. Используем слово «миль» в качестве разделителя.

Первоначально переменная transport хранит два списка в списке, поскольку есть две строки информации об общественном транспорте (например, “0,3 мили Слоун-сквер”, “0,5 мили Южный Кенсингтон”). Мы перебираем эти списки, используя len транспорта в качестве значений индекса, и разделяем каждую строку на две переменные: расстояние и станцию.

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

В коде страницы мы можем найти атрибут testid, который указывает на тип общественного транспорта. Он не отображается в браузере, но отвечает за изображение, которое отображается на странице. Для получения этих данных нам нужно использовать класс css-StyledIcon:

Преобразование в датафрейм и экспорт в CSV

Когда скрапинг выполнен, все извлеченные данные доступны в словаре словарей.

Данные объявления

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

Данные без вложенности

Создаём датафрейм

Датафрейм

Мы можем экспортировать датафрейм в CSV:

Преобразование всех объявлений в датафрейм:

Мы это сделали! Теперь наш скрапер готов к тестированию.

Ограничения HTML скрапинга и его альтернативы

Этот пример показывает, насколько простым может быть скрапинг HTML на Python в стандартном случае. Для этого не нужно исследовать документацию. Это требует, скорее, творческого мышления, чем опыта веб-разработки.

Практика: web программирование

«Веб-программирование» включает в себя огромное множество различных понятий, языков и инструментов. Цель данной лабораторной — знакомство с основными из них.

Библиотеки

В данной работе нам потребуются библиотеки Falsk и Pubnub, начнем с их установки. Необходимо выполнить в консоли следующее:

(заметка для преподавателя: при нехватке зависимостей, обратится к @senya, я долью)

HTML — HyperText Markup Language — язык разметки гипертекста. HTML — это язык, на котором пишутся привычные нам веб-страницы. Документ на HTML состоит из тегов. Теги могут быть парные и одинарные.

Одинарные теги имеет вид <тег> , например тег <br> — перевод строки и тег <input> — поле ввода для html-форм. Выглядит он так:

Парные теги имеют вид <тег>содержание</тег> , например тег <b> , задающий жирный шрифт, используется так: обычный шрифт<b>жирный шрифт</b> , а выглядит так:

Теги также могут иметь атрибуты — дополнительные параметры, задающие поведение и отображение соответствующего элемента. Атрибуты имеют вид имя=»значение» и задаются вместе с именем тега, через пробел, в виде <тег аттрибут1=»значение1″ аттрибут2=»значение2″> , например

<input type=»password»> — это будет уже не обычное поле ввода, а поле ввода пароля, где вместо букв будут отображаться звездочки.

<a href=»http://acm.mipt.ru»>acm</a> — тег <a> , ссылка. Аттрибут href задает адрес ссылки.

Теги можно вкладывать друг в друга: <a href=»http://acm.mipt.ru»><b>acm</b> поиск</a> .

Структура HTML документа

Общую структуру можно увидеть на следующем примере:

Первый тег — особенный, тег <!DOCTYPE> . Она задает стандарт HTML, который используется в документе. <!DOCTYPE html> — это заголовок для последней на данный момент версии HTML5 (HTML5.1, HTML5.2). Этот тег не обязателен (как, в общем и все остальные теги в этом примере), но крайне желателен: без него поведение браузера не определено, каждый браузер будут действовать в соответствии со своими представлениями.

Парный тег <html> включает в себя весь документ. Парный тег <head> включает в себя различные мета-данные для страницы — это элементы, которые непосредственно на странице не отображаются. Например, тег <title> задает заголовок окна (или вкладки) браузера.

Парный тег <body> включает в себя всю отображаемую часть документа.

Теги <html> , <head> , <body> не обязательны, браузер умеет добавлять их автоматически.

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

html This is some text!

Такой подход перегружает текст документа. Становится сложно что-то найти, что-то изменить. Например, если у нас все заголовки оформлены как указано выше, то, чтобы заменить цвет заголовков на красный, нам придется пройтись по всем заголовкам и все исправить. CSS — Cascading Style Sheets — каскадные таблицы стилей, призваны решить эту проблему. А именно, будем описывать стили элементов (и даже, отчасти, расположение) отдельно от основного документа. Синтаксис следующий:

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

Заголовок 1

Заголовок 2

Теперь мы легко можем поменять стиль всех заголовков. CSS можно задавать как и в отдельном файле, тогда он подключается в HTML тегом <link rel=»stylesheet» type=»text/css» href=»theme.css»> , либо прямо в html-документе, в теге <style>. </style> . Оба тега должны использоваться в секции <head>. </head> .

Javascript

Красивые заголовки и кнопочки — это замечательно. Но кто позаботится об обработке кликов по этим самым кнопочкам? Скрипты на языке javascript могут использоваться в html страницах и выполняются непосредственно браузером. Javascript похож на python своей ссылочной моделью. Блоки кода выделяются парами фигурных скобок, а не отступами. Рассмотрим несколько примеров.

Атрибут onclieck задает код, который выполнится при клике мышью. При этом this — будет ссылкой на тот элемент, который кликнули. this.style — объект, предстваляющий стиль элемента, тот самый который мы можем задавать с помощью CSS. Конечно, задавать код непосредственно внутри тегов крайне не удобно. Перепишем пример, используя функцию:

Итак, скрипты можно писать в теге <script> . Можно и подключать отдельные файлы со скриптами, так: <script src=»http://address-of-script.js/»></script> . Заметьте, тег <script> парный, закрывающий тег </script> обязателен, даже если внутри тега ничего нет. А вот тот же пример, но уже с использованием CSS:

Селектор CSS вида .класс выбирает элементы по «классу». Класс можно задавать в html, с помощью атрибута class или в javascript, в атрибут className элемента.

Вот пример, где мы изменяем наш документ с помощью javascript.

Базовая объектная модель html документа достаточно громоздка. Чего только стоит document.getElementById(‘my-div’).innerHTML . Для упрощения жизни существует библиотека jQuery. Библиотека определяет одну единственную функцию $ (да, javascript разрешает такие имена), в которой содержится вся функциональность. Вот пример ее использования, в котором html-код свободен уже не только от стилей но и от событий, а занимается исключительно версткой элементов и их содержимым.

html Green
Another

Flask

Как же сделать сайт? Оказывается одних только html, css и js не достаточно. Сайты, да и многие другие сетевые приложения используют модель клиент-сервер. Это значит, что у нас есть две отдельные части: сервер — приложение, которое, в случае сайта, запускается на машине хозяина сайта и клиент — часть приложения, которая работает непосредственно на машине пользователя. В случае с сайтом, клиентская часть представлена браузером, а также всеми html, css, js и прочим содержимым, которое браузер скачивает и выполняет на машине пользователя. Существует множество способов написать web-сервер. Один из них — модуль Flask для Python.

Рассмотрим такой пример

Pubnub

Сервер это здорово. Но иногда нет большой нужды писать его. Допустим, хотим написать чат на Python. Можно написать простенький сервер на Flask, но что дальше? Можно запустить его в локальной сети, тогда будет чат по локальной сети. А как на счет чата через интернет? Тут уже нужна машина с белым ip, т.е. доступная из интернета. Придется искать хостинг для вашего сервера, грузить его туда.. Вместо этого, можно использовать BAAS. BAAS — Backend As A Service. Это значит, что кто предоставляет нам бэк-энд (т.е. серверную часть приложения) как сервис, как услугу. Сервер уже есть и работает, можно использовать! Один из примеров таких BAAS — Pubnub.com. Этот бэкенд позволяет создавать каналы передачи сообщений. Простое api позволяет писать в канал и получать данные из канала. Все, сервер писать уже не придется. Рассмотрим пример.

Это приложение подписывается на канал «my_channel_sf23» в рамках аккаунта, заданного ключами PUB_KEY и SUB_KEY, и печатает все ошибки и сообщения, которые через него получает. Чтобы получить свои ключи, необходимо зарегистрироваться на pubnub.com.

Это приложение отправляет в канал «my_channel_sf23» различные сообщения, в основном те, которые пользователь вводит с клавиатуры. По pubnub каналам можно передавать не только строки но и другие json-сериализуемые объекты.

Создание web посредством Python

Webdev_Deep_29.1-5020-9673b6.png

Мы живём в золотой век web-разработки, имея в своём распоряжении гибкие веб-технологии и массу полезных инструментов и интерфейсов, позволяющих реализовывать замыслы практически любой сложности. И язык программирования Python — один из них.

Python и web

Популярность Питона в веб-разработке подтверждается, к примеру, простым взглядом на рейтинг портала HotFrameworks.com. Там можно увидеть, что один из самых популярных фреймворков для создания веб-приложений предназначен именно для Пайтона (разумеется, речь идёт о Django, который на момент написания материала находился на 6 месте).

Говоря о вебе, скажем, что Python применяется для обработки бэкенда и маршрутизации, где еще в роли конкурентов выступают PHP и Ruby. Ну а web-страницы всё равно следует отображать посредством HTML/CSS, причём функциональная часть фронтенда, как и прежде, реализуется на JavaScript.

Таким образом, без взаимодействия разных технологий и интерфейсов (interface) не обойтись. Но это не проблема, ведь Python-фреймворки позволяют существенно упрощать это взаимодействие. Тот же Django включает в себя систему шаблонов, обеспечивающих написание специальных HTML-файлов, которые могут вставлять Python-код, взаимодействуя с данными из бэкенда. Этот тип взаимодействия принято называть Full Stack-фреймворком. С его помощью вы сможете работать с шаблонами web-страниц, запросами маршрутизации, хранилищами баз данных, системами, обрабатывающими HTTP-запросы, и т. д.

Но существуют и не Full Stack-фреймворки, а так называемые микрофреймворки, обрабатывающие лишь базовую логику. Они более гибкие, изучаются в кратчайшие сроки, но потребуют от вас каждый раз изобретать велосипед, ведь для сторонних работ их придётся объединять с шаблонизаторами, сторонними БД и прочее.

Пайтон и другие языки

Может возникнуть закономерный, но риторический вопрос: «Если я использую JavaScript для внешнего интерфейса, почему я не могу применять тот же JavaScript для бэкенда?» И это действительно так, но то же самое можно сказать и про PHP, ведь язык востребован, существует десятилетиями и имеет большое количество технической документации. Следовательно, для бэкенда прекрасно подходит и PHP.

Вывод прост: большинство задач при разработке веба вы сможете решить с применением любого языка. По-настоящему важно лишь то, насколько удобно вам это делать на выбранном языке. Таким образом, если вы предпочитаете Питон, зачем от него отказываться и тратить время на изучение чего-нибудь другого? Сегодня использование этого языка для веба обычное явление (it’s common).

Frameworks

Мы уже говорили о том, что веб-разработка на Python предполагает использование специальных фреймворков. Их много, и каждый по-своему хорош. Обычно проблем с документацией, сообществами и официальной поддержкой не возникает.

Наиболее известны фреймворки Django и Flask. Мы уже о них писали, поэтому повторяться не будем. Разве что, упомянем такой фреймворк, как Pyramid — некий компромиссе между Flask и Django. Да, Pyramid не настолько функционален, но удобен и прост, плюс имеет достаточно средств для организации большинства web-приложений. Также он имеет широкую библиотеку как официальных, так и неофициальных плагинов, используя которые, вы успешно реализуете необходимые замыслы.

Python и real life

А как быть с реальным применением для написания веба? Тут всё очень неплохо, достаточно вспомнить лишь следующие проекты, реализованные посредством Python. Просто загибайте пальцы: — YouTube, — Google, — Reddit, — Instagram, — DropBox, — FireFox, — Pinterest и многие другие.

Да, в некоторых проектах Python применяется лишь частично, но его влияние на web всё же велико.

CGI: исполнение простейшего скрипта

Создавать динамические страницы на Питоне можно посредством скриптов CGI. Скрипты CGI представляют собой исполняемые файлы — они выполняются web-сервером, если в URL запрашивается соответствующий скрипт. В этой части статьи мы расскажем про то, как запустить скрипт на локальном сервере и вывести на экран простейшие данные, к примеру, Hello world,.

Настраиваем локальный сервер

В «Пайтон» CGI-сервер уже встроен, поэтому настроить его несложно. Команда ниже позволит запустить его из консоли (если у вас Linux). Причем запускать команду следует из папки, в которой желаем работать:

Screenshot_1-1801-91718b.png

Если у вас операционная система Windows, запуск Python-файла будет еще проще. Важно, чтобы файл находился в той же папке, в которой планируется работа:

Screenshot_2-1801-bdb4e8.png

Следующее, что нужно сделать, — открыть браузер и набрать в адресной строке localhost:8000.

Итог должен быть приблизительно следующим:

Screenshot_3-1801-8eb4dc.png

Hello world

Далее в папке, где запускался сервер, следует создать папку cgi-bin. Потом следует создать скрипт hello.py, куда будут включены следующие данные:

Screenshot_4-1801-23b918.png

Первая строка свидетельствует, что это Python-скрипт, вторая печатает заголовок, который значит, что это будет html-файл (веб-браузер различает файлы по заголовкам). Третья строка отделяет заголовки от тела ответа, четвертая — печатает «Hello world».

Останется перейти на localhost:8000/cgi-bin/hello.py, чтобы убедиться, что выводятся данные «Hello world».

Screenshot_5-1801-e440b3.png

Если по каким-то причинам что-то не работает, проверьте, правильно ли выставлены права на выполнение.

Когда мы говорим о вебе, вышеописанные действия — лишь начало пути. Если хотите двигаться дальше, надо будет: 1) позаботиться об обработке данных и cookies; 2) для обеспечения возможности работы с пользовательскими данными, эти данные надо будет где-либо хранить. Проще всего — хранить данные в файлах (но это не самое практичное и безопасное решение). Лучший способ — хранение данных в базе данных; 3) и вот только после этого можно будет приступить к публикации простейшего приложения в интернете. То есть речь идет о запуске cgi на виртуальном сервере, а не локальном.

Обучение

Может появиться вопрос: «Где научиться Python именно в контексте веб-разработки?» Что же, у нас есть на него ответ. В OTUS уже не первый год существует курс, посвящённый именно этому направлению в программировании. Однако никто не мешает вам освоить и общий курс продвинутой разработки на Python. Или даже овладеть профессией с нуля, изучив «Подготовительный курс по Python-разработке». Выбор за вами!

Run Python in HTML

Run Python in HTML

Web Development is a vast field, and there are endless opportunities and things that we can do. With complexity and demand come requirements. When building dynamic web pages, we often have to perform tasks that require the assistance of some programming language such as Python or PHP. In this article, we will learn how to run a Python script in HTML. We will talk about a few ways in which we can achieve this.

Run Python Scripts in HTML using PHP

We can use PHP or Hypertext Preprocessor to run Python scripts in HTML. Refer following code depicts a simple example.

HTML File — index.html

Python File — script.py

This will print the following in the console.

If we want to pass some values to the Python scripts, we can use the following code.

HTML File — index.html

Now, the Python script will look as follows.

Python File — script.py

The output will remain the same, as shown above.

Run Python script in HTML using Django

Django is a famous and robust Python-based web development framework. Since it is Python-based, it makes it easier to run Python scripts inside the HTML. The way we do this is by using template tags. Django has some pre-built template tags such as date , linebreaks , safe , random , etc. You can learn more about them here.

Since Django is very customizable, it offers developers an easy way to create their custom template tags. Using template tags, we can return data to HTML templates, which can be embedded inside the HTML template.

Follow the following steps to create a simple template tag. We are assuming that we have a core application in our Django project.

Create a new directory, templatetags , inside the core application. The app directory should look something like this.
Inside the templatetags folder, create a Python file named my_custom_tags.py .
Inside this file, add the following code.

my_custom_tags.py module will hold all the custom template tags. As shown in the code above, my_tag is a custom template tag that we just created and now it can be used inside any HTML template. This template tag will return «Hello World from my_tag() custom template tag.» this string to the template. We can create even more template tags here to perform specific and common tasks.

Now that we have created our first template tag, it is time to load it inside our HTML template and use it.

We first load the my_custom_tags.py module inside the template. Once the module is loaded, we can now use the template tags defined inside the my_custom_tags module. Note that it is important to first load a module with custom template tags before using those template tags.

Instead of using a template tag, we can also create an end-point and make an AJAX request to that end-point to perform some task or get some data. We can use fetch() or jquery or any other available method to make an AJAX request. While making an end-point to handle an AJAX request, it is important to ensure that the end-point is secure and doesn’t give easy access to sensitive data or website features. Since anyone can make AJAX requests if they know the end-point, we can add CSRF ( Cross Site Request Forgery ) validation to it and configure it to handle only POST requests. The POST data should contain the CSRF token.

You can learn more about CSRF here

Vaibhav is an artificial intelligence and cloud computing stan. He likes to build end-to-end full-stack web and mobile applications. Besides computer science and technology, he loves playing cricket and badminton, going on bike rides, and doodling.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *