From 2c350324e30a9f887a73aaeee1fab268919b60fd Mon Sep 17 00:00:00 2001 From: Stupdi Go Date: Thu, 6 Feb 2025 20:36:35 -0600 Subject: [PATCH] stupid stuff --- __pycache__/main.cpython-313.pyc | Bin 0 -> 7637 bytes main.py | 580 +++++++++++++++++++++++++++++++ 2 files changed, 580 insertions(+) create mode 100644 __pycache__/main.cpython-313.pyc create mode 100644 main.py diff --git a/__pycache__/main.cpython-313.pyc b/__pycache__/main.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7fcff6361c19eae9d85dbad1072f350b236bd4a2 GIT binary patch literal 7637 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 F0{{S~^Wp#i literal 0 HcmV?d00001 diff --git a/main.py b/main.py new file mode 100644 index 0000000..058280a --- /dev/null +++ b/main.py @@ -0,0 +1,580 @@ +from fastapi import FastAPI +from bs4 import BeautifulSoup +import requests +from selenium import webdriver +import redis +from time import sleep +from concurrent.futures import ThreadPoolExecutor, as_completed +import json +from transformers import pipeline + +pipe = pipeline("text-classification", model="ProsusAI/finbert") +tickers = [ + "AOS", + "ABT", + "ABBV", + "ACN", + "ADBE", + "AMD", + "AES", + "AFL", + "A", + "APD", + "ABNB", + "AKAM", + "ALB", + "ARE", + "ALGN", + "ALLE", + "LNT", + "ALL", + "GOOGL", + "GOOG", + "MO", + "AMZN", + "AMCR", + "AEE", + "AEP", + "AXP", + "AIG", + "AMT", + "AWK", + "AMP", + "AME", + "AMGN", + "APH", + "ADI", + "ANSS", + "AON", + "APA", + "APO", + "AAPL", + "AMAT", + "APTV", + "ACGL", + "ADM", + "ANET", + "AJG", + "AIZ", + "T", + "ATO", + "ADSK", + "ADP", + "AZO", + "AVB", + "AVY", + "AXON", + "BKR", + "BALL", + "BAC", + "BAX", + "BDX", + "BRK.B", + "BBY", + "TECH", + "BIIB", + "BLK", + "BX", + "BK", + "BA", + "BKNG", + "BWA", + "BSX", + "BMY", + "AVGO", + "BR", + "BRO", + "BF.B", + "BLDR", + "BG", + "BXP", + "CHRW", + "CDNS", + "CZR", + "CPT", + "CPB", + "COF", + "CAH", + "KMX", + "CCL", + "CARR", + "CAT", + "CBOE", + "CBRE", + "CDW", + "CE", + "COR", + "CNC", + "CNP", + "CF", + "CRL", + "SCHW", + "CHTR", + "CVX", + "CMG", + "CB", + "CHD", + "CI", + "CINF", + "CTAS", + "CSCO", + "C", + "CFG", + "CLX", + "CME", + "CMS", + "KO", + "CTSH", + "CL", + "CMCSA", + "CAG", + "COP", + "ED", + "STZ", + "CEG", + "COO", + "CPRT", + "GLW", + "CPAY", + "CTVA", + "CSGP", + "COST", + "CTRA", + "CRWD", + "CCI", + "CSX", + "CMI", + "CVS", + "DHR", + "DRI", + "DVA", + "DAY", + "DECK", + "DE", + "DELL", + "DAL", + "DVN", + "DXCM", + "FANG", + "DLR", + "DFS", + "DG", + "DLTR", + "D", + "DPZ", + "DOV", + "DOW", + "DHI", + "DTE", + "DUK", + "DD", + "EMN", + "ETN", + "EBAY", + "ECL", + "EIX", + "EW", + "EA", + "ELV", + "EMR", + "ENPH", + "ETR", + "EOG", + "EPAM", + "EQT", + "EFX", + "EQIX", + "EQR", + "ERIE", + "ESS", + "EL", + "EG", + "EVRG", + "ES", + "EXC", + "EXPE", + "EXPD", + "EXR", + "XOM", + "FFIV", + "FDS", + "FICO", + "FAST", + "FRT", + "FDX", + "FIS", + "FITB", + "FSLR", + "FE", + "FI", + "FMC", + "F", + "FTNT", + "FTV", + "FOXA", + "FOX", + "BEN", + "FCX", + "GRMN", + "IT", + "GE", + "GEHC", + "GEV", + "GEN", + "GNRC", + "GD", + "GIS", + "GM", + "GPC", + "GILD", + "GPN", + "GL", + "GDDY", + "GS", + "HAL", + "HIG", + "HAS", + "HCA", + "DOC", + "HSIC", + "HSY", + "HES", + "HPE", + "HLT", + "HOLX", + "HD", + "HON", + "HRL", + "HST", + "HWM", + "HPQ", + "HUBB", + "HUM", + "HBAN", + "HII", + "IBM", + "IEX", + "IDXX", + "ITW", + "INCY", + "IR", + "PODD", + "INTC", + "ICE", + "IFF", + "IP", + "IPG", + "INTU", + "ISRG", + "IVZ", + "INVH", + "IQV", + "IRM", + "JBHT", + "JBL", + "JKHY", + "J", + "JNJ", + "JCI", + "JPM", + "JNPR", + "K", + "KVUE", + "KDP", + "KEY", + "KEYS", + "KMB", + "KIM", + "KMI", + "KKR", + "KLAC", + "KHC", + "KR", + "LHX", + "LH", + "LRCX", + "LW", + "LVS", + "LDOS", + "LEN", + "LII", + "LLY", + "LIN", + "LYV", + "LKQ", + "LMT", + "L", + "LOW", + "LULU", + "LYB", + "MTB", + "MPC", + "MKTX", + "MAR", + "MMC", + "MLM", + "MAS", + "MA", + "MTCH", + "MKC", + "MCD", + "MCK", + "MDT", + "MRK", + "META", + "MET", + "MTD", + "MGM", + "MCHP", + "MU", + "MSFT", + "MAA", + "MRNA", + "MHK", + "MOH", + "TAP", + "MDLZ", + "MPWR", + "MNST", + "MCO", + "MS", + "MOS", + "MSI", + "MSCI", + "NDAQ", + "NTAP", + "NFLX", + "NEM", + "NWSA", + "NWS", + "NEE", + "NKE", + "NI", + "NDSN", + "NSC", + "NTRS", + "NOC", + "NCLH", + "NRG", + "NUE", + "NVDA", + "NVR", + "NXPI", + "ORLY", + "OXY", + "ODFL", + "OMC", + "ON", + "OKE", + "ORCL", + "OTIS", + "PCAR", + "PKG", + "PLTR", + "PANW", + "PARA", + "PH", + "PAYX", + "PAYC", + "PYPL", + "PNR", + "PEP", + "PFE", + "PCG", + "PM", + "PSX", + "PNW", + "PNC", + "POOL", + "PPG", + "PPL", + "PFG", + "PG", + "PGR", + "PLD", + "PRU", + "PEG", + "PTC", + "PSA", + "PHM", + "PWR", + "QCOM", + "DGX", + "RL", + "RJF", + "RTX", + "O", + "REG", + "REGN", + "RF", + "RSG", + "RMD", + "RVTY", + "ROK", + "ROL", + "ROP", + "ROST", + "RCL", + "SPGI", + "CRM", + "SBAC", + "SLB", + "STX", + "SRE", + "NOW", + "SHW", + "SPG", + "SWKS", + "SJM", + "SW", + "SNA", + "SOLV", + "SO", + "LUV", + "SWK", + "SBUX", + "STT", + "STLD", + "STE", + "SYK", + "SMCI", + "SYF", + "SNPS", + "SYY", + "TMUS", + "TROW", + "TTWO", + "TPR", + "TRGP", + "TGT", + "TEL", + "TDY", + "TFX", + "TER", + "TSLA", + "TXN", + "TPL", + "TXT", + "TMO", + "TJX", + "TSCO", + "TT", + "TDG", + "TRV", + "TRMB", + "TFC", + "TYL", + "TSN", + "USB", + "UBER", + "UDR", + "ULTA", + "UNP", + "UAL", + "UPS", + "URI", + "UNH", + "UHS", + "VLO", + "VTR", + "VLTO", + "VRSN", + "VRSK", + "VZ", + "VRTX", + "VTRS", + "VICI", + "V", + "VST", + "VMC", + "WRB", + "GWW", + "WAB", + "WBA", + "WMT", + "DIS", + "WBD", + "WM", + "WAT", + "WEC", + "WFC", + "WELL", + "WST", + "WDC", + "WY", + "WMB", + "WTW", + "WDAY", + "WYNN", + "XEL", + "XYL", + "YUM", + "ZBRA", + "ZBH", + "ZTS" +] +redis_client = redis.from_url("redis://192.168.1.23:6379") + +from selenium.webdriver.chrome.options import Options +def get_html(link): + options = Options() + options.add_argument("--headless") # Run in headless mode + + driver = webdriver.Chrome(options=options) + driver.get(link) + + html_content = driver.page_source + + + driver.quit() + return html_content + + + +def get_news_yahoo(): + def fetch_news(ticker): + """Fetch and publish news articles for a single ticker.""" + print(f"Fetching news for {ticker}...") + + try: + html_content = get_html(f"https://finance.yahoo.com/quote/{ticker}/news/") + soup = BeautifulSoup(html_content, 'html.parser') + articles = soup.find_all("section", attrs={"role": "article"}) + + for article in articles[:1]: # Only get the first article + info_element = article.find("a", class_="subtle-link") + if not info_element: + continue + + title = info_element.get("title") + description = article.find("div", class_="content").select("a p")[0].text + url = info_element.get("href") + image_element = info_element.find("img") + image_url = image_element.get("src") if image_element else None + sentiment = pipe(description)[0]["label"] + print(sentiment) + if title and description and url and image_url and (sentiment == "positive" or sentiment == "negative"): + article_data = { + "tickers": [ticker], + "title": title, + "description": description, + "url": url, + "image_url": image_url + } + + # Publish as soon as it is retrieved + + + print("published!") + redis_client.publish("notifications", json.dumps([article_data])) + + except Exception as e: + print(f"Error fetching news for {ticker}: {e}") + + while True: + with ThreadPoolExecutor(max_workers=5) as executor: # Adjust `max_workers` as needed + executor.map(fetch_news, tickers) # Run fetch_news concurrently for each ticker + + sleep(3600) # Sleep for 20 minutes before the next fetch + +get_news_yahoo()