CoderCastrov logo
CoderCastrov
Парсер

Парсинг данных с использованием Python

Парсинг данных с использованием Python
просмотров
3 мин чтение
#Парсер

Один из самых популярных инструментов для парсинга данных - это использование 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
  1. Определите заголовок, чтобы обеспечить успешное извлечение.

Вы можете найти свои заголовки пользовательских агентов для определения здесь.

# Определите заголовок
headers = {"User-Agent" : "Mozilla/5.0"}
  1. Определите URL, который вы хотите извлечь
# Извлеките данные EPS из этой таблицы
url = "https://www.macrotrends.net/stocks/charts/KO/cocacola/eps-earnings-per-share-diluted"
  1. Затем отправьте GET-запрос на URL и получите содержимое страницы.
# Отправьте GET-запрос
page = requests.get(url)
# Получите содержимое страницы
page_content = page.content

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

Полученное содержимое страницы
  1. Поэтому нам понадобится Beautiful Soup для разбора содержимого в HTML.
soup = BeautifulSoup(page_content,"html.parser")
HTML содержимого
  1. Затем вам нужно проверить вашу страницу. Найдите тег и класс таблицы, которую мы хотим извлечь.

В данном случае наш тег - table, а наш класс - historical_data_table table.

Просмотр класса, который вы хотите извлечь
  1. Затем, из soup, используйте функцию find_all для извлечения таблицы.
tabl = soup.find_all("table" , {"class" : "historical_data_table table"}) 
Извлеченная таблица
  1. Из tabl видно, что это массив. Поэтому важно понять, какой массив использовать. Лучший способ - использовать цикл FOR.
j=0
for i in tabl:
    j+=1
    print("массив ", j)
    print (i)

Я выяснил, что только первый массив относится к тому, что нам нужно. Поэтому я возьму только первый массив и использую findAll для извлечения тега tr.

Первый массив
  1. Извлеките только TR из моего первого массива. Исходя из вывода, у меня есть весьма 14 в моем выводе. Далее
tr= tabl[0].findAll('tr')
print(len(tr))
Вывод моего tr
  1. Исходя из вывода, мы видим, что в первом массиве есть заголовок. Чтобы извлечь только данные, нам следует запустить цикл for, начиная с индекса массива 1.
# Пустой eps для хранения данных
eps =[]
# Используйте цикл for для извлечения текстового значения для каждого tr
for i in tr[1:]:
    eps.append(i.getText())
Наш eps состоит из новой строки \n
  1. Таким образом, на этом шаге нам нужно удалить \n.
# Хранить новое значение eps
rep = []
# Цикл for для удаления \n и добавления нового значения
for x in eps:
    rep.append(x.replace("\n", ""))
Rep - это значение
  1. Затем нам нужно разделить год и eps, чтобы сформировать массив и сохранить его в виде фрейма данных.
# Хранить значение eps и года
eps_value = []
year = []
# Цикл for для перебора значения и разделения по подстроке
for i in rep:
    year.append(int(i[0:4]))
    eps_value.append(float(i[5:]))
  1. Наконец, давайте сохраним это в виде фрейма данных
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.

Ссылка на источник