Skip to content

Instantly share code, notes, and snippets.

@andmerk93
Created March 11, 2024 16:34
Show Gist options
  • Save andmerk93/8c449a6613d63ffe246299bb294b8c6b to your computer and use it in GitHub Desktop.
Save andmerk93/8c449a6613d63ffe246299bb294b8c6b to your computer and use it in GitHub Desktop.
Скрипт на Selenium, получает список цен с nseindia.com, и сохраняет его в csv
'''
Скрипт на Selenium, заходит на https://www.nseindia.com/
Затем переходит на страницу Pre-Open Market, дожидается
появления таблицы Final Price, парсит данные,
и сохраняет их в файл final_price.csv
Основная логика в функции get_final_price.
Программа запускает существующую версию firefox,
пристегивает к ней geckodriver, а к нему Selenium.
При падении завершает процессы, и выводит ошибку в консоль.
Сделано в качестве тестового задания в марте 2024.
'''
from subprocess import Popen
import csv
import time
# from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver import FirefoxOptions, Remote
from selenium.webdriver.support.wait import WebDriverWait
def get_final_price(driver):
driver.get('https://www.nseindia.com/')
# Логика наведения мышки ниже,
# но она не отрабатывает на странице
# market_data_button = driver.find_element(By.LINK_TEXT, 'MARKET DATA')
# actions = ActionChains(driver)
# actions.move_to_element(market_data_button).perform()
# я перехожу на следующую страницу по клику
market_data_button = driver.find_element(By.LINK_TEXT, 'MARKET DATA')
WebDriverWait(driver, 5).until(EC.element_to_be_clickable(market_data_button))
market_data_button.click()
open_market_button = driver.find_element(By.LINK_TEXT, 'Pre-Open Market')
WebDriverWait(driver, 5).until(EC.element_to_be_clickable(open_market_button))
open_market_button.click()
# Если собирать таблицу через Expected Condition,
# получается нестабильно, сыпется, всё, что может,
# проблемно отлавливать ошибки, оставил простой таймер
time.sleep(3)
lines = driver.find_element(
By.CSS_SELECTOR, 'table#livePreTable'
).find_element(
By.CSS_SELECTOR, 'tbody'
).find_elements(By.CSS_SELECTOR, 'tr')
final_price_list = []
for line in lines[:-1]: # последняя строка - Total
col = line.find_elements(By.CSS_SELECTOR, 'td')
obj = dict(
Имя=col[1].text,
Цена=col[6].text
)
final_price_list.append(obj)
return final_price_list
def save_csv(dict_list):
with open('final_price.csv', 'w', encoding='utf-8', newline='') as file:
writer = csv.DictWriter(
f=file,
fieldnames=dict_list[0].keys()
)
writer.writeheader()
writer.writerows(dict_list)
def runner():
firefox = Popen(
('C:\\Program Files\\Mozilla Firefox\\firefox.exe', '-start-debugger-server', '2828', '-marionette')
)
geckodriver = Popen(
('D:\\python\\geckodriver.exe', '--connect-existing', '--marionette-port', '2828')
)
driver = Remote(
command_executor='http://127.0.0.1:4444',
options=FirefoxOptions()
)
final_price_list = []
try:
final_price_list = get_final_price(driver)
except Exception as exc:
print(exc)
# Лучше, конечно, уточнить обработку ошибок
# но я сделал "грязно",
# т.к. это одноразовый скрипт
geckodriver.terminate()
firefox.terminate()
return final_price_list
if __name__ == '__main__':
final_price_list = runner()
save_csv(final_price_list)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment