Archive for the ‘Python’ Category

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

март 16, 2015

Тези дни ми се наложи да свалям от сайта 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)