Próbuję pobrać 24-miesięczne dane z www1.nseindia.com i nie powiedzie się na kierowcach Chrome i Firefox. Po prostu zamarza po napełnieniu wszystkich wartości w wymaganych miejscach i nie klikają. Strona nie odpowiada ...

Poniżej znajduje się kod, który próbuję wykonać:

import time
from selenium import webdriver
from selenium.webdriver.support.ui import Select

id_list = ['ACC', 'ADANIENT']

# Chrome
def EOD_data_Chrome():
    driver = webdriver.Chrome(executable_path="C:\Py388\Test\chromedriver.exe")
    driver.get('https://www1.nseindia.com/products/content/equities/equities/eq_security.htm')
    s1= Select(driver.find_element_by_id('dataType'))
    s1.select_by_value('priceVolume')
    s2= Select(driver.find_element_by_id('series'))
    s2.select_by_value('EQ')
    s3= Select(driver.find_element_by_id('dateRange'))
    s3.select_by_value('24month')
    driver.find_element_by_name("symbol").send_keys("ACC")
    driver.find_element_by_id("get").click()
    time.sleep(9)
    s6 = Select(driver.find_element_by_class_name("download-data-link"))
    s6.click()

# FireFox(Gecko)
def EOD_data_Gecko():
    driver = webdriver.Firefox(executable_path="C:\Py388\Test\geckodriver.exe")
    driver.get('https://www1.nseindia.com/products/content/equities/equities/eq_security.htm')
    s1= Select(driver.find_element_by_id('dataType'))
    s1.select_by_value('priceVolume')
    s2= Select(driver.find_element_by_id('series'))
    s2.select_by_value('EQ')
    s3= Select(driver.find_element_by_id('dateRange'))
    s3.select_by_value('24month')
    driver.find_element_by_name("symbol").send_keys("ACC")
    driver.find_element_by_id("get").click()
    time.sleep(9)
    s6 = Select(driver.find_element_by_class_name("download-data-link"))
    s6.click()


EOD_data_Gecko()

# Change the above final line to    "EOD_data_Chrome()" and still it just remains stuck...

Uprzejmie pomoc w tym kodzie, który brakuje w tym kodzie, aby pobrać 24-miesięczne dane ... Gdy wykonam to samo w normalnej przeglądarce, z ręcznymi kliknięć, to udane ...

Kiedy ręcznie robisz go w przeglądarce, możesz zmienić wartości jak poniżej:

Set first drop down to : Security wise price volume data
"Enter Symbol"  :  ACC
"Select Series"   :  EQ
"Period" (radio button: "For Past") : 24 Months

Następnie kliknij przycisk "Uzyskaj dane", aw około 3-5 seconds, ładunki danych, a następnie po kliknięciu "Pobierz plik w formacie CSV", możesz mieć plik CSV w plikach do pobrania

Potrzebujesz pomocy przy użyciu dowolnej biblioteki, którą znasz na skrobanie w Pythonie: Selen, BeautifulSoup, prośby, Scrappy itp ... tak naprawdę nie ma znaczenia, chyba że jest to python ...

Edytuj: @patrick Bormann, Pls Znajdź zrzut ekranu ... Uzyskaj przyciski Data Works .. Get_data_Button działa

3
Lokkii9 25 luty 2021, 11:53

1 odpowiedź

Najlepsza odpowiedź

Kiedy mówisz, że działa ręcznie, czy próbujesz symulować kliknięcie z łańcuchami akcji zamiast wewnętrznej funkcji Click

from selenium.webdriver.common.action_chains import ActionChains
easy_apply = Select(driver.find_element_by_id('dateRange'))
actions = ActionChains(driver)
actions.move_to_element(easy_apply)
actions.click(easy_apply)
actions.perform()

A następnie symulujesz ruch myszy do określonej wartości?

Ponadto próbowałem go na własną rękę, a ja nie otrzymałem żadnych danych podczas naciskania przycisku Uzyskaj dane, ponieważ wydaje się, że ma klasę "Get", jak wspomniałeś, ale ten przycisk nie działa, ale jak widać tam Istnieje drugi przycisk zwany pełnym pobraniem, być może YPU spróbuj użyć tego? Ponieważ przycisk GetData nie działa na Firefoksie i Chrome (kiedy go przetestowałem).

Spróbowałeś już go złapać przez link? Wprowadź opis obrazu tutaj

aktualizacja

Ponieważ PO pyta o pomoc w tej pilnej materii dostarczyłem rozwiązanie robocze.

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
import time
from selenium.webdriver.support.ui import Select


chrome_driver_path = "../chromedriver.exe"


driver = webdriver.Chrome(executable_path=chrome_driver_path)
driver.get('https://www1.nseindia.com/products/content/equities/equities/eq_security.htm')
driver.execute_script("document.body.style.zoom='zoom 25%'")
time.sleep(2)
price_volume = driver.find_element_by_xpath('//*[@id="dataType"]/option[2]').click()
time.sleep(2)
date_range = driver.find_element_by_xpath('//*[@id="dateRange"]/option[8]').click()
time.sleep(2)
series = driver.find_element_by_name('series')
time.sleep(2)
drop = Select(series)
drop.select_by_value("EQ")
time.sleep(2)
driver.find_element_by_name("symbol").send_keys("ACC")
ez_download = driver.find_element_by_xpath('//*[@id="wrapper_btm"]/div[1]/div[3]/a')
actions = ActionChains(driver)
actions.move_to_element(ez_download)
actions.click(ez_download)
actions.perform()

Tutaj idziesz, przepraszam, wziąłem trochę, musiał przynieść syna do łóżka ... To rozwiązanie zapewnia to wyjście: NSE_Output Mam nadzieję, że jego poprawne. Jeśli chcesz wybrać inne rozwijane menu, możesz zmienić ciąg w SELECT (ciąg ze względu na zbyt duże nieuzasadnione) lub numer w XPath, ponieważ liczba podkreśla indeks. Czas jest zwykle tylko dla elementów, które potrzebują czasu, aby zbudować się na stronie internetowej. Ale zrobiłem doświadczenie, że zbyt szybka zmiana czasami powoduje błędy. Nie możesz zmienić limitu czasu i sprawdzić, czy nadal działa.

Mam nadzieję, że teraz możesz iść ponownie w zarobić pieniądze na życie w Indiach. Wszystkie najlepsze Patrick,

Nie wahaj się zapytać, czy masz jakieś pytania.

UPDATE2

Po jednej długiej nocy i kolejny dzień pomyślaliśmy, że zamarzanie pochodzi z witryny, ponieważ strona internetowa używa:

Bumerang |. AKAMAI Developer Developer.akamai.com/tools/... Boomerangis Biblioteka JavaScript Forreal Monitoring użytkownika (powszechnie nazywany Rum). Boomerang mierzy charakterystykę wydajności ładunków i interakcji na świecie. Dokumentacja na tej stronie jest dla MPLSE's Boomerang. Ogólna dokumentacja API dla Boomerang można znaleźć ATDOCS.SOASTA.COM/BOOMERANG-API/. . Co odkryłem z nagłówka HTML.

Jest to wyraźnie sieć wykrywania botów / javascript. Z pomocą tego tak post: Czy witryna jest wykryta podczas korzystania z selenu Chromedriver?.

I drugi akapit z tego postu: https://piprogramming.org/articles/how-to-make-selenium-nateTectable-Id-Stalth ... Twoja automatyzacja-od-Detection-0000000017.Html

W końcu rozwiązałem problem: zmieniliśmy

Var_key w chromedriver do czegoś innego jak:

var key = '$dsjfgsdhfdshfsdiojisdjfdsb_';

Ponadto zmieniłem kod do:

import time
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support.ui import Select
from selenium.webdriver.chrome.options import Options
options = webdriver.ChromeOptions()

chrome_driver_path = "../chromedriver.exe"
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option('useAutomationExtension', False)
options.add_argument('--disable-blink-features=AutomationControlled')

driver = webdriver.Chrome(executable_path=chrome_driver_path, options=options)
driver.execute_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})")


driver.get('http://www1.nseindia.com/products/content/equities/equities/eq_security.htm')
driver.execute_script("document.body.style.zoom='zoom 25%'")
time.sleep(5)
price_volume = driver.find_element_by_xpath('//*[@id="dataType"]/option[2]').click()
time.sleep(3)
date_range = driver.find_element_by_xpath('//*[@id="dateRange"]/option[8]').click()
time.sleep(5)
series = driver.find_element_by_name('series')
time.sleep(3)
drop = Select(series)
drop.select_by_value("EQ")
time.sleep(4)
driver.find_element_by_name("symbol").send_keys("ACC")
actions = ActionChains(driver)
ez_download = driver.find_element_by_xpath('/html/body/div[2]/div[3]/div[2]/div[1]/div[3]/div/div[1]/form/div[2]/div[3]/p/img')
actions.move_to_element(ez_download)
actions.click(ez_download)
actions.perform()
#' essential because the button has to be loaded
time.sleep(5)
driver.find_element_by_class_name('download-data-link').click()

Kod ostatecznie pracował, a op jest szczęśliwy.

1
Patrick Bormann 14 marzec 2021, 13:27