Amazing-Python-Scripts
129 строк · 4.1 Кб
1import requests
2from bs4 import BeautifulSoup
3import tkinter as tk
4from tkinter import ttk
5from tkinter import font as tkFont
6from selenium import webdriver
7from selenium.webdriver.common.keys import Keys
8import time
9
10driver_path = input('Enter path for chromedriver: ')
11
12# Categories and their URL slugs
13most_active = {'Most Active equities - Main Board': 'mae_mainboard_tableC', 'Most Active equities - SME': 'mae_sme_tableC', 'Most Active equities - ETFs': 'mae_etf_tableC',
14'Most Active equities - Price Spurts': 'mae_pricespurts_tableC', 'Most Active equities - Volume Spurts': 'mae_volumespurts_tableC'}
15top_20 = {'NIFTY 50 Top 20 Gainers': 'topgainer-Table',
16'NIFTY 50 Top 20 Losers': 'toplosers-Table'}
17
18# Function to generate request url based on user choice
19
20
21def generate_url():
22category_choice = category.get()
23if (category_choice in most_active):
24page = 'most-active-equities'
25else:
26page = 'top-gainers-loosers'
27url = 'https://www.nseindia.com/market-data/{}'.format(page)
28return url
29
30# Function to scrape stock data from generated URL
31
32
33def scraper():
34url = generate_url()
35driver = webdriver.Chrome(driver_path)
36driver.get(url)
37
38# Wait for results to load
39time.sleep(5)
40html = driver.page_source
41
42# Start scraping resultant html data
43soup = BeautifulSoup(html, 'html.parser')
44
45# Based on choice scrape div
46category_choice = category.get()
47if category_choice in most_active:
48category_div = most_active[category_choice]
49else:
50category_div = top_20[category_choice]
51
52# Find the table to scrape
53results = soup.find("table", {"id": category_div})
54rows = results.findChildren('tr')
55
56table_data = []
57row_values = []
58# Append stock data into a list
59for row in rows:
60cells = row.findChildren(['th', 'td'])
61for cell in cells:
62value = cell.text.strip()
63value = " ".join(value.split())
64row_values.append(value)
65table_data.append(row_values)
66row_values = []
67
68# Formatting the stock data stored in the list
69stocks_data = ""
70for stock in table_data:
71single_record = ""
72for cell in stock:
73format_cell = "{:<20}"
74single_record += format_cell.format(cell[:20])
75single_record += "\n"
76stocks_data += single_record
77
78# Adding the formatted data into tkinter GUI
79query_label.config(state=tk.NORMAL)
80query_label.delete(1.0, "end")
81query_label.insert(1.0, stocks_data)
82query_label.config(state=tk.DISABLED)
83driver.close()
84
85
86# Creating tkinter window
87window = tk.Tk()
88window.title('NSE Stock data')
89window.geometry('1200x1000')
90window.configure(bg='white')
91
92style = ttk.Style()
93style.configure('my.TButton', font=('Helvetica', 16))
94style.configure('my.TFrame', background='white')
95
96# label text for title
97ttk.Label(window, text="NSE Stock market data",
98background='white', foreground="SpringGreen2",
99font=("Helvetica", 30, 'bold')).grid(row=0, column=1)
100
101# label
102ttk.Label(window, text="Select Market data to get:", background='white',
103font=("Helvetica", 15)).grid(column=0,
104row=5, padx=10, pady=25)
105
106# Combobox creation
107category = ttk.Combobox(
108window, width=60, state='readonly', font="Helvetica 15")
109
110submit_btn = ttk.Button(window, text="Get Stock Data!",
111style='my.TButton', command=scraper)
112
113# Adding combobox drop down list
114category['values'] = ('Most Active equities - Main Board', 'Most Active equities - SME', 'Most Active equities - ETFs', 'Most Active equities - Price Spurts',
115'Most Active equities - Volume Spurts', 'NIFTY 50 Top 20 Gainers', 'NIFTY 50 Top 20 Losers')
116
117category.grid(column=1, row=5, padx=10)
118category.current(0)
119
120submit_btn.grid(row=5, column=3, pady=5, padx=15, ipadx=5)
121
122frame = ttk.Frame(window, style='my.TFrame')
123frame.place(relx=0.50, rely=0.12, relwidth=0.98, relheight=0.90, anchor="n")
124
125# To display stock data
126query_label = tk.Text(frame, height="52", width="500", bg="alice blue")
127query_label.grid(row=7, columnspan=2)
128
129window.mainloop()
130