From 72dce18c5c0a5ff1e480dafb0e561f635729617a Mon Sep 17 00:00:00 2001 From: scoopgracie Date: Mon, 20 Apr 2020 07:00:28 -0700 Subject: [PATCH] Initial commit Same as what's on PyPI, just the working version --- PKG-INFO | 70 +++++++++++++++++++++ README.md | 58 +++++++++++++++++ setup.cfg | 4 ++ setup.py | 16 +++++ stockquotes.egg-info/PKG-INFO | 70 +++++++++++++++++++++ stockquotes.egg-info/SOURCES.txt | 8 +++ stockquotes.egg-info/dependency_links.txt | 1 + stockquotes.egg-info/top_level.txt | 1 + stockquotes/__init__.py | 76 +++++++++++++++++++++++ 9 files changed, 304 insertions(+) create mode 100644 PKG-INFO create mode 100644 README.md create mode 100644 setup.cfg create mode 100644 setup.py create mode 100644 stockquotes.egg-info/PKG-INFO create mode 100644 stockquotes.egg-info/SOURCES.txt create mode 100644 stockquotes.egg-info/dependency_links.txt create mode 100644 stockquotes.egg-info/top_level.txt create mode 100644 stockquotes/__init__.py diff --git a/PKG-INFO b/PKG-INFO new file mode 100644 index 0000000..04ec6cb --- /dev/null +++ b/PKG-INFO @@ -0,0 +1,70 @@ +Metadata-Version: 2.1 +Name: stockquotes +Version: 1.0.5 +Summary: A simple module for retreiving stock data +Home-page: UNKNOWN +License: UNKNOWN +Description: `stockquotes` is a simple Python module for collecting stock quotes and historical data from Yahoo! Finance. It's perfect for developers who can't afford the (often steep) prices charged by many stock data APIs. + # Requirements + * Python 3.6+ + * Beautiful Soup 4 + # Installation + pip3 install stockquotes + # Usage + First, import the `stockquotes` module. + + import stockquotes + + To get a stock quote, instantiate a `stockquotes.Stock` object. The only parameter is the ticker symbol to look up. + + kroger = stockquotes.Stock('KR') + + ## Basic data + To get the current price of a share, get the `Stock`'s `currentPrice`. + + krogerPrice = kroger.currentPrice + + To get the day gain in dollars, get the `Stock`'s `increaseDollars`. + + krogerGainDollars = kroger.increaseDollars + + The same value as a percent is available in the `increasePercent` property. To indicate losses, these values are negative. + + ## Historical data + The historical data for a stock can be accessed through the `Stock`'s `historical` property. This is an array of `dict`s, with the first item representing the most recent quote. The `dict`'s `date` property is a `datetime` object representing the date the quote is from. `open` is the opening price for that day. `high` and `low` are the high and low prices, respectively, for that day. `close` and `adjClose` are the closing price. The difference is that `adjClose` is adjusted for splits and dividends, whereas `close` is adjusted only for splits. `volume` is the stock's volume for that day. + # Exceptions + `stockquotes.StockDoesNotExistError` is raised when the stock does not exist. + `stockquotes.NetworkError` is raised when a connection to Yahoo! Finance cannot be established. + # License + Copyright (c) 2019 ScoopGracie. All rights reversed. + This is free and unencumbered software released into the public domain. + + Anyone is free to copy, modify, publish, use, compile, sell, or + distribute this software, either in source code form or as a compiled + binary, for any purpose, commercial or non-commercial, and by any + means. + + In jurisdictions that recognize copyright laws, the author or authors + of this software dedicate any and all copyright interest in the + software to the public domain. We make this dedication for the benefit + of the public at large and to the detriment of our heirs and + successors. We intend this dedication to be an overt act of + relinquishment in perpetuity of all present and future rights to this + software under copyright law. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + For more information, please refer to + + +Platform: UNKNOWN +Classifier: Programming Language :: Python :: 3 +Classifier: Operating System :: OS Independent +Requires-Python: >=3.0 +Description-Content-Type: text/markdown diff --git a/README.md b/README.md new file mode 100644 index 0000000..7c83e8d --- /dev/null +++ b/README.md @@ -0,0 +1,58 @@ +`stockquotes` is a simple Python module for collecting stock quotes and historical data from Yahoo! Finance. It's perfect for developers who can't afford the (often steep) prices charged by many stock data APIs. +# Requirements +* Python 3.6+ +* Beautiful Soup 4 +# Installation + pip3 install stockquotes +# Usage +First, import the `stockquotes` module. + + import stockquotes + +To get a stock quote, instantiate a `stockquotes.Stock` object. The only parameter is the ticker symbol to look up. + + kroger = stockquotes.Stock('KR') + +## Basic data +To get the current price of a share, get the `Stock`'s `currentPrice`. + + krogerPrice = kroger.currentPrice + +To get the day gain in dollars, get the `Stock`'s `increaseDollars`. + + krogerGainDollars = kroger.increaseDollars + +The same value as a percent is available in the `increasePercent` property. To indicate losses, these values are negative. + +## Historical data +The historical data for a stock can be accessed through the `Stock`'s `historical` property. This is an array of `dict`s, with the first item representing the most recent quote. The `dict`'s `date` property is a `datetime` object representing the date the quote is from. `open` is the opening price for that day. `high` and `low` are the high and low prices, respectively, for that day. `close` and `adjClose` are the closing price. The difference is that `adjClose` is adjusted for splits and dividends, whereas `close` is adjusted only for splits. `volume` is the stock's volume for that day. +# Exceptions +`stockquotes.StockDoesNotExistError` is raised when the stock does not exist. +`stockquotes.NetworkError` is raised when a connection to Yahoo! Finance cannot be established. +# License +Copyright (c) 2019 ScoopGracie. All rights reversed. +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +For more information, please refer to + diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 0000000..8bfd5a1 --- /dev/null +++ b/setup.cfg @@ -0,0 +1,4 @@ +[egg_info] +tag_build = +tag_date = 0 + diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..2c8b026 --- /dev/null +++ b/setup.py @@ -0,0 +1,16 @@ +import setuptools +with open('README.md', 'r') as fh: + long_description = fh.read() +setuptools.setup( + name='stockquotes', + version='1.0.5', + description='A simple module for retreiving stock data', + long_description=long_description, + long_description_content_type="text/markdown", + packages=setuptools.find_packages(), + classifiers=[ + "Programming Language :: Python :: 3", + "Operating System :: OS Independent" + ], + python_requires='>=3.0' +) diff --git a/stockquotes.egg-info/PKG-INFO b/stockquotes.egg-info/PKG-INFO new file mode 100644 index 0000000..04ec6cb --- /dev/null +++ b/stockquotes.egg-info/PKG-INFO @@ -0,0 +1,70 @@ +Metadata-Version: 2.1 +Name: stockquotes +Version: 1.0.5 +Summary: A simple module for retreiving stock data +Home-page: UNKNOWN +License: UNKNOWN +Description: `stockquotes` is a simple Python module for collecting stock quotes and historical data from Yahoo! Finance. It's perfect for developers who can't afford the (often steep) prices charged by many stock data APIs. + # Requirements + * Python 3.6+ + * Beautiful Soup 4 + # Installation + pip3 install stockquotes + # Usage + First, import the `stockquotes` module. + + import stockquotes + + To get a stock quote, instantiate a `stockquotes.Stock` object. The only parameter is the ticker symbol to look up. + + kroger = stockquotes.Stock('KR') + + ## Basic data + To get the current price of a share, get the `Stock`'s `currentPrice`. + + krogerPrice = kroger.currentPrice + + To get the day gain in dollars, get the `Stock`'s `increaseDollars`. + + krogerGainDollars = kroger.increaseDollars + + The same value as a percent is available in the `increasePercent` property. To indicate losses, these values are negative. + + ## Historical data + The historical data for a stock can be accessed through the `Stock`'s `historical` property. This is an array of `dict`s, with the first item representing the most recent quote. The `dict`'s `date` property is a `datetime` object representing the date the quote is from. `open` is the opening price for that day. `high` and `low` are the high and low prices, respectively, for that day. `close` and `adjClose` are the closing price. The difference is that `adjClose` is adjusted for splits and dividends, whereas `close` is adjusted only for splits. `volume` is the stock's volume for that day. + # Exceptions + `stockquotes.StockDoesNotExistError` is raised when the stock does not exist. + `stockquotes.NetworkError` is raised when a connection to Yahoo! Finance cannot be established. + # License + Copyright (c) 2019 ScoopGracie. All rights reversed. + This is free and unencumbered software released into the public domain. + + Anyone is free to copy, modify, publish, use, compile, sell, or + distribute this software, either in source code form or as a compiled + binary, for any purpose, commercial or non-commercial, and by any + means. + + In jurisdictions that recognize copyright laws, the author or authors + of this software dedicate any and all copyright interest in the + software to the public domain. We make this dedication for the benefit + of the public at large and to the detriment of our heirs and + successors. We intend this dedication to be an overt act of + relinquishment in perpetuity of all present and future rights to this + software under copyright law. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + For more information, please refer to + + +Platform: UNKNOWN +Classifier: Programming Language :: Python :: 3 +Classifier: Operating System :: OS Independent +Requires-Python: >=3.0 +Description-Content-Type: text/markdown diff --git a/stockquotes.egg-info/SOURCES.txt b/stockquotes.egg-info/SOURCES.txt new file mode 100644 index 0000000..2be8c2d --- /dev/null +++ b/stockquotes.egg-info/SOURCES.txt @@ -0,0 +1,8 @@ +README.md +setup.py +stockquotes/__init__.py +stockquotes/script.py +stockquotes.egg-info/PKG-INFO +stockquotes.egg-info/SOURCES.txt +stockquotes.egg-info/dependency_links.txt +stockquotes.egg-info/top_level.txt \ No newline at end of file diff --git a/stockquotes.egg-info/dependency_links.txt b/stockquotes.egg-info/dependency_links.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/stockquotes.egg-info/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/stockquotes.egg-info/top_level.txt b/stockquotes.egg-info/top_level.txt new file mode 100644 index 0000000..db10d80 --- /dev/null +++ b/stockquotes.egg-info/top_level.txt @@ -0,0 +1 @@ +stockquotes diff --git a/stockquotes/__init__.py b/stockquotes/__init__.py new file mode 100644 index 0000000..63d39f7 --- /dev/null +++ b/stockquotes/__init__.py @@ -0,0 +1,76 @@ +#!/usr/bin/env python3 +#stockquotes - Python module to pull stock quotes from Yahoo! Finance +#Copyright 2019 ScoopGracie. All rights reversed. +#This is free and unencumbered software released into the public domain. + +#Anyone is free to copy, modify, publish, use, compile, sell, or +#distribute this software, either in source code form or as a compiled +#binary, for any purpose, commercial or non-commercial, and by any +#means. + +#In jurisdictions that recognize copyright laws, the author or authors +#of this software dedicate any and all copyright interest in the +#software to the public domain. We make this dedication for the benefit +#of the public at large and to the detriment of our heirs and +#successors. We intend this dedication to be an overt act of +#relinquishment in perpetuity of all present and future rights to this +#software under copyright law. + +#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +#EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +#MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +#IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +#OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +#ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +#OTHER DEALINGS IN THE SOFTWARE. + +from bs4 import BeautifulSoup as bs +import requests, datetime +class StockDoesNotExistError(Exception): + pass +class NetworkError(Exception): + pass +class Stock: + def __init__(self, ticker): + try: + r=requests.get('https://finance.yahoo.com/quote/' + ticker + '/history', headers={'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3941.4 Safari/537.36'}) + except: + raise NetworkError() + if r.status_code is 302: + raise StockDoesNotExistError(ticker) + try: + soup = bs(r.text, features="lxml") + self.symbol = soup.h1.string.split('(')[1].split(')')[0] + self.name = soup.h1.string.split('(')[0].strip() + rows = soup.table.tbody.find_all('tr') + self.historical=[] + for i in rows: + row=i.find_all('td') + try: + parsed = { + "date" : datetime.datetime.strptime( + row[0].span.string, + '%b %d, %Y' + ), + "open" : float(row[1].span.string.replace(',', '')), + "high" : float(row[2].span.string.replace(',', '')), + "low" : float(row[3].span.string.replace(',', '')), + "close" : float(row[4].span.string.replace(',', '')), + "adjClose": float(row[5].span.string.replace(',', '')), + "volume" : int(row[6].span.string.replace(',', '')) + } + except: + continue + self.historical.append(parsed) + topData = soup.find(id='quote-header-info') + try: + self.currentPrice = float(topData.findAll('span')[11].string.replace(',', '')) + rawChange = topData.findAll('span')[12].string + except IndexError: + self.currentPrice = float(topData.findAll('span')[3].string.replace(',', '')) + rawChange = topData.findAll('span')[4].string + + self.increaseDollars = float(rawChange.split(' ')[0].replace(',', '')) + self.increasePercent = float(rawChange.split(' ')[1].replace(',', '').replace('(', '').replace(')', '').replace('%', '')) + except AttributeError as error: + raise StockDoesNotExistError(ticker) from error