Добро пожаловать в учебное пособие Анализ веб-цен на акции в Python. В этом руководстве мы будем собирать данные в Интернете и строить на их основе таблицу. Этот метод полезен для сбора данных из источников неструктурированных данных. Тип данных, с которыми мы будем работать, - это цены на акции, относящиеся к финансовой отрасли.

Давай начнем!

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

Pandas - мы будем использовать фреймы данных pandas для его функций и для табличного представления нашего набора данных.

BeautifulSoup - для анализа документов HTML и XML. Мы будем использовать эту библиотеку для парсинга веб-страниц.

запросы - чтобы загрузить веб-страницу в формате HMTL.

В этом руководстве мы будем работать в записной книжке Jupyter, но вы можете использовать Python IDE по своему выбору.

Давайте импортируем наши библиотеки:

import pandas as pd
import requests
from bs4 import BeautifulSoup

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

page  = requests.get("https://www.fool.com/investing/top-stocks-to-buy.aspx")
page

Вывод:

‹Ответ [200]›

Мы будем работать с HTML-кодом страницы, поэтому давайте его рассмотрим:

page.content

Вывод:

Далее мы собираемся создать красивый объект супа и проанализировать его содержимое:

soup = BeautifulSoup(page.content, 'html.parser')

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

print(soup.prettify())

Вывод:

Как мы видим, текст HTML теперь доступен для чтения, что поможет нам идентифицировать теги HTML, содержащие нужные нам данные.

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

https://www.fool.com/investing/top-stocks-to-buy.aspx

Затем найдите раздел Акции на веб-сайте:

Наша основная цель - очистить список акций и построить на его основе набор данных. Итак, теперь давайте щелкните правой кнопкой мыши раздел Акции и выберите «проверить».

На изображении выше вы увидите, что заголовок «Акции» выделен. Теперь вы можете взаимодействовать с тегами, и вы увидите, что с левой стороны также будет выделен эквивалентный раздел, что позволяет нам точно знать, какой тег принадлежит какому разделу на веб-странице.

У каждой акции есть свой собственный элемент div, как показано ниже. Мы пройдемся по каждому элементу div, чтобы извлечь данные по каждой акции.

Затем нам нужно изолировать раздел Акции веб-страницы и создать подмножество содержимого нашей страницы, а затем сохранить его в переменной под названием акции. Для этого мы воспользуемся методом поиска объекта BeautifulSoup. Нам нужно будет проанализировать имя класса (‘related-tickers’) тега, который содержит раздел Акции.

stocks = soup.find(class_='related-tickers')
stocks

Вывод:

Теперь объект stocks содержит все наши данные, и нам нужно только сосредоточиться на нем, и мы можем игнорировать остальное содержимое страницы.

В нашем объекте stocks мы будем искать все теги с именем класса ‘ticker-text-wrap’. Это создаст список каждой акции, включая информацию о каждой акции, такую ​​как цена акции и т. Д. Мы сохраним список в переменной с именем stock_picks.

Ниже представлен предварительный просмотр раздела ticker-text-wrap div:

stock_picks = stocks.find_all(class_='ticker-text-wrap')
stock_picks

Вывод:

Теперь у нас есть все акции и информация о каждой акции, хранящаяся в списке, это позволит нам просматривать список и извлекать информацию по каждой акции.

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

# Get stock names
stock_names = []
for stock in stock_picks:
    stock_names.append(stock.h3.get_text())

stock_names

Вывод:

Следующее, что мы сделаем, это извлечем все символы акций:

# Get stock symbol
stock_symbol = []
for stock in stock_picks:
    stock_symbol.append(stock.a.span.get_text())

stock_symbol

Вывод:

Следующее, что мы сделаем, это извлечем текущую цену для каждой акции:

# Get Current Price
current_price = []
for stock in stock_picks:
    price = stock.aside.h4.get_text()
    current_price.append(price.strip())

current_price

Вывод:

Следующее, что мы сделаем, - это извлечем сумму изменения цены для каждой акции. Мы будем использовать объект stock вместо объекта stock_picks. Мы будем искать класс «цена-изменение-сумма», чтобы получить значения изменения цены.

price_change = stocks.find_all(class_='price-change-amount')
# Get Change Price
change_price = []
for change in price_change:
    price = change.get_text()
    change_price.append(price.strip())

change_price

Вывод:

Следующее, что мы сделаем, - это извлечем процент изменения цены каждой акции, используя тот же метод, который упоминался выше. Мы будем использовать объект цены акции вместо stock_picks.

percent_change = stocks.find_all(class_='price-change-percent')
# Get Change Percent
change_pct = []
for pct in percent_change:
    price = pct.get_text()
    change_pct.append(price.strip())

change_pct

Вывод:

Теперь мы извлекли все необходимые данные из каждой акции и сохранили значения в списках. Затем мы будем использовать эти списки для создания фрейма данных pandas.

Каждый список представляет собой поле в нашем фрейме данных, это имена полей, которые мы создадим:

Символ - символ акции
Компания - название компании, производящей акции.
Цена - текущая цена акции
PriceChange - текущая величина изменения цены акции.
PercentChange - текущая процентная величина изменения цены акции.

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

data = {'Symbol':stock_symbol, 'Company':stock_names, 'Price':current_price, 'PriceChange':change_price, 'PercentChange':change_pct}

Теперь мы можем создать наш фрейм данных, используя созданный словарь:

df = pd.DataFrame(data)

Теперь давайте посмотрим на наш фрейм данных:

df.head()

Вывод:

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

Можно применить дополнительные преобразования для очистки данных и удаления всех специальных символов из числовых значений.

Я оставлю это как упражнение.

Хотите создать полноценные приложения для парсинга веб-страниц в реальном мире? Попробуйте наш курс Веб-анализ и отображение уровней плотин в Python и Leaflet.

Обязательно подпишитесь на наш канал YouTube, чтобы получить больше руководств, подобных этому.

Больше контента на plainenglish.io