Scrapowanie wartosci z giełdy

0

Troche nie ogarniam webscrapingu. Potrzebuje wyciagnac dane z order book na gieldzie przez strone poniewaz api ma ograniczenie. Zalezy mi po wejsciu na strone przez selenium by program pierw zmienil wartosc na 100 a potem pobral wartosci po kliknieciu "1" i potem "2" Probowalem pobrac id przycisku i by kliknal ale cos mi nie szlo w webscrapingu ;/ Zostalem z kodem ktory udalo mi sie cos napisac i dziala ale to nie to heh ;s Ktos doradzi jak to najlepiej zrobic ?

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC


options = Options()
options.add_argument("--headless")

webdriver_path = ''

service = Service(webdriver_path)

driver = webdriver.Chrome(service=service, options=options)

url = 'https://www.binance.com/pl/futures/BTCUSDT'
driver.get(url)

orderbook_element = WebDriverWait(driver, 20).until(
    EC.presence_of_element_located((By.CSS_SELECTOR, ".orderbook-list.orderbook-ask"))
)

orderbook_data = driver.execute_script("return arguments[0].innerText;", orderbook_element)
tab = orderbook_data.split('\n')

data_groups = [tab[i:i+3] for i in range(0, len(tab), 3)]
for group in data_groups:
    cena = group[0]
    ilosc = group[1]
    suma = group[2]
    print("Cena: {}, Ilość: {}, Suma: {}".format(cena, ilosc, suma))


driver.quit()

Zrzut ekranu.jpg

0

Dobra udalo mi sie ogarnac ale mam problem nie pobiera mi wszystkich elementow. Jakis pomysl ?

import time

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()

driver.get("https://www.binance.com/pl/futures/BTCUSDT")

cookie_button = WebDriverWait(driver, 10).until(
    EC.visibility_of_element_located((By.ID, "onetrust-accept-btn-handler"))
)

cookie_button.click()

combobox = WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.XPATH, "//div[@class='tick-content']"))
)

combobox.click()

value_100 = WebDriverWait(driver, 10).until(
    EC.visibility_of_element_located((By.XPATH, "//div[@class='css-o950o9' and contains(text(), '100')]"))
)
try:
    value_100.click()
    svg_element = WebDriverWait(driver, 10).until(
        EC.visibility_of_element_located((By.XPATH, "//svg[@class='css-3kwgah']")))
    svg_element.click()
except Exception as e:
    print("Wystąpił błąd:", str(e))
    
print("tu1")

buttonn = WebDriverWait(driver, 10).until(
    EC.visibility_of_element_located((By.CSS_SELECTOR, "button[data-testid='buyModeButton']"))
)

buttonn.click()
time.sleep(2)
try:
    orderbook_element = WebDriverWait(driver, 30).until(
        EC.visibility_of_element_located((By.CSS_SELECTOR, ".orderbook-list-container"))
    )
    ##############
    ##############
    print("tu")
    time.sleep(2)
    orderbook_data = driver.execute_script("return arguments[0].innerText;", orderbook_element)
    tab = orderbook_data.split('\n')

    print(orderbook_element)
    data_groups = [tab[i:i + 3] for i in range(0, len(tab), 3)]
    for group in data_groups:
        cena = group[0]
        ilosc = group[1]
        suma = group[2]
        print("Cena: {}, Ilość: {}, Suma: {}".format(cena, ilosc, suma))

except Exception as e:
    print(e)

time.sleep(100)
driver.quit()

1

Sprawdź najlepiej czy ten serwis udostępnia API.

0

"przez strone poniewaz api ma ograniczenie"

0
Escanor16 napisał(a):

"przez strone poniewaz api ma ograniczenie"

Lista 10 alternatyw:

https://rapidapi.com/collection/binance-api

1

Możliwości jest wiele:

  • HTML renderowany przez js'a
  • Infinite scroll
  • Wybrałeś kiepski selector

Poza tym odpuść sobie time.sleep, bo psujesz tym cały flow. Flow w selenium powinien bazować tylko i wyłącznie na elementach.

WebScraping to metoda prób i błędów no i mało stabilne rozwiązanie.

0

Dodalem spejalnie time.sleep "zeby dac czas na zaladowanie danych na stronie". Nie wiem jak podejsc do tego . Pobiera mi ordery ale nie z calego rangu.

Zrzut ekranu .jpg
Bardziej zalezalo na pobraniu danych z "2" ale nie chce ich pobrac. Na opcji 1 dziala ale nie wszystko pobiera.
Zrzut ekranu2.jpg
Gdy pobieram przez api mam mniejszy range. Na stronie dostaje wiekszy. Nie ma znaczenia z jakiego api bym korzystal.
Tak wyglada gdy pobieram przez api ...
Zrzut ekranu3.jpg

0

Dobra temat rozwiazany ;) ogarniete

1 użytkowników online, w tym zalogowanych: 0, gości: 1