Сваляне на данни от infostock.bg за сделки на БФБ


Тези дни ми се наложи да свалям от сайта infostock.bg исторически данни за сделки на БФБ с акции на конкретен емитент. Сайтът не предлага инструменти за сваляне на данните или поне аз не видях такива. Не изключвам възможността да има такива опции, ако човек създаде профил на сайта и се логне. На мен обаче, не ми се създаваше профил само за да сваля данните, които ми трябваха и затова повиках неволята, да ми реши проблема. Написах малък скрипт на Python, с който свалих данните, които ми трябваха. Впоследствие се замислих, че може да е от полза и на други, които искат да свалят данни от този сайт и реших да го споделя. С настоящата публикация започвам нов раздел в блога, където ще публикувам разни скриптове, малки програми, съвети и идеи и изобщо всякакви други неща, които ме олесняват в ежедневната работа.

Скриптът е на Python 2.7. Необходимо е да има инсталиран Beautiful Soup

В примера използвам тикера 4CF, което е Централна кооперативна банка. Има възможност за задаване на начална и крайна дата. Тикера, както и всяка от датите може да бъде празен стринг (“). В този случай ще получите данните за всички тикери и/или няма да има начална/крайна дата. В примера тези параметри се задават в кода, но лесно може да се направи така, че да бъдат подавани като command line аргументи или потребителя да бъде запитван след стартирането на скрипта.

Резултатите се записват като csv файл (trades.csv)  в същата папка, в която се намира и скрипта.

GitHub Gist

# -*- coding: utf-8 -*-

from bs4 import BeautifulSoup
import urllib2


def scrape_data(url, to_file):
    soup = BeautifulSoup(urllib2.urlopen(url))
    for tr in soup.find('table', class_='homeTable noborders').find_all('tr'):
        row = [td.text.strip().encode('utf-8') for td in tr.find_all('td')
               if td.has_attr('class') and td['class'] in ([u'left'], [u'right'])]
        if row:
            to_file.write('{}\n'.format(','.join(row)))


def create_url(ticker, date_from, date_to, data_page=0):
    base_url = 'http://www.infostock.bg/infostock/control/transactions/history/p'
    search_query = '?page={}&ticker={}&fromDate={}&toDate={}'.format(data_page, ticker, date_from, date_to)
    search_url = '{}{}'.format(base_url, search_query)
    return search_url


if __name__ == '__main__':
    ticker = '4CF'
    from_date = '01.01.2015'
    to_date = '16.03.2015'
    soup = BeautifulSoup(urllib2.urlopen(create_url(ticker, from_date, to_date)))
    pages = max([int(a.text) for li in soup.find('ul', class_='pagination').find_all('li') for a in li.find_all('a')
                 if a.text != u' следваща »'])
    with open('trades.csv', 'w') as f:
        for page in xrange(pages):
            search_url = create_url(ticker, from_date, to_date, page)
            print 'page {}'.format(page + 1)
            scrape_data(search_url, f)
Advertisements

Етикети: , ,

Един коментар to “Сваляне на данни от infostock.bg за сделки на БФБ”

  1. bobi Says:

    Страхотна идея и реализация! Ето и една реализация на същия алгоритъм в Excel (VBA):
    https://drive.google.com/uc?export=download&id=0B4rsm4vruOejeG1XeThLU1JteU0

Вашият коментар

Попълнете полетата по-долу или кликнете върху икона, за да влезете:

WordPress.com лого

You are commenting using your WordPress.com account. Log Out / Промяна )

Twitter picture

You are commenting using your Twitter account. Log Out / Промяна )

Facebook photo

You are commenting using your Facebook account. Log Out / Промяна )

Google+ photo

You are commenting using your Google+ account. Log Out / Промяна )

Connecting to %s


%d bloggers like this: