diff --git a/setup.py b/setup.py index 2c8b026..cd6538b 100644 --- a/setup.py +++ b/setup.py @@ -1,16 +1,17 @@ import setuptools -with open('README.md', 'r') as fh: - long_description = fh.read() + +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' + name="stockquotes", + version="2.0.0", + 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.5", ) diff --git a/stockquotes.egg-info/PKG-INFO b/stockquotes.egg-info/PKG-INFO deleted file mode 100644 index 04ec6cb..0000000 --- a/stockquotes.egg-info/PKG-INFO +++ /dev/null @@ -1,70 +0,0 @@ -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 deleted file mode 100644 index 2be8c2d..0000000 --- a/stockquotes.egg-info/SOURCES.txt +++ /dev/null @@ -1,8 +0,0 @@ -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 deleted file mode 100644 index 8b13789..0000000 --- a/stockquotes.egg-info/dependency_links.txt +++ /dev/null @@ -1 +0,0 @@ - diff --git a/stockquotes.egg-info/top_level.txt b/stockquotes.egg-info/top_level.txt deleted file mode 100644 index db10d80..0000000 --- a/stockquotes.egg-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -stockquotes diff --git a/stockquotes/__init__.py b/stockquotes/__init__.py index a658433..d2fe209 100644 --- a/stockquotes/__init__.py +++ b/stockquotes/__init__.py @@ -1,97 +1,102 @@ #!/usr/bin/env python3 -#stockquotes - Python module to pull stock quotes from Yahoo! Finance -#Copyright 2020 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. +# stockquotes - Python module to pull stock quotes from Yahoo! Finance +# Copyright 2020 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 import datetime + class StockDoesNotExistError(Exception): pass + class NetworkError(Exception): pass + class Stock: def __init__(self, ticker): try: - r=requests.get( - 'https://finance.yahoo.com/quote/{}/history'\ - .format(ticker), - headers={ - 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64)' + - ' AppleWebKit/537.36 (KHTML, like Gecko)' + - ' Chrome/79.0.3941.4 Safari/537.36' - }) + r = requests.get( + "https://finance.yahoo.com/quote/{}/history".format(ticker), + 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=[] + 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') + row = i.find_all("td") try: parsed = { - "date" : datetime.datetime.strptime( - row[0].span.string, - '%b %d, %Y' + "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(',', '')), + "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(",", "")), "adjusted_close": float( - row[5].span.string.replace(',', '')), - "volume": int(row[6].span.string.replace(',', '')) + row[5].span.string.replace(",", "") + ), + "volume": int(row[6].span.string.replace(",", "")), } except: continue self.historical.append(parsed) - top_data = soup.find(id='quote-header-info') + top_data = soup.find(id="quote-header-info") try: self.current_price = float( - top_data.findAll('span')[11].string.replace(',', '')) - raw_change = top_data.findAll('span')[12].string + top_data.findAll("span")[11].string.replace(",", "") + ) + raw_change = top_data.findAll("span")[12].string except IndexError: self.current_price = float( - top_data.findAll('span')[3].string.replace(',', '')) - raw_change = top_data.findAll('span')[4].string - + top_data.findAll("span")[3].string.replace(",", "") + ) + raw_change = top_data.findAll("span")[4].string + self.increase_dollars = float( - raw_change.split(' ')[0].replace(',', '')) + raw_change.split(" ")[0].replace(",", "") + ) self.increase_percent = float( - raw_change.split(' ')[1]\ - .replace(',', '')\ - .replace('(', '')\ - .replace(')', '')\ - .replace('%', '')) + raw_change.split(" ")[1] + .replace(",", "") + .replace("(", "") + .replace(")", "") + .replace("%", "") + ) except AttributeError as error: raise StockDoesNotExistError(ticker) from error