Как сделать веб-скрепинг на Python с помощью BeautifulSoup?

Автор:

Реакция

Комментарий

Сделать скраппинг в Python с помощью BeautifulSoup, тебе понадобятся две библиотеки: requests чтобы загрузить веб-страницу, и beautifulsoup4 для извлечения данных из HTML-кода.

Установи их с помощью команды pip install requests beautifulsoup4, а затем следуйте приведенному ниже руководству, чтобы шаг за шагом выполнить скрапинг сайта.

Скрипт на Python для веб-парсинга с использованием BeautifulSoup для извлечения данных с веб-страницы
Веб-скрепинг на Python с помощью BeautifulSoup. Кристина для Alucare.fr

Необходимые условия для скраппинга на Python с помощью BeautifulSoup

Прежде чем приступить к работе, тебе не нужно быть экспертом. Достаточно уметь читать и выполнять скрипт Python этого вполне достаточно для начала.

Вот что нужно установить, чтобы начать работу:

  • Установить Python а также среду разработки.
  • Установить pip, инструмент, позволяющий добавлять библиотеки Python одним командным запросом.
  • Установить BeautifulSoup :
pip install beautifulsoup4

Обратите внимание на название пакета: на PyPI, это верно beautifulsoup4 что нужно написать. Модуль, который ты импортируешь в свой код, называется bs4.

  • Установить Requests чтобы скачать веб-страницы:
pip install requests
  • Установить lxml (необязательно) — более быстрый парсер, который BeautifulSoup использует для анализа HTML:
pip install lxml

Как сделать веб-скреппинг с помощью Python и BeautifulSoup?

Вот полный проект по восстановлению название веб-страницы и все ссылки которую она содержит.

Скрипт на Python для веб-парсинга с использованием библиотеки BeautifulSoup для извлечения данных из HTML
Веб-парсинг на Python с помощью BeautifulSoup. ©Christina для Alucare.fr

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

Чтобы загрузить веб-страницу, нужно отправить HTTP GET запрос на URL-адрес. Именно в этом заключается роль библиотеки Requests.

При каждом запросе сервер возвращает код статуса который показывает, всё ли прошло нормально. Основные, о которых нужно знать:

  • 200 успех.
  • 301 / 302 перенаправление.
  • 404 Страница не найдена.
  • 500 внутренняя ошибка сервера.

С Requests, ты проверяешь этот результат с помощью атрибута .status_code. Вот конкретный пример: этот код отправляет запрос на сайт, проверяет код статуса, а затем, если всё в порядке, выводит фрагмент HTML-кода.

запросы на импорт

# Целевой URL
url = "https://bonjour.com"

# Отправляем GET-запрос
response = requests.get(url)

# Проверка кода состояния
if response.status_code == 200:
    print("Success: the page has been retrieved!")
    html = response.text # HTML-содержимое страницы
    print("Извлечение HTML-содержимого:")
    print(html[:500]) # отображает только первые 500 символов
else:
    print(f "Ошибка: код состояния {код_ответа.статус_код}")

Шаг 2: Проанализируйте HTML-код с помощью BeautifulSoup

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

Всегда указывает на парсер, например "html.parser. BeautifulSoup при этом корректно интерпретирует HTML, не выводя никаких предупреждений. Ты также можешь использовать lxml, более быстрая, которую нужно установить отдельно.

из bs4 import BeautifulSoup
импортировать запросы

url = "https://bonjour.com"
response = requests.get(url)
html = response.text

# Рекомендуется указывать парсер
soup = BeautifulSoup(html, "html.parser")

Шаг 3: Поиск и извлечение элементов

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

Использование функций find() и find_all()

найти() возвращает первый элемент найден. find_all() возвращает полный список соответствующие элементы.

# Получить название <h1>
h1 = soup.find("h1")
print(h1.get_text())

# Получить все ссылки <a>
liens = soup.find_all("a")
for lien in liens:
    print(lien.get_text(), lien.get("href"))

Адресация элементов по атрибутам

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

# Получить элемент div с определенным идентификатором
container = soup.find("div",)

# Получить все ссылки с определённым классом
liens_nav = soup.find_all("a", class_="nav-link")

Использование CSS-селекторов с функцией select()

Для более точного поиска можно использовать следующий метод select() принимает Селекторы CSS. Ты можешь точно выделить определенные части страницы, не просматривая весь HTML-код вручную.

# Все ссылки в заголовках статей
article_links = soup.select("article h2 a")

# Все <a> чей атрибут href начинается с "http".
links_http = soup.select('a[href^="http"]')

Как извлечь данные из HTML-таблицы с помощью BeautifulSoup?

Извлечение данных из HTML-таблицы с помощью BeautifulSoup в Python
Извлечение данных из HTML-таблицы с помощью BeautifulSoup. ©Christina для Alucare.fr

Реальные сценарии использования зачастую сложнее, чем просто получение заголовка или ссылки. Тебе придётся обрабатывать…’извлечение структурированных данных как таблицы и списки, так и разбиение на страницы, а также распространённые ошибки при скрапинге.

Извлечение таблиц и списков

Веб-сайты часто представляют свои данные в Таблицы HTML (<table>, <tr>, <th>, <td>) или списки (

    /
      с
    1. ). Чтобы преобразовать эти структуры в данные, пригодные для обработки, тебе нужно проходить их строка за строкой или элемент за элементом.

      Чтобы извлечь HTML-таблицаПринцип прост:

      • Получить заголовки (<th>) для определения заголовков столбцов.
      • Просмотреть каждую строку (<tr>) и поиск ячеек (<td>), в которых содержатся данные.
      • Сохранить информацию в списке или словаре.

      Для Список HTML (

        Где
          ) :

          • Выделить все теги
          • с find_all.
          • Извлечь их содержимое (текст или ссылку) и добавить его в список в Python.

          Вот пример с таблицей:

          html = """
          <table>
            <tr>
              <th>Фамилия</th>
              <th>Возраст</th>
              <th>Городок</th>
            </tr>
            <tr>
              <td>Алиса</td>
              <td>25</td>
              <td>Париж</td>
            </tr>
            <tr>
              <td>Боб</td>
              <td>30</td>
              <td>Лион</td>
            </tr>
          </table>
          """
          
          # Создайте объект BeautifulSoup
          soup = BeautifulSoup(html, "html.parser")
          
          # Извлеките заголовки из массива
          headers = [th.get_text(strip=True) for th in soup.find_all("th")]
          print("Заголовки:", headers)
          
          # Извлеките строки данных (пропустите 1-ю строку, так как это заголовки)
          rows = []
          for tr in soup.find_all("tr")[1:]:
              cells = [td.get_text(strip=True) for td in tr.find_all("td")]
              if cells:
                  rows.append(cells)
          
          print("Строки :", rows)
          

          Вот, find_all("th") извлекает заголовки а также find_all("td") извлекает ячейки из каждой строки. Ты проходишь по циклу по <tr> чтобы перестроить таблицу строка за строкой.

          Вот пример, основанный на списке:

          из bs4 import BeautifulSoup
          
          html_list = """
          
          • Яблоко
          • Банана
          • Апельсин
          """ soup = BeautifulSoup(html_list, "html.parser") # Получение элементов из списка items = [li.get_text(strip=True) for li in soup.find_all("li")] print("Извлеченный список:", items) # ["Яблоко", "Банан", "Апельсин"]

          Каждый

        1. непосредственно преобразуется в элемент списка в Python, что дает следующий результат ["Яблоко", "Банан", "Апельсин"]..

          Управление пагинацией и ссылками

          Часто данные не помещаются на одной странице. Они распределяются с помощью ссылок на «следующая страница» или нумерованная пагинация (?page=1, ?page=2, и т. д.). В обоих случаях тебе нужно скручивание чтобы загрузить все страницы и объединить данные.

          Пример с параметром «page»:

          время импорта
          импортировать запросы
          из bs4 import BeautifulSoup
          
          # Пример URL с пагинацией
          BASE_URL = "https://bonjour.com/articles?page={}"
          HEADERS = {"User-Agent": "Mozilla/5.0"}
          
          all_articles = []
          
          # Предположим, что есть 5 страниц для просмотра
          for page in range(1, 6):
              url = BASE_URL.format(page)
              r = requests.get(url, headers=HEADERS, timeout=20)
              if r.status_code == 200:
                  soup = BeautifulSoup(r.text, "html.parser")
                  # Извлечение заголовков статей
                  articles = [h2.get_text(strip=True) for h2 in soup.find_all("h2", class_="title")]
                  all_articles.extend(articles)
              else:
                  print(f "Ошибка на странице {page} (код : {r.status_code})")
              time.sleep(1.0) # вежливость
          
          print("Получено статей:", all_articles)

          Краткое пошаговое объяснение:

          • Подготовиь’URL с парковочным местом {} чтобы вставить номер страницы.
          BASE_URL = "https://bonjour.com/articles?page={}
          • Некоторые сайты блокируют запросы без указания идентификатора браузера. Добавьте User-Agent не дайте себя принять за бота.
          headers = {"User-Agent": "Mozilla/5.0"}
          requests.get(url, headers=headers) 
          • Завершение страницы От 1 до 5.
          for page in range(1, 6):
          • Извлекает HTML-код страницы с помощью requests.
          requests.get(url)
          • Сокращает время ожидания, если сайт не отвечает (таймаут продолжительностью 20 секунд).
          requests.get(url, timeout=20)
          • Проанализировать страницу с помощью BeautifulSoup.
          BeautifulSoup(response.text, "html.parser")
          • Извлекает все названия статей.
          find_all("h2", class_="title")
          • Добавляет найденные статьи в общий список.
          all_articles.extend(articles)
          • Введи перерыв между каждым запросом, чтобы не перегружать сервер и избежать блокировки.
          time.sleep(1.0)

          После петли, all_articles содержит все 5 названий страниц.

          Распространенные ошибки и проблемы

          Скрапинг — это не просто нажатие кнопки. Тебе придётся сталкиваться с такими распространёнными препятствиями:

          • Ошибки HTTP : 404 (страница не найдена), 403 (доступ запрещен) и 500 (ошибка на стороне сервера).

          Пример управления:

          response = requests.get(url)
          if response.status_code == 200:
              print("Страница успешно загружена")
          elif response.status_code == 404:
              print("Ошибка: страница не найдена")
          else:
              print("Вернутый код:", response.status_code)
          
          • Сайты, блокирующие скраппинг : некоторые из них обнаруживают автоматические запросы и блокируют доступ.
          • Динамические страницы (JavaScript) : BeautifulSoup читает только Статический HTML. Если страница загружает своё содержимое с помощью JavaScript, ты ничего не увидишь. В этом случае тебе нужно воспользоваться таким инструментом, как Selenium Где Playwright.

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

          • Соблюдайте файл robots.txt сайта, который ты хочешь проанализировать.
          • Введи сроки между запросами с помощью time.sleep() чтобы не перегружать сервер.
          • Использует прокси и запусти их.
          • Регулярно меняй свой User-Agent.

          Как с помощью Selenium и BeautifulSoup отсканировать веб-страницы?

          Веб-парсинг с помощью Selenium и BeautifulSoup в браузере Chrome на языке Python.
          Веб-скрепинг с помощью Selenium и BeautifulSoup в Chrome. Кристина для Alucare.fr

          Selenium управлять настоящим браузером, выполняет код JavaScript и отображает страницу так, как если бы по ней перемещался человек. BeautifulSoup Затем анализируй HTML-код после полного отображения страницы и извлекай все нужные тебе данные.

          Шаг 1: Установите Selenium и BeautifulSoup

          Здесь вместо requests, ты используешь Selenium чтобы загрузить содержимое страницы. Установите обе библиотеки с помощью следующей команды:

          pip install selenium beautifulsoup4

          Затем тебе нужно скачать WebDriver подходит для версии твоего браузера. Для Google Chrome это ChromeDriver. У тебя есть два варианта: поместить его в ту же папку, что и твой скрипт на Python, или’добавить в переменную окружения PATH твоей системы.

          Шаг 2: Настройка Selenium

          Начни с импорта webdriver с помощью Selenium для управления браузером.

          from selenium import webdriver
          from selenium.webdriver.common.by import By

          Затем запусти браузер. Именно он открывает страницу и выполняет код JavaScript, в данном случае Chrome.

          driver = webdriver.Chrome()

          Указывает браузеру, какая URL посетить.

          driver.get("https://www.exemple.com")

          Если страница долго загружает некоторые элементы, ты можешь попросить Selenium подождать до 10 секунд.

          driver.implicitly_wait(10)

          Шаг 3: Получение содержимого страницы

          Как только страница загрузится, ты получаешь Полная версия : исходный код HTML, полученный после выполнения JavaScript.

          html_content = driver.page_source

          Шаг 4: Анализ HTML с помощью BeautifulSoup

          Теперь передай этот исходный код в BeautifulSoup чтобы использовать его:

          from bs4 import BeautifulSoup
          
          # Создание объекта BeautifulSoup
          soup = BeautifulSoup(html_content, 'html.parser')
          
          # Пример: извлечение всех заголовков со страницы
          titres = soup.find_all('h2')
          for titre in titres:
              print(titre.get_text())

          BeautifulSoup предлагает такие мощные методы, как find(), find_all() и CSS-селекторы для выделять и извлекать конкретные элементы HTML.

          Шаг 5: Закрытие браузера

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

          driver.quit()

          Таким образом, ты объединяешь мощь Selenium за имитация человеческой навигации (клики, прокрутка) в сочетании с эффективностью BeautifulSoup при анализе HTML. Это идеальный способ для скрапинга сайта, данные которого загружаются с помощью JavaScript.

          Часто задаваемые вопросы

          Какой инструмент лучше всего подходит для веб-скреппинга на Python?

          Нет никакого’скребковый инструмент не универсальные, а решения, адаптированные к твоему проекту. Вот три наиболее популярных:

          • BeautifulSoup : простой и эффективный инструмент для анализа HTML и быстрого извлечения контента. Идеально подходит для новичков или для небольших проектов.
          • Scrapy : комплексный фреймворк, разработанный для управления большие объемы данных с расширенными функциями.
          • Playwright : идеально подходит для сложных сайтов, генерируемых с помощью JavaScript. Он имитирует работу настоящего браузера и взаимодействует со страницей так же, как человек.

          Как с помощью BeautifulSoup извлечь содержимое тега div?

          С BeautifulSoup, вы выбираете конкретный тег с помощью CSS-селектор. Чтобы извлечь содержимое тега <div>, выполните следующие действия.

          1. Загрузить веб-страницу с помощью requests, а затем проанализировать HTML с помощью BeautifulSoup.

          from bs4 import BeautifulSoup
          import requests
          
          url = "URL_DE_TON_SITE"  # Remplace par l'URL réelle
          reponse = requests.get(url)
          html_content = reponse.text
          
          soup = BeautifulSoup(html_content, "html.parser")

          2. Использовать метод select() с помощью твоего CSS-селектора для выделения тега <div>.

          Чтобы получить первый элемент, используй суп.select_one. Чтобы получить все элементы, используй суп.выбрать. Вот пример кода HTML:

          <div>
            <h2>Titre de l'article</h2>
            <p>Voici le contenu du paragraphe.</p>
          </div>

          А вот пример с использованием CSS-селектора div.article :

          # Récupérer le premier div avec la classe "article"
          div_article = soup.select_one("div.article")
          
          # Afficher son contenu texte
          if div_article:
              print(div_article.get_text(strip=True))

          3. Извлечь элементы, находящиеся внутри <div>.

          # Récupérer le titre à l'intérieur du div
          titre = soup.select_one("div.article h2").get_text()
          
          # Récupérer le paragraphe à l'intérieur du div
          paragraphe = soup.select_one("div.article p").get_text()
          
          print("Titre :", titre)
          print("Paragraphe :", paragraphe)

          Как можно использовать Requests и BeautifulSoup вместе?

          Эти две библиотеки — это дополнительно : одна загружает страницу, другая — анализирует её.

          1. requests отправляет HTTP-запрос и загружает неформатированный HTML-код страницы.

          import requests
          
          url = "https://sitecible.com"
          response = requests.get(url)  # requête HTTP
          print(response.text)  # affiche le HTML brut

          На данном этапе у тебя есть только огромный текст, заполненный тегами (<html>, <div>, <p>и т.д.).

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

          from bs4 import BeautifulSoup
          
          soup = BeautifulSoup(response.text, "html.parser")  # analyse le HTML
          titre = soup.find("h1").get_text()  # extrait le contenu d'un <h1>
          print(titre)

          Почему мой код веб-скреппинга не работает на некоторых сайтах?

          Бывает, что твой скрипт ничего не извлекает. Некоторые сайты не предоставляют весь свой контент непосредственно в формате HTML: они используют JavaScript для динамической загрузки данных. Однако, BeautifulSoup не умеет анализировать данные, возвращаемые JavaScript. В таком случае тебе следует воспользоваться такими инструментами, как Playwright Где Selenium.

          Какую роль играет BeautifulSoup в веб-скреппинге?

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

          Веб-скрейпинг: BeautifulSoup или Scrapy?

          BeautifulSoup а также Scrapy действительно отличаются друг от друга, хотя оба служат для скраппинг.

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

          BeautifulSoup — идеальный выбор для начинающих: он делает’Извлечение данных из HTML в Python просто и быстро.

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

          👍Ваше мнение
          Статья информативна
          Статья объективна
          Статья отвечает на мой вопрос
          Содержание актуально
          🔍 Нашли ошибки? Скажите нам, где!

Понравилось? Поделитесь!

Это содержание изначально На французском (См. редактор чуть ниже). Он был переведен и вычитан на разных языках с помощью Deepl и/или Google Translate API, чтобы предложить помощь как можно большему числу стран. Этот перевод обходится нам в несколько тысяч евро в месяц. Если он не является 100 % идеальным, оставьте нам комментарий, чтобы мы могли его исправить. Если вы заинтересованы в вычитке и улучшении качества переведенных статей, пожалуйста, напишите нам, используя контактную форму!
Мы ценим ваши отзывы, чтобы улучшить наш контент. Если вы хотите предложить улучшения, пожалуйста, воспользуйтесь нашей контактной формой или оставьте комментарий ниже. Ваши комментарии всегда помогают нам улучшать качество нашего сайта Alucare.fr


Alucare является независимым СМИ. Поддержите нас, добавив в избранное Google News:

Опубликовать комментарий на дискуссионном форуме