Простой веб-парсинг с помощью Python и BeautifulSoup

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

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

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

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

Соревнование

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

Веб-сайт для парсинга

Мы, вероятно, можем просто зайти на любой веб-сайт, чтобы найти эти цитаты, но мы будем использовать этот веб-сайт для списка цитат. Теперь наш клиент хочет, чтобы эти цитаты были отформатированы в простую электронную таблицу. Итак, теперь у нас есть выбор: либо ввести пятьдесят две цитаты и их авторов в электронную таблицу, либо мы можем использовать Python и BeautifulSoup, чтобы сделать все это за нас. Поэтому для экономии времени и простоты мы предпочли бы использовать Python и BeautifulSoup.

Запуск BeautifulSoup

Давайте начнем с открытия любой IDE, которую вы предпочитаете, но мы будем использовать Jupyter Notebook. (Код Github для всего этого будет доступен в конце статьи).

Импорт библиотек Python

Начнем с импорта библиотек, необходимых для BeautifulSoup:

from bs4 import BeautifulSoup as bs
import pandas as pd
pd.set_option('display.max_colwidth', 500)
import time
import requests
import random

Доступ к веб-сайту

Затем нам нужно будет фактически получить доступ к веб-сайту, чтобы BeautifulSoup смог проанализировать его, запустив следующий код:

page = requests.get("http://quotes.toscrape.com/")
page
# <Response [200]>

Это возвращает код состояния ответа, позволяющий нам узнать, был ли запрос успешно выполнен. Здесь мы ищем Response [200], что означает, что мы успешно достигли веб-сайта.

Разбор веб-сайта

Здесь мы будем разбирать сайт с помощью BeautifulSoup.

soup = bs(page.content)
soup

Запуск этого кода вернет то, что выглядит как напечатанный текстовый документ в HTML-коде, который выглядит следующим образом:

Мы можем перемещаться по разобранному выше документу с помощью BeautifulSoup.

Навигация по супу

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

Самый простой способ найти то, что мы ищем, - это:

  • Переход на веб-страницу и поиск нужной информации (в нашем случае цитаты).
  • Выделите эту информацию (цитату)
  • Щелкните его правой кнопкой мыши и выберите Проверить.

Появится новое окно, которое будет выглядеть так:

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

HTML-информация для навигации

Основываясь на выделенном HTML-коде, мы можем использовать эту информацию для навигации по супу. Мы будем использовать атрибут .find_all() в нашем собственном коде, чтобы потенциально найти цитаты, которые мы ищем. Этот атрибут сможет вернуть нам желаемую строку (или строки) кода на основе любых аргументов, которые мы ему даем. Поскольку мы видим, что HTML-код цитаты содержит class=“text”, мы можем использовать это в нашем коде BeautifulSoup:

soup.find_all(class_='text')

Выполнение этого кода вернет следующие результаты:

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

Чтобы получить только текст и исключить ненужный код, нам нужно будет использовать атрибут .text в каждом результате. Для этого нам придется перебирать список, используя цикл «for»:

quotes = [i.text for i in soup.find_all(class_='text')]
quotes

Это даст нам список цитат без соответствующего HTML-кода:

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

authors = [i.text for i in soup.find_all(class_='author')]

Доступ к нескольким страницам

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

Обратите внимание, что URL-адрес каждой новой страницы содержит изменяющееся значение:

  • http://quotes.toscrape.com/page/2/
  • http://quotes.toscrape.com/page/3/
  • и т.п.

Зная это, мы можем создать простой список URL-адресов для перебора, чтобы получить доступ к различным страницам на веб-сайте:

urls=[f"http://quotes.toscrape.com/page/{i}/" for i in range(1,11)]
urls

Это возвращает список веб-сайтов, которые мы можем использовать:

Из этого списка мы можем создать еще один цикл «for», чтобы собрать необходимое количество цитат и их авторов.

Как избежать обнаружения парсинга

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

Сгенерируйте список значений:

rate = [i/10 for i in range(10)]

Затем в конце каждого цикла введите следующий фрагмент кода:

time.sleep(random.choice(rate))

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

Собираем все вместе

Теперь, когда у нас есть все части, мы можем построить последний цикл «for», который соберет не менее 52 цитат и их авторов:

Как только мы запустим приведенный выше код, мы получим список цитат и список авторов. Однако наш клиент хочет, чтобы котировки были в электронной таблице. Чтобы удовлетворить этот запрос, нам придется использовать библиотеку Python: Pandas.

Ввести списки в Pandas DataFrame очень просто:

# Creating a DataFrame to store our newly scraped information
df = pd.DataFrame()
# Storing the quotes and authors in their respective columns
df['Authors'] = authors
df['Quotes'] = quotes

Поскольку цитаты и авторы были извлечены по порядку, их будет легко ввести в DataFrame.

После того, как мы закончили и запустили приведенный выше код, окончательный DF будет выглядеть так:

Превосходно! DF отлично выглядит и находится в точном формате, запрошенном заказчиком. Затем мы можем сохранить DF как файл электронной таблицы Excel, который затем мы можем отправить нашему клиенту.

Закрытие

Мы надеемся, что вы узнали немного о парсинге веб-страниц из этого пошагового руководства. Несмотря на то, что пример, который мы использовали, может быть довольно простым, используемые методы все равно будут применимы ко многим различным веб-сайтам по всему Интернету. Для более сложных веб-сайтов, требующих активного взаимодействия с пользователем, потребуется еще одна библиотека Python под названием Selenium. Однако большинству веб-сайтов BeautifulSoup понадобится только для очистки данных. Прохождения, которое мы здесь сделали, должно быть достаточно, чтобы вы начали. Удачного соскабливания!

Github