RSelenium jako alternatywa dla rvest podczas web-srcapingu


Krzysztof Słomczyński
      

12 stycznia 2016



Scrapowanie danych

  • projekt MI^2 pracuj.pl
  • analiza rynku wynajmu nieruchomości na podstawie danych zebranych z gumtree.pl
  • aplikacja CzasDojazdu na podstawie danych zebranych z gumtree.pl



Standardowy schemat portalu

  • wolny dostęp do danych (zakładanie konta na portalu jest zbędne)
  • brak jawnych zabezpieczeń przed automatami (captcha)
  • kolejne strony z wynikami wyszukiwania w adresie url
  • np. pracuj.pl, gumtree.pl czy allegro.pl



Pakiet rvest

  • autor i maintainer - Chief Scientist w RStudio - Hadley Wickham
  • zainspirowany pakietem Beautiful Soup z języka Python
  • prosty w instalacji i obsłudze
  • 28 funkcji pozwalających pobierać kod html i wyłuskiwać z niego interesujące fragmenty



Zabezpieczone portale

  • niezbędne założenie konta i zalogowanie się w celu przeglądania zawartości
  • zabezpieczenia w postaci captcha
  • interaktywne (rozwijane) menu
  • np. Glassdoor, Meetup czy portale społecznościowe

Problem z logowaniem

Problem z logowaniem



Recepta

  • uruchomienie sesji przeglądarki przez Selenium Server
  • nawiązanie sesji przez RSelenium
  • dla wygody - zdalny pulpit (np. Vinagre)



Instalacja (niezbędnych) narzędzi

  • Docker - narzędzie do tworzenia gotowych, skonfigurowanych kontenerów - lżejszych od wirtualnych maszyn (czym jest Docker i dlaczego go używać?)
  • obraz Docker z zainstalowanym Selenium Server
  • Vinagre - program do uruchamiania zdalnego pulpitu
  • Selenium wspiera Firefox, IE, Safari, Opera, Chrome niezależnie od systemu operacyjnego



Czym jest Selenium?

Zestaw narzędzi do międzyplatformowego zautomatyzowanego testowania aplikacji internetowych i czynności związanych z przeglądarkami.

W skład pakietu wchodzą:

  • Selenium IDE (Integrated Development Environment)
  • Selenium WebDriver

Jak to działa?

Uruchomienie kontenera Docker

sudo docker run -d -p 5901:5900 \
    -p 127.0.0.1:4445:4444 \
    --name selenium_server \
    selenium/standalone-firefox-debug:2.53.1

Programowanie obiektowe

library(RSelenium)
remDr <- RSelenium::remoteDriver(remoteServerAddr = "localhost",
                                 port = 4445L,
                                 browserName = "firefox")

# Obiekt bazowy?
!base::is.object(remDr)
[1] FALSE

# Klasy S3?
!base::isS4(remDr)
[1] FALSE

# Klasy S4?
base::isS4(remDr)
[1] TRUE

# Klasy referencyjnej?
is(remDr, "refClass")
[1] TRUE
pryr::otype(remDr)
[1] "RC"

# Metoda konkretnej klasy użyta na danym obiekcie
remDr$open(silent = TRUE)
  • metody należą do obiektów, nie do funkcji
  • obiekty sa mutowalne
  • wchodzimy w terytorium Java


Podstawowe operacje

# Otwarcie przeglądarki, przejście do strony, powrót na poprzednią, odświeżenie,
# pozyskanie adresu
remDr$open()
remDr$navigate(url)
remDr$goBack()
remDr$goForward()
remDr$refresh()
remDr$getCurrentUrl()

# Działania na DOM (Document Object Model)
webElem <- remDr$findElement(using = "name|id|class|css|tag|xpath", value = "")

# Przesyłanie informacji
webElem$sendKeysToElement(list("", key = "enter"))
webElem$clickElement()

# Podświetlanie elementu
webElem$highlightElement()

RSelenium w akcji

  • wklejanie tekstu (login, hasło) w odpowiednie pola
  • klikanie przycisków od logowania czy rozwijanych menu
  • w razie wątpliwości - podświetlenie interesującego nas obiektu


Captcha

  • możliwa jednorazowa operacja
  • możliwość spowolnienia algorytmu za pomocą base::Sys.sleep()
  • zaimplementowanie prostej sieci neuronowej rozpoznającej tekst

Co dalej?

Dzięki RSelenium w bardzo prosty sposób udało się wyłuskać dane z portalu Meetup i na ich podstawie stworzyć grafikę z konferencjami R które już się odbyły oraz z tymi nadciągającymi.