Изучите основы сбора данных с веб-сайтов и их хранения в DataFrames.

Неудивительно, что валюта для специалистов по данным - это данные. Данные - самая важная часть любого проекта в области науки о данных. Интернет предлагает почти бесконечный источник данных, если мы знаем, как получить к нему доступ. Это цель веб-скрапинга. Вы можете создать массивный набор обучающих данных для проекта машинного обучения, или собрать данные о ценах на Amazon для программы поиска выгодных покупок, или собрать данные о погоде для приложения - возможности безграничны. В этом руководстве мы рассмотрим основы веб-парсинга с помощью одной из самых популярных библиотек Python для работы - Beautiful Soup. Я рекомендую работать с Google Chrome и использовать Блокноты Jupyter для этого урока.

Установить и импортировать библиотеки

Прежде чем мы начнем, нам нужно установить наши пакеты, начиная с библиотеки Beautiful Soup. Библиотека запросов позволяет нам делать HTTP-запросы к веб-сайту, который мы собираемся очистить. Мы также собираемся записать данные, которые мы масштабируем, в Pandas DataFrame, поэтому нам тоже понадобится этот пакет.

pip install bs4
pip install requests
pip install pandas

После загрузки пакетов нам нужно будет импортировать их в наш Блокнот.

from bs4 import BeautifulSoup as bs
import requests
import Pandas as pd

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

Проверка элементов веб-сайта

Следующее, на что нам нужно взглянуть, - это проверить HTML-элементы веб-страницы. Эта функция позволит нам просмотреть код любой веб-страницы. В большинстве современных браузеров есть функция «проверки элементов», но я предпочитаю ее использовать в веб-браузере Google Chrome. Итак, перейдите на веб-страницу, которую вы хотите очистить, щелкните правой кнопкой мыши в любом месте страницы и выберите «Проверить».

Если навести указатель мыши на элементы HTML на панели, они выделят соответствующий раздел веб-страницы. Было бы неплохо попытаться найти код, который отвечает за данные, которые вы хотите получить от своего веб-сайта. Чтобы сделать это немного проще, вы можете щелкнуть правой кнопкой мыши по интересующей информации, а затем «проверить». Это приведет вас прямо к коду, поэтому вам не придется искать его.

Получите доступ к своей веб-странице и превратитесь в суп-объект

Теперь вернемся к Jupyter Notebook. Нам нужен доступ к веб-странице, которую мы собираемся очистить. Здесь мы используем библиотеку запросов. Я собираюсь очистить заголовки и веб-ссылки с веб-страницы Wellcome Trust's Teams.

wellcome = requests.get(“https://wellcome.org/about-us/teams”).text

Затем нам нужно превратить это в объект Beautiful Soup, который часто называют «супом». Сделать это:

soup = bs(wellcome, ‘lxml’)

Вы можете взглянуть на свой суп, выполнив:

print(soup.prettify())

Метод prettify () просто отформатирует код в более читаемую структуру.

Выбор нужного элемента на веб-странице

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

Итак, мы можем видеть иерархию расположения заголовков команд и ссылок. Информация находится в теге ‹div› верхнего уровня с классом «js-generic-container». Мы будем использовать эту информацию для сбора данных. Мы создадим новый суп "Команды" из нашего оригинального супа.

teams = soup.find(“div”, class_=”js-generic-container”)

Метод find будет искать первый тег div с class = «js-generic-container». Вот где мои данные. Прежде чем мы начнем парсить всю веб-страницу на предмет названий команд и веб-ссылок, мы соберем одну, а затем изменим код, чтобы перебрать все команды. Следующий код получит титул первой команды в супе команд. Последний .text дает нам только текст, исключая HTML-теги.

names = teams.div.ul.div.h4.a.text

На выходе

Drug-resistant infections team

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

links = teams.div.ul.div.h4.a
links.attrs[“href”]

Часть веб-ссылки (за исключением бита www.wellcome.org) сохраняется в атрибуте href.

Запишите свои данные во фрейм данных Pandas

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

df = pd.DataFrame(columns = [‘Team Name’,’Web Address’])
row = 0
for team in teams.find_all(“h4”):
    name = team.a.text
    print (name) 
    link = team.a.attrs[“href”]
    print(link)
    df.loc[row] = [name,”wellcome.org”+link]
    row+=1

Первая строка инициализирует новый DataFrame со столбцами Имя группы и Веб-адрес, и у нас есть строка row = 0, которая будет важна в цикле for.

Цикл for находит все теги «h4» из супа нашей команды. Имена команд и веб-ссылки заключены в теги «a», вложенные в теги «h4». Строка name = team.a.text собирает текст только из тега «a», поэтому название команды. Ссылка = team.a.attrs [«href»] собирает ссылки, хранящиеся в атрибуте href. Наконец, мы пишем имя и веб-ссылку в первую строку нашего DataFrame. Для веб-адреса в атрибуте href отсутствует бит адреса wellcome.org, поэтому мы добавляем эту строку перед каждым атрибутом href. Строка row + = 1 гарантирует, что мы записываем новые данные в следующую пустую строку нашего DataFrame. После экспорта DataFrame, запустив:

df.to_csv(r’/path/you/want/to/store/csv/File Name.csv’, index = False)

Вот как выглядит окончательный CSV-файл при открытии в Apple’s Numbers:

Вывод

Интернет - обширный источник данных. В этом руководстве рассматриваются некоторые основы веб-парсинга с помощью библиотеки Beautiful Soup. Эта библиотека может делать гораздо больше для сбора всех видов данных с веб-страниц. Данные можно легко записать в Pandas DataFrame для использования в любом проекте по науке о данных.