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

Автор:

Реакция

Комментарий

Хотите погрузиться в мир скраппинг но при этом не увязнуть в сложных кодах?

С Python и библиотека BeautifulSoup, вы можете легко извлекать и организовывать данные d’un site web en quelques lignes seulement.

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

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

✅ Avant de vous lancer, il est important d’avoir quelques основы программирования. Это позволит вам лучше понять, как работает код. Pas besoin d’être expert, mais savoir lire et exécuter un script Python vous aidera beaucoup.

Далее, вот что вам нужно сделать в первую очередь сделать скраппинг на Python с BeautifulSoup :

  • ✔ Установить Python ainsi qu’un environnement de développement.
  • ✔ Установить pip, l’outil qui permet d’ajouter facilement des bibliothèques Python.
  • ✔ Установить BeautifulSoup с помощью команды :
pip install beautifulsoup4
  • ✔ Установить Запросы для получения веб-страниц с помощью команды :
pip install requests

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

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

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

Проект : récupérer le titre d’une page et tous les liens qu’elle contient.

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

Для проведения HTTP GET запрос на URL, используйте Запросы.

📌 Когда вы отправляете HTTP-запрос с помощью Requests, сервер всегда возвращает код состояния. Эти коды показывают, был ли запрос успешным или нет.

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

С Запросы, vous pouvez vérifier le résultat d’une requête grâce à l’attribut .status_code. Вот пример кода, который отправляет запрос на bonjour.comкоторый проверяет код состояния и отображает выдержку из 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

Quand vous récupérez le contenu d’une page avec Запросы (ответ.текст), вы получите символьную строку, содержащую весь HTML-код страницы. Чтобы легко манипулировать этим HTML, мы используем BeautifulSoup создать объект BeautifulSoup.
📌 Когда вы передаете необработанный HTML в BeautifulSoup, вам нужно указать парсер (например: "html.parser). Cela permet à BeautifulSoup d’interpréter correctement le HTML et d’éviter les avertissements.
из bs4 import BeautifulSoup
импортировать запросы

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

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

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

После преобразования HTML в BeautifulSoupвы можете начать поиск и извлечение интересующих вас данных (HTML-теги).

  • Используйте найти() а также 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", id="main")

# Получение всех ссылок с определенным классом
nav_links = soup.find_all("a", class_="nav-link")
  • Используйте селекторы CSS с select()

Для более точного поиска используйте select() с помощью селекторов CSS.

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

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

Les Селекторы CSS sont très puissants si vous voulez cibler exactement certaines parties d’une page sans parcourir tout le HTML manuellement.

Comment extraire des données d’un tableau HTML avec BeautifulSoup ?

Извлечение данных из HTML-таблицы с помощью BeautifulSoup.
Extraire des données d’un tableau HTML avec BeautifulSoup. ©Christina pour Alucare.fr

Jusqu’ici, nous avons vu comment récupérer des titres, des liens ou encore du texte dans une page web.

⚠ Mais souvent, les vrais cas d’utilisation sont plus complexes : извлечение структурированных данных comme des tableaux ou des listes, la gestion de la pagination ou encore la résolution d’erreurs fréquentes liées au scraping. C’est exactement ce que nous allons voir ensemble.

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

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

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

      Когда бы вы ни захотели извлечение таблицы HTMLПринцип прост:

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

      Для Список HTML (

        или
          с
        1. ) :

          • ✅ Найти все теги
          • с найти_все.
          • ✅ Получите их содержимое (текст или ссылку) и добавьте его в список Python.

          В итоге :

          Метки <table>, <tr>, <th>, <td> используются для восстановления таблицы.
          Метки

            /
              ,
            1. используются для преобразования HTML-списка в список 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) # ["Яблоко", "Банан", "Апельсин"]

              Здесь каждый

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

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

              Часто данные не умещаются на одной странице. Они распределяются по нескольким страницам с помощью “page suivante” или нумерованная пагинация (?page=1, ?page=2, ...).

              📌 В обоих случаях вы должны скручивание (просмотр в цикле), чтобы получить все страницы и объединить данные.

              Пример с параметром страницы :

              время импорта
              импортировать запросы
              из 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)

              Краткое объяснение:

              • Préparer l’URL avec un emplacement {} pour insérer le numéro de la page.
              BASE_URL = "https://bonjour.com/articles?page={}
              • Certains sites bloquent les requêtes sans “identité de navigateur”. Ajouter un User-Agent évite d’être pris pour un bot.
              headers = {"User-Agent": "Mozilla/5.0"}
              requests.get(url, headers=headers) 
              • Петляйте со страницы 1 по 5.
              for page in range(1, 6):
              • Извлеките HTML из страницы.
              requests.get(url)
              • Ограничьте время ожидания, если сайт не отвечает.
              requests.get(url, timeout=20)
              • Парсер страницы.
              BeautifulSoup(response.text, "html.parser")
              • Récupérer tous les titres d’articles.
              find_all("h2", class_="title")
              • Добавьте найденные элементы в глобальный список.
              all_articles.extend(articles)
              • Введите паузу между каждым запросом, чтобы не перегружать сервер и не быть забаненным.
              time.sleep(1.0)
              • После петли, all_articles содержит все 5 названий страниц.

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

              ❗ Le scraping, ce n’est pas toujours appuyer sur un bouton et tout est bon. Vous pourrez rencontrer des obstacles fréquents comme :

              • Ошибки HTTP

              404 страница не найдена
              403 нет доступа
              500 ошибка на стороне сервера

              Пример :

              response = requests.get(url)
              если response.status_code == 200:
                  # Страница OK
                  print("Страница получена успешно")
              elif response.status_code == 404:
                  print("Ошибка: страница не найдена")
              else:
                  print("Код возвращен:", response.status_code)
              
              • Сайты, блокирующие скраппинг

              Certains détectent les requêtes automatiques et bloquent l’accès.

              • Динамические страницы (JavaScript)

              BeautifulSoup читает только статический HTML. Если страница загружает свой содержание с помощью JavaScriptвы ничего не увидите.

              ✅ В этом случае используйте такие инструменты, как Селен Где Драматург.

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

              • ✔ Уважайте файл robots.txt d’un site web.
              • ✔ Установите сроки между запросами, чтобы не перегружать сервер (с помощью time.sleep()).
              • ✔ Использование прокси и поворачивайте их.
              • ✔ Регулярно меняйте Агент пользователя.

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

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

              Напоминание : BeautifulSoup est un excellent analyseur HTML, mais il ne peut pas exécuter JavaScript d’une page web. C’est là que Selenium devient votre allié !

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

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

              Ici, au lieu d’utiliser la bibliothèque Request, on va utiliser Селен. Pour l’installer, il faut passer par pip.

              pip install selenium beautifulsoup4 

              Далее вам нужно загрузить и установить WebDriver которая соответствует версии вашего браузера (например, ChromeDrive для Google Chrome).

              ✅ Vous pouvez soit le placer dans le même dossier que votre script Python, soit l’ajouter à la variable d’environnement PATH вашей системы.

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

              Прежде всего, вам необходимо импортировать webdriver из Selenium для управления браузером.

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

              On lance ensuite un navigateur. C’est lui qui ouvrira la page web et выполнит JavaScript (Пример: Chrome).

              driver = webdriver.Chrome() 

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

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

              Si la page met du temps à afficher certains éléments, vous pouvez dire à Selenium d’attendre un peu.

              driver.implicitly_wait(10) 

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

              После загрузки страницы вы можете получить файл Полная версия (исходный код HTML после выполнения JS).

              html_content = driver.page_source 

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

              Passez maintenant ce code source à BeautifulSoup pour pouvoir l’exploiter :

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

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

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

              Très important : fermez toujours votre navigateur après l’exécution pour libérer les ressources !

              driver.quit() 

              ✅ Вот и все! Теперь вы можете использовать возможности Selenium для имитация человеческой навигации (clics, défilements, etc.) avec l’efficacité de BeautifulSoup pour l’analyse du code HTML.

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

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

              Il n’y a pas vraiment de meilleur outil universel, mais plutôt des solutions adaptées selon votre projet.

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

              🔥 Scrapy : c’est un framework complet, pensé pour gérer de gros volumes de données avec des fonctionnalités avancées.

              🔥 Драматург : parfait pour les sites complexes générés par JavaScript, car il simule un vrai navigateur et permet d’interagir avec la page comme un humain.

              Как использовать BeautifulSoup для извлечения содержимого из тегов <div> ?

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

              1. Получите страницу с помощью Requests, а затем проанализируйте ее с помощью BeautifulSoup.
              из bs4 import BeautifulSoup
              импортировать запросы
              
              url = "URL_OF YOUR_SITE" # Замените на реальный URL
              response = requests.get(url)
              html_content = response.text
              
              soup = BeautifulSoup(html_content, "html.parser")
              1. Используйте select() передав ему свой CSS-селектор, который будет нацелен на тег <div>

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

              Пример HTML:

              <div class="article">
                <h2>Название статьи</h2>
                <p>Вот что говорится в этом параграфе.</p>
              </div>

              Пример с CSS :

              # Получите первый div с классом "article"
              div_article = soup.select_one("div.article")
              
              # Отобразите его текстовое содержимое
              if div_article:
              print(div_article.get_text(strip=True))

              Здесь селектор CSS имеет вид div.article.

              1. Extraire des éléments à l’intérieur de la <div>
              # Получение заголовка внутри div
              title = soup.select_one("div.article h2").get_text()
              
              # Извлечение абзаца из div
              paragraph = soup.select_one("div.item p").get_text()
              
              print("Заголовок:", title)
              print("Параграф:", paragraph)

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

              Эти две библиотеки дополняют друг друга.

              1. Requests récupère le contenu d’une page web avec une requête HTTP.

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

              запросы на импорт
              
              url = "https://sitecible.com"
              response = requests.get(url) # HTTP-запрос
              print(response.text) # отображает необработанный HTML

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

              1. BeautifulSoup анализирует этот HTML-контент, чтобы извлечь то, что вас интересует.

              Elle prend le HTML brut et le transforme en une structure organisée. Grâce à ça, vous pouvez naviguer facilement à l’intérieur du HTML : faire du repérage, extraire et récupérer les données.

              из bs4 import BeautifulSoup
              
              soup = BeautifulSoup(response.text, "html.parser") # разбирает HTML
              title = soup.find("h1").get_text() # извлекает содержимое файла <h1>
              print(title)

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

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

              Ces sites utilisent JavaScript pour charger dynamiquement les données. Or, BeautifulSoup ne permet pas d’анализировать данные, отображаемые с помощью JavaScript.

              В этом случае вам следует обратиться к таким инструментам, как Драматург Где Селен.

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

              BeautifulSoup joue le rôle d’Парсер HTML.

              Il prend le code source d’une page sous forme de texte brut et le transforme en un objet structuré que vous pouvez parcourir facilement.

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

              Веб-скрепинг: BeautifulSoup против Scrapy?

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

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

              Pour tout résumé, BeautifulSoup facilite l’Извлечение данных из HTML в Python. Эта библиотека идеально подходит для новичков, так как позволяет быстро и легко выполнять скрапбукинг.

              В противном случае, если вы не хотите отсутствие кодировки, l’outil complet Яркие данные также является отличным решением для веб-скреппинга.

              👉 А теперь расскажите нам в комментариях, что вам удалось наскрести!

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

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


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

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