Парсинг текста: пошаговое руководство

В этом руководстве описывается парсинг текста в Python, от настройки до хранения данных, а также советы по использованию прокси-серверов для предотвращения блокировок IP-адресов.
5 min read
Text scraping tutorial blog image

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

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

Предварительные условия

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

  • Последняя версия Python и pip должны быть установлены в вашей системе.
  • Виртуальная среда Python. Убедитесь, что вы установили все необходимые пакеты в виртуальной среде, включая requests для загрузки HTML-содержимого веб-страницы, Beautiful Soup для анализа и извлечения нужного текста или данных из HTML и pandas для организации и хранения извлеченных данных в структурированном формате, например в CSV-файле.The new

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

Понимание структуры веб-сайта

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

Каждый фрагмент контента, будь то заголовок, абзац или ссылка, заключен в теги HTML. Эти теги помогают определить, где находятся данные, парсинг которых вы хотите выполнить. Например, в этом примере вы копируете цитаты из «Цитаты для парсинга» на фиктивный сайт. Чтобы просмотреть структуру этого сайта, вам необходимо открыть его в браузере и получить доступ к Инструментам разработчика , нажав на страницу правой кнопкой мыши и выбрав «Просмотр кода страницы» или «Просмотреть код». Откроется HTML-код страницы:

Проверьте элемент в веб-браузере

Уделите некоторое время ознакомлению со структурой — ищите такие теги, как <div><span><p> и <a>, поскольку они часто содержат текст или ссылки, которые вы, возможно, захотите извлечь. Также обратите внимание, что теги обычно содержат атрибут class. Его цель — определить определенный класс для элемента HTML, позволяющий стилизовать его с помощью CSS или выбрать с помощью JavaScript.

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

Здесь каждая кавычка содержится в элементе div с классом quote. Если вас интересует текст и автор каждой цитаты, текст содержится в div с классом text, а автор содержится в элементе small с классом author:

HTML-структура цитаты

Если вы не знакомы с тем, как работает HTML, ознакомьтесь с этой статьей по веб-парсингу HTML, чтобы узнать больше.

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

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

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

Для начала создайте файл Python для скрипта парсинга текста с именем text-scraper.py. Затем импортируйте BeautifulSoup и requests:

import requests
from bs4 import BeautifulSoup

Укажите URL-адрес просматриваемого веб-сайта и отправьте запрос GET:

# URL of the quotes website
url = 'https://quotes.toscrape.com/'

# Send a GET request to the URL
response = requests.get(url)

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

soup = BeautifulSoup(response.text, 'html.parser')

Найдите все элементы div , содержащие кавычки (то есть они относятся к классу quote ):

quotes = soup.find_all('div', class_='quote')

Создайте список для хранения цитат:

data = []

Затем извлеките текст и автора из каждой цитаты и сохраните их в списке data:

for quote in quotes:
    text = quote.find('span', class_='text').text.strip()
    author = quote.find('small', class_='author').text.strip()

    data.append({
        'Text': text,
        'Author': author
    })

Скрипт должен выглядеть примерно так:

import requests
from bs4 import BeautifulSoup

# URL of the quotes website
url = 'http://quotes.toscrape.com/'

# Send a GET request to the URL
response = requests.get(url)

# Create a BeautifulSoup object to parse the HTML
soup = BeautifulSoup(response.text, 'html.parser')

# Find all quote containers
quotes = soup.find_all('div', class_='quote')

# Extract data from each quote
data = []
for quote in quotes:
    text = quote.find('span', class_='text').text.strip()
    author = quote.find('small', class_='author').text.strip()

    data.append({
        'Text': text,
        'Author': author
    })

print(data)

Теперь пришло время запустить скрипт из вашего терминала:

# For Linux and macOS
python3 text-scraper.py

# For Windows
python text-scraper.py

Вы должны получить распечатанный список извлеченных цитат:

[{'Author': 'Albert Einstein',
  'Text': '"The world as we have created it is a process of our thinking. It '
        'cannot be changed without changing our thinking."'},
 {'Author': 'J.K. Rowling',
  'Text': '"It is our choices, Harry, that show what we truly are, far more '
        'than our abilities."'},
 {'Author': 'Albert Einstein',
  'Text': '"There are only two ways to live your life. One is as though '
        'nothing is a miracle. The other is as though everything is a '
        'miracle."'},
 {'Author': 'Jane Austen',
  'Text': '"The person, be it gentleman or lady, who has not pleasure in a '
        'good novel, must be intolerably stupid."'},
 {'Author': 'Marilyn Monroe',
  'Text': ""Imperfection is beauty, madness is genius and it's better to be "
        'absolutely ridiculous than absolutely boring."'},
 {'Author': 'Albert Einstein',
  'Text': '"Try not to become a man of success. Rather become a man of '
        'value."'},
 {'Author': 'André Gide',
  'Text': '"It is better to be hated for what you are than to be loved for '
        'what you are not."'},
 {'Author': 'Thomas A. Edison',
  'Text': ""I have not failed. I've just found 10,000 ways that won't work.""},
 {'Author': 'Eleanor Roosevelt',
  'Text': '"A woman is like a tea bag; you never know how strong it is until '
        "it's in hot water.""},
 {'Author': 'Steve Martin',
  'Text': '"A day without sunshine is like, you know, night."'}]

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

Использование прокси для анонимного парсинга

Прокси-серверы помогают избегать блокировок IP-адресов и капч и обходить их, меняя IP-адрес и создавая впечатление, что ваши запросы поступают из разных мест. Для использования прокси необходимо настроить метод request.get() для маршрутизации всех запросов через прокси-сервер.

В этом сценарии вы используете ротируемые прокси Bright Data, которые предоставляют доступ к более чем 72 миллионам IP-адресов из более чем 195 стран. Для начала создайте бесплатный аккаунт Bright Data, выбрав Начать бесплатное пробное использование в правом верхнем углу, заполнив регистрационную форму и нажав «Создать аккаунт»:

Форма регистрации в Bright Data

Создайте базовый резидентный прокси

Создав аккаунт Bright Data, войдите в систему и перейдите в раздел Прокси-серверы и парсинг . В разделе «Прокси-сети» найдите «Резидентные прокси» и нажмите «Начать»:

Панель управления right Data: раздел **Прокси и парсинг**

Вам будет предложено добавить новую зону для резидентного прокси. Сохраните все значения по умолчанию, назовите зону и нажмите «Добавить»:

Создайте новую резидентную прокси-зону

И это все, что нужно для создания новой резидентной прокси-зоны!

Чтобы использовать прокси-сервер, вам понадобятся учетные данные (т.е. имя пользователя, пароль и хост). Чтобы найти эти учетные данные, снова перейдите в раздел «Прокси-серверы и парсинг» и выберите только что созданную прокси-зону:

Список созданных прокси-зон

После нажатия на прокси-зону вы увидите панель управления зоной. В разделе «Авторизация» вы видите свои учетные данные:

Учетные данные прокси-зоны Bright Data

Обновите скрипт парсинга

Теперь, когда у вас есть учетные данные прокси-сервера, пора настроить прокси-сервер. Для начала сохраните свои учетные данные в виде переменных:

host = 'brd.superproxy.io'
port = 22225

username = 'brd-customer-<customer_id>-zone-<zone_name>'
password = '<zone_password>'

Затем создайте URL-адрес прокси-сервера из сохраненных учетных данных:

proxy_url = f'http://{username}:{password}@{host}:{port}'

Создайте конфигурацию прокси-сервера для запросов HTTP и HTTPS:

proxies = {
    'http': proxy_url,
    'https': proxy_url
}

И добавьте конфигурацию прокси к существующему вызову requests.get() :

response = requests.get(url, proxies=proxies)

На этом этапе ваш скрипт должен выглядеть так:

import requests
from bs4 import BeautifulSoup

# BrightData credentials
host = 'brd.superproxy.io'
port = 22225

username = 'brd-customer-<customer_id>-zone-<zone_name>'
password = '<zone_password>'

# Compose a proxy URL
proxy_url = f'http://{username}:{password}@{host}:{port}'

# Create a proxy configuration
proxies = {
    'http': proxy_url,
    'https': proxy_url
}

# URL of the quotes website
url = 'http://quotes.toscrape.com/'

# Send a GET request to the URL via the specified proxy
response = requests.get(url, proxies=proxies)

# Create a BeautifulSoup object to parse the HTML
soup = BeautifulSoup(response.text, 'html.parser')

# Find all quote containers
quotes = soup.find_all('div', class_='quote')

# Extract data from each quote
data = []
for quote in quotes:
    text = quote.find('span', class_='text').text.strip()
    author = quote.find('small', class_='author').text.strip()

    data.append({
        'Text': text,
        'Author': author
    })

print(data)

Запустите и протестируйте скрипт

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

Импортируйте необходимые библиотеки и присвойте URL-адресу значение "http://lumtest.com/myip.json" в скрипте:

import requests
from bs4 import BeautifulSoup

url = "http://lumtest.com/myip.json"

Отправьте запрос GET на URL-адрес без настройки прокси-сервера и создайте объект BeautifulSoup для ответа:

# Send a GET request to the URL
response = requests.get(url)

# Create a BeautifulSoup object to parse the HTML
soup = BeautifulSoup(response.text, 'html.parser')

Наконец, выведите объект soup :

print(soup)

Запустите этот скрипт. Затем в ответ вы получите информацию о своем IP-адресе и местоположении.

Для сравнения настройте запрос GET на использование прокси-сервера Bright Data, а все остальное оставьте без изменений:

# BrightData credentials
host = 'brd.superproxy.io'
port = 22225

username = 'brd-customer-hl_459f8bd4-zone-test_residential_proxy'
password = '8sdgouh1dq5h'

proxy_url = f'http://{username}:{password}@{host}:{port}'

proxies = {
    'http': proxy_url,
    'https': proxy_url
}

# Send a GET request to the URL
response = requests.get(url, proxies=proxies)

При запуске обновленного скрипта вы увидите, что в ответ получаете другой IP-адрес; это не ваш фактический IP-адрес, а IP-адрес настроенного вами прокси-сервера. По сути, вы скрываете свой IP-адрес за одним из прокси-серверов.

Хранение данных

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

Чтобы сохранить полученные в ходе парсинга данные в CSV-файл, начните с импорта библиотеки pandas (в верхней части скрипта парсинга), поскольку в ней есть методы преобразования данных в формат CSV:

import pandas as pd

Затем создайте объект pandas DataFrame из собранных вами данных:

df = pd.DataFrame(data)

Наконец, преобразуйте DataFrame в CSV-файл и присвойте ему имя (напримерquotes.csv):

df.to_csv('quotes.csv', index=False)

После внесения этих изменений запустите скрипт. Затем вы получаете очищенные данные, сохраненные в CSV-файле.

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

Вы можете начать с изучения описательной статистики, используя функцию pandas describe() . Эта функция обеспечивает быстрый обзор числовых данных, включая среднее значение, медиану и стандартное отклонение. Вы можете визуализировать данные с помощью Matplotlib или seaborn для создания гистограмм, точечных диаграмм или гистограмм, помогающих визуально идентифицировать закономерности или тренды. Что касается текстовых данных, попробуйте использовать методы обработки естественного языка, такие как анализ частоты слов или анализ настроений, чтобы понять общие темы или общее мнение в отзывах или комментариях.

Чтобы получить более глубокое представление, ищите корреляции между различными переменными в наборе данных. Например, вы можете изучить взаимосвязь между рейтингом книг и объемом рецензии или проанализировать, как оценки различаются в разных жанрах или авторах. Используйте функцию pandas groupby() для агрегирования данных и сравнения показателей по категориям.

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

Заключение

Из этого урока вы узнали, как парсить текст на Python, изучили преимущества использования прокси и узнали, как ротируемые прокси Bright Data помогают избежать блокировок IP-адресов и сохранить анонимность.

Хотя разработка собственных решений для парсинга может быть полезной, она часто сопряжена с такими проблемами, как поддержка кода, обработка капч и соблюдение политик веб-сайта. Здесь могут помочь API парсинга Bright Data. Благодаря таким функциям, как автоматическое решение капч, ротация IP-адресов и надежный анализ данных, Bright Data упрощает процесс парсинга и позволяет сосредоточиться на анализе данных, а не на управлении инфраструктурой.

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

Кредитная карта не требуется