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

Автор:

Реакция

Комментарий

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

С Python и библиотека BeautifulSoup, вы можете легко извлекать и организовывать данные веб-сайт всего в нескольких строчках.

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

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

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

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

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

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

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

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

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

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

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

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

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

С Запросы, вы можете проверить результат запроса с помощью атрибута .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

Когда вы извлекаете содержимое страницы с помощью Запросы (ответ.текст), вы получите символьную строку, содержащую весь HTML-код страницы. Чтобы легко манипулировать этим HTML, мы используем BeautifulSoup создать объект BeautifulSoup.
📌 Когда вы передаете необработанный HTML в BeautifulSoup, вам нужно указать парсер (например: "html.parser). Это позволяет BeautifulSoup правильно интерпретировать HTML и избежать предупреждений.
из 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 очень эффективны, если вы хотите точно нацелиться на определенные части страницы, не просматривая весь HTML вручную.

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

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

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

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

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

Веб-сайты часто представляют свои данные в Таблицы 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=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)

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

              • Подготовьте 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.get(url)
              • Ограничьте время ожидания, если сайт не отвечает.
              requests.get(url, timeout=20)
              • Парсер страницы.
              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)
              если response.status_code == 200:
                  # Страница OK
                  print("Страница получена успешно")
              elif response.status_code == 404:
                  print("Ошибка: страница не найдена")
              else:
                  print("Код возвращен:", response.status_code)
              
              • Сайты, блокирующие скраппинг

              Некоторые обнаруживают автоматические запросы и блокируют доступ.

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

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

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

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

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

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

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

              Напоминание : BeautifulSoup — отличный HTML-анализатор, но он не может выполнять JavaScript на веб-странице. Именно здесь Selenium становится вашим союзником!

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

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

              Здесь, вместо библиотеки Request, мы будем использовать Селен. Чтобы установить его, необходимо пройти через pip.

              pip install selenium beautifulsoup4 

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

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

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

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

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

              Затем запускается браузер. Он откроет веб-страницу и выполнит JavaScript (Пример: Chrome).

              driver = webdriver.Chrome() 

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

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

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

              driver.implicitly_wait(10) 

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

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

              html_content = driver.page_source 

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

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

              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: Закрытие браузера

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

              driver.quit() 

              ✅ Вот и все! Теперь вы можете использовать возможности Selenium для имитация человеческой навигации (клики, прокрутка и т. д.) с эффективностью BeautifulSoup для анализа HTML-кода.

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

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

              На самом деле не существует лучшего универсального инструмента, а есть решения, подходящие для вашего проекта.

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

              🔥 Scrapy : это полнофункциональный фреймворк, разработанный для управления большими объемами данных с помощью расширенных функций.

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

              Как использовать 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. Извлечение элементов внутри <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 извлекает содержимое веб-страницы с помощью HTTP-запроса.

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

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

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

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

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

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

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

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

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

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

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

              BeautifulSoup выполняет рольПарсер HTML.

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

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

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

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

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

              Вкратце, BeautifulSoup упрощаетИзвлечение данных из HTML в Python. Эта библиотека идеально подходит для новичков, так как позволяет быстро и легко выполнять скрапбукинг.

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

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

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

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


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

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