Парсинг данных с использованием Python
Table Of Content
- Определите заголовок
- Извлеките данные EPS из этой таблицы
- Отправьте GET-запрос
- Получите содержимое страницы
- Пустой eps для хранения данных
- Используйте цикл for для извлечения текстового значения для каждого tr
- Хранить новое значение eps
- Цикл for для удаления \n и добавления нового значения
- Хранить значение eps и года
- Цикл for для перебора значения и разделения по подстроке
- Определите заголовок
- Извлеките данные EPS из этой таблицы
- Отправьте GET-запрос
- Получите содержимое страницы
- Преобразование в HTML
- только первый массив в tabl - то, что нам нужно, и извлекаем тег tr
- Пустой eps для хранения данных
- Используйте цикл for для извлечения текстового значения для каждого tr
- Хранить новое значение eps
- Цикл for для удаления \n и добавления нового значения
- Хранить значение eps и года
- Цикл for для перебора значения и разделения по подстроке
Один из самых популярных инструментов для парсинга данных - это использование BeautifulSoup. В этом демо я хотел бы спарсить данные с https://www.macrotrends.net/stocks/charts/KO/cocacola/eps-earnings-per-share-diluted, чтобы получить годовую прибыль на акцию с 2009 по 2021 год.
Используйте pip для установки пакета, если у вас его нет.
import requests
from bs4 import BeautifulSoup
import pandas as pd
- Определите заголовок, чтобы обеспечить успешное извлечение.
Вы можете найти свои заголовки пользовательских агентов для определения здесь.
# Определите заголовок
headers = {"User-Agent" : "Mozilla/5.0"}
- Определите URL, который вы хотите извлечь
# Извлеките данные EPS из этой таблицы
url = "https://www.macrotrends.net/stocks/charts/KO/cocacola/eps-earnings-per-share-diluted"
- Затем отправьте GET-запрос на URL и получите содержимое страницы.
# Отправьте GET-запрос
page = requests.get(url)
# Получите содержимое страницы
page_content = page.content
Вы можете прочитать содержимое страницы и увидеть, что оно представляет собой неструктурированную строку.
- Поэтому нам понадобится Beautiful Soup для разбора содержимого в HTML.
soup = BeautifulSoup(page_content,"html.parser")
- Затем вам нужно проверить вашу страницу. Найдите тег и класс таблицы, которую мы хотим извлечь.
В данном случае наш тег - table, а наш класс - historical_data_table table.
- Затем, из soup, используйте функцию find_all для извлечения таблицы.
tabl = soup.find_all("table" , {"class" : "historical_data_table table"})
- Из tabl видно, что это массив. Поэтому важно понять, какой массив использовать. Лучший способ - использовать цикл FOR.
j=0
for i in tabl:
j+=1
print("массив ", j)
print (i)
Я выяснил, что только первый массив относится к тому, что нам нужно. Поэтому я возьму только первый массив и использую findAll для извлечения тега tr.
- Извлеките только TR из моего первого массива. Исходя из вывода, у меня есть весьма 14 в моем выводе. Далее
tr= tabl[0].findAll('tr')
print(len(tr))
- Исходя из вывода, мы видим, что в первом массиве есть заголовок. Чтобы извлечь только данные, нам следует запустить цикл for, начиная с индекса массива 1.
# Пустой eps для хранения данных
eps =[]
# Используйте цикл for для извлечения текстового значения для каждого tr
for i in tr[1:]:
eps.append(i.getText())
- Таким образом, на этом шаге нам нужно удалить \n.
# Хранить новое значение eps
rep = []
# Цикл for для удаления \n и добавления нового значения
for x in eps:
rep.append(x.replace("\n", ""))
- Затем нам нужно разделить год и eps, чтобы сформировать массив и сохранить его в виде фрейма данных.
# Хранить значение eps и года
eps_value = []
year = []
# Цикл for для перебора значения и разделения по подстроке
for i in rep:
year.append(int(i[0:4]))
eps_value.append(float(i[5:]))
- Наконец, давайте сохраним это в виде фрейма данных
EPS = pd.DataFrame(data= {'Квартальный': year, 'eps_value': eps_value})
Код также опубликован на GitHub. Нажмите здесь.
Вот полный код:
import requests
from bs4 import BeautifulSoup
import pandas as pd
# Определите заголовок
headers = {"User-Agent" : "Mozilla/5.0"}
# Извлеките данные EPS из этой таблицы
url = "https://www.macrotrends.net/stocks/charts/KO/cocacola/eps-earnings-per-share-diluted"
# Отправьте GET-запрос
page = requests.get(url)
# Получите содержимое страницы
page_content = page.content
# Преобразование в HTML
soup = BeautifulSoup(page_content,"html.parser")
tabl = soup.find_all("table" , {"class" : "historical_data_table table"})
# только первый массив в tabl - то, что нам нужно, и извлекаем тег tr
tr= tabl[0].findAll('tr')
print(len(tr))
# Пустой eps для хранения данных
eps =[]
# Используйте цикл for для извлечения текстового значения для каждого tr
for i in tr[1:]:
eps.append(i.getText())
# Хранить новое значение eps
rep = []
# Цикл for для удаления \n и добавления нового значения
for x in eps:
rep.append(x.replace("\n", ""))
print(list(rep))
# Хранить значение eps и года
eps_value = []
year = []
# Цикл for для перебора значения и разделения по подстроке
for i in rep:
year.append(int(i[0:4]))
eps_value.append(float(i[5:]))
Спасибо за чтение. Подпишитесь, если хотите узнать больше о Python.
Ссылка на источник