Created
March 11, 2024 16:34
-
-
Save andmerk93/8c449a6613d63ffe246299bb294b8c6b to your computer and use it in GitHub Desktop.
Скрипт на Selenium, получает список цен с nseindia.com, и сохраняет его в csv
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
''' | |
Скрипт на 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