Добро пожаловать в учебное пособие Анализ веб-цен на акции в 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