график в реальном времени с matplotlib и селеном - PullRequest
1 голос
/ 17 мая 2019

В настоящее время я очищаю веб-сайт и пытаюсь создать график в режиме реального времени на основе информации, получаемой с веб-сайта, используя селен и используя matplotlib для создания графика.Кажется, я не могу заставить программу создать график, программа, кажется, в состоянии получить информацию с веб-сайта, но график, кажется, не работает, может кто-то помочь.Ниже приведен код

Я приказываю, чтобы программа работала. В открывшемся окне должен быть теннисный матч

ff = []

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
from selenium.common.exceptions import StaleElementReferenceException
from selenium.common.exceptions import NoSuchElementException
import datetime

import matplotlib.pyplot as plt      
import matplotlib.animation as animation
from matplotlib import style


style.use('fivethirtyeight')


driver = webdriver.Chrome()  
driver.maximize_window()
wait = WebDriverWait(driver, 50)


driver.execute_script('window.open("https://livebetting.sportingbet.com/en/live#/8637814","_self")')


python_button = driver.find_elements_by_xpath('//*[@id="scoreboard"]/div[2]/div/lbk-scoreboard-common/div/div[1]/a/span')[0]
python_button.click()

statButton = driver.find_elements_by_xpath('//*[@id="scoreboard"]/div[2]/div/lbk-scoreboard-common/div/div[2]/div/div[1]/div/span[1]')[0]
statButton.click()

fig = plt.figure()
ax1 = fig.add_subplot(1,1,1)


def animate(i):

    title = driver.find_elements_by_xpath('//*[@id="scoreboard"]/div[1]/div[2]/span[3]')[0].text
    import time
    count = 0
    y = []
    x = []



    while title == driver.find_elements_by_xpath('//*[@id="scoreboard"]/div[1]/div[2]/span[3]')[0].text:
        #while driver.find_elements_by_xpath('//*[@id="event"]/lb-marketboard/div/div/div[1]')[0].text != 'We are sorry but no bets are available for this event.'
        try:
           # now = datetime.datetime.now()
           # dat.append(wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="tracker__header"]/div'))).text.splitlines())
            ff.append(wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="scoreboard"]/div[2]/div'))).text.splitlines())
           # ff[len(ff)-1].append(str(now.minute) + ":" + str(now.second))
            ff[len(ff)-1].append(wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="scoreboard"]/div[2]/div/lbk-scoreboard-details/div/div/div[2]/div[1]/div[2]/span'))).get_attribute("class"))
            ff[len(ff)-1].append(wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="scoreboard"]/div[2]/div/lbk-scoreboard-details/div/div/div[2]/div[1]/div[3]/span'))).get_attribute("class"))
            print(ff[len(ff)-1])
            print("\n")

            if ff[len(ff)-1][2] != "TB":
                y.append(int(ff[len(ff)-1][17][:ff[len(ff)-1][17].find("%")]))
            else:
                y.append(int(ff[len(ff)-1][18][:ff[len(ff)-1][18].find("%")]))

            x.append(count)



        except (TimeoutException,StaleElementReferenceException):
            print('error')

        count+=1
        time.sleep(10)

        ax1.plot(x,y)
        plt.pause(0.05)
        plt.show()

ani= animation.FuncAnimation(fig, animate, interval=2000)    

Я пытаюсь создать график в реальном времени на основеинформация, получаемая с сайта

1 Ответ

0 голосов
/ 19 мая 2019

Драйвер работает в главном потоке и блокирует matplotlib от рендеринга фигуры в окне.

Вы можете запустить драйвер в отдельном потоке, оставив matplotlib работающим в основном потоке.

Поток браузера может быть реализован так:

from threading import Thread

class Browser(Thread):
    def __init__(self, plot):
        super().__init__()
        self.plot = plot
        self.mkt_board = None

    def run(self):
        self.driver = webdriver.Chrome()
        self.driver.get("https://livebetting.sportingbet.com/en/live#/8637814")
        homepage = Homepage(self.driver)
        mkt_board = homepage.marketboard()
        mkt_board.transfer_pulse(self.plot)

Здесь я убедился, что драйвер запущен в потоке, создав его экземпляр методом run.

Экземпляр Browser инициализируется с экземпляром Plot, объявленным как:

class Plot:
    def __init__(self):
        super().__init__()
        style.use('fivethirtyeight')
        x, y = [], []
        fig = plt.figure()
        ax1 = fig.add_subplot(1, 1, 1)
        self.fig = fig
        self.ax1 = ax1
        self.x = x
        self.y = y
        self.ax1.plot(x, y)

    def update(self, x_new, y_new):
        self.x.append(x_new)
        self.y.append(y_new)
        self.ax1.plot(self.x, self.y)
        self.fig.canvas.draw_idle()

    def run(self):
        self.b = Browser(self)
        self.b.start()
        plt.show()

Кроме того, я использовал шаблон Page Objects , чтобы было легче рассуждать о потоке.

class Page:
    def __init__(self, driver):
        self.driver = driver

    def wait_and_find(self, xpath):
        wait = WebDriverWait(self.driver, 50)
        wait.until(EC.presence_of_element_located((By.XPATH, xpath)))
        return self.driver.find_elements_by_xpath(xpath)[0]

class Homepage(Page):
    def scoreboard(self):
        xpath = '//*[@id="scoreboard"]/div[2]/div/lbk-scoreboard-common/div/div[1]/a/span'
        return self.wait_and_find(xpath)

    def marketboard(self):
        self.scoreboard().click()
        self.stat().click()
        return Marketboard(self.driver)

    def stat(self):
        xpath = '//*[@id="scoreboard"]/div[2]/div/lbk-scoreboard-common/div/div[2]/div/div[1]/div/span[1]'
        return self.wait_and_find(xpath)


class Marketboard(Page):
    NO_BETS = 'We are sorry but no bets are available for this event.'

    def __init__(self, driver):
        self.driver = driver

    def wait_and_find(self, xpath):
        wait = WebDriverWait(self.driver, 50)
        wait.until(EC.presence_of_element_located((By.XPATH, xpath)))
        return self.driver.find_elements_by_xpath(xpath)[0]

    def title(self):
        return self.driver.find_elements_by_xpath('//*[@id="scoreboard"]/div[1]/div[2]/span[3]')[0].text

    def content(self):
        return self.driver.find_elements_by_xpath('//*[@id="event"]/lb-marketboard/div/div/div[1]')[0].text

    def pulse(self, plot):
        '''Replace with info retrieved from your page'''
        while True:
            plot.update(random.randint(0, 100), random.randint(0, 100))
            time.sleep(2)

Теперь запустите сюжет.

p = Plot()
p.run()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...