Selenium Python Pull Data from Dynamic Table, która odświeża się co 5 sekund

Sep 03 2020

Próbuję pobrać dane z tabeli / pulpitu nawigacyjnego czasu rzeczywistego, który odświeża się co 5 sekund. Ponieważ odświeża się co 5 sekund, daje mi niekompletne rekordy [myślę, że zaczynając od wiersza 1, aż do odświeżenia]. Czy istnieje rozwiązanie tego problemu, w którym mogę wyłączyć automatyczne odświeżanie na jakiś czas, może to zająć 15 sekund?

Odpowiedzi

Glatinis Sep 03 2020 at 16:38

Możesz po prostu użyć żądań i pobrać stronę, a dane będą kompletne.

import requests
import time

while True:
    url = "insert url here"
    page = requests.get(url)

    # Parse data

    time.sleep(5)
RichEdwards Sep 05 2020 at 18:40

Z komentarzy masz kilka podejść. Ponieważ nie możesz udostępnić swojej witryny, najlepsze, co mogę zrobić, to opisać, co musisz zrobić i jak sprawiłem, że równoważna witryna działa.

Oba podejścia używają http://www.emojitracker.com/ jako przykładowa witryna.

Podejście 1 - uzyskaj dane w warstwie sieciowej:

  • Przejdź do swojej witryny w przeglądarce Chrome.
  • Otwórz devtools
  • Przejdź do karty sieci
  • Znajdź połączenie, które ściągnie Twoje dane - szukasz GET

W podanej przykładowej witrynie widzę, że mam wpis o nazwie rankings:

HEADERSZakładka opisuje potrzebne dane. W przypadku tej witryny nie ma uwierzytelniania, nie ma nic specjalnego i nie muszę wysyłać żadnego ładunku. Potrzebujemy tylko API i metody:

Request URL: http://www.emojitracker.com/api/rankings
Request Method: GET

Nie może być prościej wrzucić to do Pyhton:

import requests

response = requests.get("http://www.emojitracker.com/api/rankings")
data = response.json()
for line in data:
    print(line['id'])
    print(line['score'])

To wypisuje wynik i identyfikator z odpowiedzi json. Oto jak wyglądamy podczas debugowania:


Podejście 2 - Hakowanie javascript

  • Wejdź na stronę, pozwól stronie się załadować
  • przejdź do devtools
  • przejdź do konsoli
  • wybierz zakładkę źródła i zatrzymaj javascript (prawy górny róg) - zwróć uwagę na miejsce, w którym zatrzymuje się kursor. Zrestartuj i wstrzymaj kilka razy i zanotuj różne zaangażowane funkcje. Spójrz także, co robią, dostrzegając inne związane z tym funkcje.

Kiedy będziesz gotowy - przejdź do zakładki konsoli i wpisz this.stop(). W podanej witrynie zatrzymuje to wezwania do aktualizacji.

To powinno dać Ci czas potrzebny na pobranie danych.

Stąd masz dwie możliwości ponownego uruchomienia danych.

  1. Najprostszym sposobem jest po prostu odświeżenie strony. Spowoduje to ponowne uruchomienie strony z nowymi, przesyłanymi strumieniowo danymi. Zrób to z:
driver.refresh()
  1. Bardziej zabawny sposób, przeczytaj js i dowiedz się, jak ponownie uruchomić transmisję! Użyj inteligencji konsoli, aby ci pomóc.

Przeglądając JS, gdzie został zatrzymany (z powyższych kroków) i trochę prób i błędów znalazłem:

this.startRawScoreStreaming()

Robi to wyjście

application.js:90 Subscribing to score stream (raw)
ƒ (event) {
      return incrementScore(event.data);
    }

I strona ponownie zacznie strumieniować.

Wreszcie, aby uruchomić te fragmenty JS w selenie - użyj .execute_script

driver.execute_script('this.stop()')
## do your stuff
driver.execute_script('this.startRawScoreStreaming()')