Более 100 дней веб-скрапинга данных Yahoo

Как и многие другие, я искал альтернативный источник цен на акции теперь, когда Yahoo и Google API не работают. Я решил попробовать очистить веб-сайт Yahoo, на котором все еще доступны исторические цены. Мне удалось собрать следующий код, который почти делает то, что мне нужно:

import urllib.request as web
import bs4 as bs

def yahooPrice(tkr):
    tkr=tkr.upper()
    url='https://finance.yahoo.com/quote/'+tkr+'/history?p='+tkr

    sauce=web.urlopen(url)
    soup=bs.BeautifulSoup(sauce,'lxml')
    table=soup.find('table')
    table_rows=table.find_all('tr')

    allrows=[]
    for tr in table_rows:
        td=tr.find_all('td')
        row=[i.text for i in td]
        if len(row)==7:
            allrows.append(row)

    vixdf= pd.DataFrame(allrows).iloc[0:-1]
    vixdf.columns=['Date','Open','High','Low','Close','Aclose','Volume']
    vixdf.set_index('Date',inplace=True)

    return vixdf

который создает фрейм данных с нужной мне информацией. К сожалению, несмотря на то, что фактическая веб-страница показывает цены за полный год, моя процедура возвращает только 100 записей (включая записи о дивидендах). Есть идеи, как я могу получить больше?


person dborger    schedule 05.02.2018    source источник
comment
Цены загружаются динамически через Javascript, который beautifulsoup не выполняет.   -  person OneCricketeer    schedule 06.02.2018


Ответы (3)


Я полагаю, что Yahoo Finance API обесценился в мае 17-го. Сейчас существует множество вариантов бесплатной загрузки данных временных рядов, по крайней мере, о которых я знаю. Тем не менее всегда есть какая-то альтернатива. Просмотрите URL-адрес ниже, чтобы найти инструмент для загрузки исторических цен.

http://investexcel.net/multiple-stock-quote-downloader-for-excel/

введите описание изображения здесь

Смотрите и это тоже.

https://blog.quandl.com/api-for-stock-data

person ASH    schedule 20.02.2018

У меня нет точного решения вашего вопроса, но у меня есть обходной путь (у меня была такая же проблема, и поэтому я использовал этот подход) .... в основном вы можете использовать метод Bday () - 'import pandas.tseries.offset' и найдите x количество рабочих дней для сбора данных. В моем случае я запускал цикл трижды, чтобы получить данные за 300 рабочих дней, зная, что 100 - это максимум, который я получал по умолчанию.

По сути, вы запускаете цикл трижды и устанавливаете метод Bday () таким образом, что итерация в первый раз захватывает данные за 100 дней с настоящего момента, затем следующие 100 дней (200 дней с этого момента) и, наконец, последние 100 дней (300 дней с настоящего момента). ). Весь смысл использования этого заключается в том, что в любой момент можно очистить данные только за 100 дней. В общем, даже если вы пройдете через 300 дней за один раз, вы не сможете получить данные за 300 дней - ваша первоначальная проблема (возможно, Yahoo ограничивает объем данных, извлекаемых за один раз). У меня есть код здесь: https://github.com/ee07kkr/stock_forex_analysis/tree/dataGathering < / а>

Обратите внимание, файлы csv по какой-то причине не работают с разделителем / t в моем случае ... но в основном вы можете использовать фрейм данных. Еще одна проблема, с которой я сейчас сталкиваюсь, - это "Volume" - это строка, а не float .... способ обойти это:

apple = pd.DataFrame.from_csv ('AAPL.csv', sep = '\ t') apple ['Volume'] = apple ['Volume']. str.replace (',', ''). astype (float). )

person Karan    schedule 14.05.2018
comment
Спасибо за ваш ответ. Похоже, это сработает для меня, но я боюсь, что что-то упускаю. Я не понимаю цели pandas.tseries.offset, если вы уже знаете, что хотите 300 дней. Также, если бы позвонив три раза, я получил бы 3 копии тех же 100 дней? Не могли бы вы опубликовать короткий пример, чтобы прояснить ситуацию? Спасибо - person dborger; 16.05.2018

Во-первых - запустите приведенный ниже код, чтобы получить свои 100 дней. Затем - используйте SQL для вставки данных в небольшой БД (Sqlite3 довольно легко использовать с Python). Наконец - измените код ниже, чтобы получить ежедневные цены, которые вы можете добавить для увеличения своей базы данных.

from pandas import DataFrame
import bs4
import requests

def function():
    url = 'https://uk.finance.yahoo.com/quote/VOD.L/history?p=VOD.L'
    response = requests.get(url)
    soup=bs4.BeautifulSoup(response.text, 'html.parser')
    headers=soup.find_all('th')
    rows=soup.find_all('tr')
    ts=[[td.getText() for td in rows[i].find_all('td')] for i in range (len(rows))]
    date=[]
    days=(100)
    while days > 0:
        for i in ts:
            data.append (i[:-6])
        now=data[num]
        now=DataFrame(now)
        now=now[0]

        now=str(now[0])
        print now, item
        num=num-1
person python_starter    schedule 03.12.2018