В этом руководстве мы рассмотрим поиск акций, выплачивающих дивиденды, с помощью Python.

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

К счастью, есть отличный модуль Python для парсинга веб-страниц под названием Beautiful Soup.

Веб-сайт, который мы собираемся очистить:

Https://www.lse.co.uk/share-fundamentals.asp?shareprice=

В конце этого URL-адреса мы можем разместить, например, биржевой тикер

Https://www.lse.co.uk/share-fundamentals.asp?shareprice=UU.

Посмотрев на веб-сайт, мы можем увидеть дивидендную ставку и дивидендную доходность во второй таблице рыночных данных:

Итак, мы хотим получить эти данные, но для любых акций, которые перечислены на веб-сайте LSE.

Все, что нам нужно сделать, чтобы сменить компанию, - это поменять тикер в конце URL-адреса. Теперь у вас может быть свой собственный список тикеров, которые вас интересуют, но если у вас его нет, внизу этой веб-страницы есть форма для загрузки, где вы можете загрузить файл CSV, содержащий список тикеров акций из FTSE. 250 индекс.

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

# These are our imports, external modules which 
# will help us. 
from bs4 import BeautifulSoup as bs # Used for scraping data
import csv # Used to get and write to CSV
import requests # Used to access the external URL (the webpage)

'''
 All this function is doing is reading from our 
 tickers.csv file (which should be saved in the 
 same location as your python script) and returning
 them in a list.
'''
def get_tickers():
    tickers = []
    with open('tickers.csv') as ticker_file:
        for ticker in ticker_file:
            tickers.append(ticker.strip())
    return tickers

 '''
 This method takes a list of dictionaries 
 and uses it to write a CSV file called 
 dividends.csv. We will use this last.
 '''
def to_csv(stocks):
    with open('dividends.csv', 'w') as output:
        writer = csv.writer(output)
        writer.writerow(stocks[0].keys())
        for stock in stocks:
            writer.writerow(stock.values())

'''
This method gets the webpage we want and returns
the html as a beautifulsoup object which we 
can easily scrape for data. 
'''
def get_soup(url):
    return bs(requests.get(url).text, 'html.parser')
'''
This is our entry point.
'''
if __name__ == '__main__':
    dividends = [] # Create an empty list
    for ticker in get_tickers(): # Iterate over the tickers
      # Add the dividend data to the dividends list
        dividends.append(get_data(ticker))
    # Write the dividends data to CSV.
    to_csv(dividends)

Теперь нам нужно найти HTML и информацию о ячейках делимого и доходности в таблице.

Теперь нам нужно найти HTML и информацию о ячейках делимого и доходности в таблице.

Для этого щелкните правой кнопкой мыши одну из ячеек и выберите «проверить элемент».

Здесь мы видим, что в таблице есть класс sp-Fundmentals-info__table, а строка таблицы содержит элемент ‹th› и элемент ‹td›, в котором ставка дивидендов равна.

Важно отметить, что на этой странице есть три таблицы с классом sp-Fundmentals-info__table. Мы хотим получить второй, который в коде будет [1], потому что списки начинаются с 0.

Также обратите внимание, что ставка дивидендов - это 6-я строка в таблице, а дивидендная доходность - 7-я. Таким образом, когда мы получим эти данные из списка, мы получим элементы 5 и 6.

Итак, теперь у нас есть вся необходимая информация. Приступим к написанию кода для метода get_data.

Сначала давайте создадим объект супа из веб-страницы для интересующей нас акции:

def get_data(ticker):
    url = 'https://www.lse.co.uk/share-fundamentals.asp?shareprice='
    soup = get_soup(url + ticker)

Затем мы должны открыть блок try-except.

Почему?

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

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

Первое, что мы собираемся сделать в нашем блоке try, это найти интересующую нас таблицу. Для этого мы воспользуемся методом Beautiful Soup find_all, чтобы найти все элементы таблицы с классом: 'sp-фундаментальные -info__table ', а затем мы выберем вторую с помощью [1].

try: 
        table = soup.find_all('table', attrs={'class', 'sp-fundamentals-info__table'})[1]

Далее нам нужно получить информацию о дивидендах и дивидендной доходности. Для этого мы найдем все элементы ‹tr› в таблице, выберем 5 и 6 элементов соответственно, а затем воспользуемся методом поиска BeautifulSoup, чтобы найти элемент ‹td›, который содержит интересующую нас информацию. Наконец, мы вызываем метод .text, который, как и следовало ожидать, возвращает текст, содержащийся в элементе.

dividend = table.find_all('tr')[5].find('td').text
div_yield = table.find_all('tr')[6].find('td').text

Затем мы можем вывести информацию на консоль, чтобы мы могли видеть, что происходит во время выполнения скрипта, а затем мы можем вернуть объект словаря с тикером акции, дивидендом и дивидендной доходностью. Позже это сформирует столбцы нашего CSV-файла с дивидендами.

print(f'Dividend for {ticker} : {dividend}')
return {
                'ticker': ticker, 
                'dividend': dividend, 
                'yield': div_yield
               }

Наконец, нам нужно добавить блок except в блок try. Внутри которого мы просто собираемся войти в консоль, что мы не можем найти информацию о дивидендах для этой конкретной акции.

except: 
        print('No information available for ', ticker)

И это все. Теперь вы можете запустить код, и он выведет файл с именем Dividnds.csv. Этот файл будет содержать таблицу акций, по которым выплачиваются дивиденды, а также их доходность.

Этот пост изначально был размещен здесь: https://codeyogi.co.uk/2020/06/02/find-dividend-paying-stocks-with-python/, где вы также можете найти ссылку для загрузки файла тикеров, который мы используется в этом руководстве.

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

Https://www.youtube.com/watch?v=b94LKGlkntM

Вот полный код этого руководства:

from bs4 import BeautifulSoup as bs
import csv 
import requests
def get_tickers():
    tickers = []
    with open('tickers.csv') as ticker_file:
        for ticker in ticker_file:
            tickers.append(ticker.strip())
    return tickers
def to_csv(stocks):
    with open('dividends.csv', 'w') as output:
        writer = csv.writer(output)
        writer.writerow(stocks[0].keys())
        for stock in stocks:
            writer.writerow(stock.values())
def get_soup(url):
    return bs(requests.get(url).text, 'html.parser')
def get_data(ticker):
    url = 'https://www.lse.co.uk/share-fundamentals.asp?shareprice='
    soup = get_soup(url + ticker)
    try: 
        table = soup.find_all('table', attrs={'class', 'sp-fundamentals-info__table'})[1]
        dividend = table.find_all('tr')[5].find('td').text
        div_yield = table.find_all('tr')[6].find('td').text
print(f'Dividend for {ticker} : {dividend}')
return {
                'ticker': ticker, 
                'dividend': dividend, 
                'yield': div_yield
               }
    except: 
        print('No information available for ', ticker)
if __name__ == '__main__':
    dividends = []
    for ticker in get_tickers():
        dividends.append(get_data(ticker))
    to_csv(dividends)