Как сделать многопоточный парсинг python

Добавил пользователь Владимир З.
Обновлено: 04.10.2024

Веб-скарпинг - это автоматизированный процесс сбора данных с сайта.

Интернет – является центром всей информации на Земле, к сожалению, многая информация не является правдивой. Множество дисциплин, таких как : data science, business intelligence стараются искать истинную информацию и получать из неё пользу для бизнеса.

В данном гайде мы научимся:

- Парсить веб-сайт используя string методы и обычные выражения

- Парсить используя HTML parser

- Взаимодействовать с формами и другими компонентами сайта

Сбор информации с веб-сайта

Повторим ещё раз, веб-скрапинг - это автоматизированный сбор данных с сайтов. Но некоторые сайты запрещают парсить их данные при помощи того инструмента, который мы разработаем с вами в нынешнем гайде. Сайты могут запрещать парсить свои данные по след. Причинам:

Ваш первый Web scraper

Первый пакет, который мы используем, называется urlib. Он поможет нам работать с url. Данный модуль содержит urlopen() его нужно импортировать.

Далее присваиваем переменной url адрес в формате String.

Для того чтобы открыть данный сайт в python:

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

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

Извлекаем файлы из HTML методами String объекта

Одним из методов извлечения информации HTML файла могут быть string методы. Например, .find() для поиска через текст .

.fing() возвращает индекс первого входа нужного нам символа/тега. Покажем на примере " " методом .find().

Для того чтобы найти начало заголовка нам нужно к индексу добавить длину тега " ".

Также можем найти место где заканчивается " ":

Наконец, мы можем извлечь всё что находится в " ", зная первый и последний индекс:

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

Регулярные выражения

Регулярные выражения - это паттерны, которые используются для поиска внутри текста типа string. Для этого нам нужна библиотека re.

Мы импортируем модуль re.

Регулярные выражения используют специальные метасимволы для определения разных паттернов. Например символ "*" разрешает вводить любые символы после себя.

Покажем на примере .findall() мы будем искать все совпадения с требуемым для нас выражением (первый элемент - то что мы ищем, второй - в каком тексте).

Используя параметр re.IGNORECASE позволяет методу не учитывать регистр.

Метод .replace() - заменяет все символы в тексте на требуемые нам символы.

Метод .sub() - " " для замены всего что находится между .

Давайте взглянем ближе на регулярные выражения:

  1. - отмечает открытие тега "title"
  2. *? - отмечает весь текст после открытие тега " "
  3. - отмечает элемент, который закрывает тег.

HTML парсер на Python


Ладно, хватит играться и развлекаться пора использовать серьёзные вещи для парсинг. К нашему счастью, в библиотеках Python есть множество инструментов, которые созданы для разных задач. Для парсинга нам подойдет Beautiful soup.

Скачиваем Beautiful soup

Теперь, вернёмся в едитор.

Создание объекта типа BeautifulSoup

Наша программа совершит 3 действия:

  1. Откроет URL
  2. Прочитает элементы и переведёт их в String
  3. Присвоит это объекту типа BeautifulSoup

При создании переменной "soup" мы передаём два аргумента, первый это сайт, который мы парсим, второй - какой парсер использовать.

Использование объекта BeautifulSoup. Методы:

Как можно заметить, есть много пустых строк, это результат появления символов новой строки в тексте HTML. Их можно убрать используя метод .replace() .

Если вам нужно что то найти, используйте .find()

Данная команда возвращает все теги .

Каждый объект становится тегом, поэтому можно использовать методы.

Даст нам имя переменной

Этот метод даст нам путь к файлу, например:

Можем увидеть что находится в заголовке

.string

Этот метод убирает теги, покажем на примере title:

Взаимодействие с HTML формами


Библиотека urllib идеально подходит для сбора информации с сайта, но иногда нам приходится взаимодействовать с сайтом, заполнять формы, нажать на кнопку. В этом нам поможет модуль MechanicalSoup.

Устанавливаем модуль

Создаём объект типа Browser

Можем запросить url

Если мы проверим "page" , то нам вернётся 200 - это значит что с сайтом всё в порядке. Если вернётся 404 или 500, то есть ошибка со стороны сайта/сервера.

Показывает нам структуру HTML

Взаимодействие с сайтом в реальном времени


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

Теперь мы можем использовать .get() объекта Browser.

Во-первых, нужно определить какой элемент требует обновления, скорее всего нужно просто найти id.

Давайте на примере разберёмся.

Прежде всего, советуем установить промежуток, чтобы сайт успевал перезагружаться. Используйте time.sleep(5) - 5 секунд.

Когда вы запустите программу, вы сразу увидите первый результат, который будет выведен на консоль. Далее будет перерыв в 10 секунд и всё повторится.

После 4 циклов программа остановится.

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

Так же возможно сломать сервер, на котором хостится сайт, поэтому советуем читать "Правила пользования" (Terms of use)

Заключение


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

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

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

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

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

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

Цель: Fake Python Job Site

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


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

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



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

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

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

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

Рассмотрим еще один практический кейс парсинга сайтов с помощью библиотеки BeautifulSoup: что делать, если на сайте нет готовой выгрузки с данными и нет API для удобной работы, а страниц для ручного копирования очень много?

Примером для разбора основ возьмем сайт с отзывами banki_ru и получим отзывы по какому-нибудь банку.

Задачу можно разбить на три этапа:

  1. Загружаем страницу в память компьютера или в текстовый файл.
  2. Разбираем содержимое (HTML), получаем необходимые данные (сущности).
  3. Сохраняем в необходимый формат, например, Excel.

Инструменты

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

Загрузка и обработка данных

После исполнения данного скрипта получится файл text.html.

Открываем данный файл и видим, что необходимые данные получили без проблем.

Теперь очередь для разбора страницы на нужные фрагменты. Обрабатывать будем последние 10 страниц плюс добавим модуль Pandas для сохранения результата в Excel.

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

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

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

  • Find(‘table’) – проводит поиск по странице и возвращает первый найденный объект типа ‘table’. Вы можете искать и ссылки find(‘table’) и рисунки find(‘img’). В общем, все элементы, которые изображены на странице;
  • find_all(‘table’) – проводит поиск по странице и возвращает все найденные объекты в виде списка

У каждой из этих функций есть методы. Я расскажу от тех, которые использовал:

  • find(‘table’).text – этот метод вернет текст, находящийся в объекте;
  • find(‘a’).get(‘href’) – этот метод вернет значение ссылки

Теперь, уже обладая этими знаниями и навыками программирования на Python, написал функцию, которая разбирает таблицу с отзывом на нужные данные. Каждые стадии кода дополнил комментариями.

Функция возвращает DataFrame, который можно накапливать и экспортировать в EXCEL.

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

Объектно-ориентированное программирование (ООП) в Python

Изучение

Предположим, вы хотите получить информацию с веб-сайта? Скажем, статья с сайта geeksforgeeks или новость, что вы будете делать? Первое, что может прийти вам в голову, — это скопировать и вставить информацию на ваш местный носитель. Но что, если вам нужен большой объем данных ежедневно и как можно быстрее. В таких ситуациях копирование и вставка не работают, и именно здесь вам понадобится веб-скрейпинг.

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

Модуль запросов

Установка

Установка запросов зависит от типа операционной системы, основная команда в любом месте — открыть командный терминал и запустить,

Сделать запрос

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

Пример: запросы Python, выполняющие запрос GET

запросы Python, выполняющие запрос GET

Объект ответа

Когда кто-то делает запрос к URI, он возвращает ответ. Этот объект Response в терминах python возвращается с помощью request.method (), являющегося методом — get, post, put и т.д. Response — это мощный объект с множеством функций и атрибутов, которые помогают в нормализации данных или создании идеальных частей кода. Например, response.status_code возвращает код состояния из самих заголовков, и можно проверить, был ли запрос обработан успешно или нет.

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

Пример: Python запрашивает объект ответа

Библиотека BeautifulSoup

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

Установка

Чтобы установить Beautifulsoup в Windows, Linux или любой другой операционной системе, потребуется пакет pip. Чтобы узнать, как установить pip в вашей операционной системе, посмотрите — Установка PIP — Windows || Linux. Теперь запустите следующую команду в терминале.

Чтобы установить Beautifulsoup в Windows, Linux или любой другой операционной системе

Проверка веб-сайта

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

Прежде чем извлекать какую-либо информацию из HTML страницы

После нажатия кнопки проверки откроются инструменты разработчика браузера. Теперь почти все браузеры поставляются с установленными инструментами разработчика, и в этом руководстве мы будем использовать Chrome.

Инструменты разработчика позволяют увидеть объектную модель документа (DOM)

Инструменты разработчика позволяют увидеть объектную модель документа (DOM) сайта. Если вы не знаете о DOM, не беспокойтесь, просто рассмотрите отображаемый текст как HTML-структуру страницы.

Разбор HTML

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

Примечание. Библиотека BeautifulSoup построена на основе библиотек синтаксического анализа HTML, таких как html5lib, lxml, html.parser и т. Д. Таким образом, объект BeautifulSoup и указанная библиотека синтаксического анализатора могут быть созданы одновременно.

Пример: Python BeautifulSoup анализирует HTML

Python BeautifulSoup анализирует HTML

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

Поиск элементов

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

Теперь мы хотели бы извлечь некоторые полезные данные из содержимого HTML

Поиск элементов по классу

На изображении выше мы видим, что все содержимое страницы находится под блоком div с классом entry-content. Мы будем использовать класс find. Этот класс найдет данный тег с данным атрибутом. В нашем случае он найдет весь div, имеющий class как entry-content. У нас есть весь контент с сайта, но вы можете видеть, что все изображения и ссылки также очищены. Итак, наша следующая задача — найти только контент из проанализированного выше HTML. При повторном просмотре HTML-кода нашего веб-сайта —

На изображении выше мы видим, что все содержимое страницы находится под блоком div

Мы видим, что содержимое страницы находится под тегом

. Теперь нам нужно найти все теги p, присутствующие в этом классе. Мы можем использовать класс find_all в BeautifulSoup.

Теперь нам нужно найти все теги p, присутствующие в этом классе

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

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

В приведенном выше примере мы нашли элементы по имени класса, но давайте посмотрим

На изображении выше показано, что левая панель находится под тегом

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

На изображении выше показано, что левая панель находится под

    с классом leftBarList, и наша задача — найти все li под этим ul.

видим, что список на левой панели находится под тегом

Извлечение текста из тегов

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

Пример 1. Удаление тегов из содержимого страницы

Удаление тегов из содержимого страницы

Пример 2: Удаление тегов из содержимого левой панели

Удаление тегов из содержимого лево

Извлечение ссылок

До сих пор мы видели, как извлекать текст, теперь давайте посмотрим, как извлекать ссылки со страницы.

Пример: Python BeatifulSoup извлекает ссылки

Python BeatifulSoup извлекает ссылк

Извлечение информации об изображении

При повторном просмотре страницы мы видим, что изображения лежат внутри тега img, а ссылка на это изображение находится внутри атрибута src. См. Изображение ниже —

При повторном просмотре страницы мы видим, что изображения лежат

Пример: Python BeautifulSoup Extract Image

Python BeautifulSoup Extract Imag

Очистка нескольких страниц

Теперь могут возникнуть различные случаи, когда вы можете захотеть получить данные с нескольких страниц с одного и того же веб-сайта или с нескольких разных URL-адресов, а вручную написать код для каждой веб-страницы — трудоемкая и утомительная задача. Кроме того, это противоречит всем основным принципам автоматизации. Ага!

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

  • Тот же сайт
  • Различные URL-адреса веб-сайтов

Пример 1: переход по номерам страниц

переход по номерам страниц

номера страниц внизу сайта GeeksforGeeks

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

Это позволяет нам очень просто просматривать эти страницы и извлекать

номера страниц внизу сайта GeeksforGeeks

Читайте также: