Góry - scraping Wikipedii

Tym razem wyjątkowo artykuł będzie po polsku. O scrapowaniu (pol.skrobaniu) Wikipedii z wykorzystaniem języka R. 

Nudny Wstęp

Od pewnego czasu zbierałam się, żeby przetestować połączenie Tableau 10 z R, zbierałam się też z tematem scrapowania danych z internetu. O reszcie tematów, które dręczą głowę, pozwolę nie wspominać. I tak wchodząc pewnego pięknego listopadowego dnia na Klimczok, wpadłam na pomysł jak to połączyć.  Od pomysłu do realizacji dzieliły mnie tylko dni urlopowe do wykorzystania i kilka kolejnych tygodni oczekiwania na wolne wieczory ;)

 

 

Efekt finalny poniżej, droga dochodzenia pod raportem, kod R na końcu

 


 
Co się przydało ?

- Zainstalowany R, Rstudio wraz z pakietami rvest, plyr

- Rozszerzenie do Chroma -SelectorGadget, które ułatwia określenie kodu elementu strony http://selectorgadget.com/

- Tableau 10

- Notepad++ (zawsze się przydaję :), ale w tym przypadku chodziło o napisanie kodu do strony, którą zagnieździłam w raporcie Tableau)

- Flaticonke, stworzoną przez Freepika, pobrałam ze strony http://www.flaticon.com/free-icon/backpacker-hiking_10889#term=mountain&page=1&position=94 

 

Co zrobiłam?

1. Początek ma miejsce na stronie Wikipedii na temat Najwybitniejszych Górskich Szczytów w Polsce

https://pl.m.wikipedia.org/wiki/Lista_najwybitniejszych_szczyt%C3%B3w_Polski

Na stronie znajduje się tabela składająca się z następujących kolumn:

Nr, Nazwa, Pasmo, Wysokość n.p.m , Wybitność.

 

Ot tabela jakich wiele w Wikipedii, uznałam, jednak że przydałyby się informacje o koordynatach ( długość i szerokość geograficzna), dzięki temu można było ulokować szczyt na mapie w Tableau.  

2. Żeby pozyskać kolumny z koordynatami, mogłam każdy z tych linków otwierać, sprawdzać długość i szerokość, kopiować, wklejać itd albo wykorzystać R, bibliotękę rvest i napisać pętle której wyniki zostana w dalszej kolejności połączone z tabelą dt  Najwybitniszych górskich szczytów.

Co sprawiło problem?

1. Kodowanie na język polski pliku z domyślnym eRowym rozszerzeniem, a następnie obsługa kodowania pliku przez Tableau. Finalnie zdecydowałam się na zapis wyniku do foramtu csv, który umożliwił wybranie formatu WINDOWS-1250.

2. Koordynaty, początkowo pobrałam współrzędne geograficzne w stopniach, minutach 50°44′09″N 15°44′21″E . trudno je w tej formie wczytać do Tableau, stopień jest zamieniany na ciąg znaków, można to oczywiście przekonwertować, ale prościej jest zescrapować je w formacie stopni dziesiętnych

3. URL. Tabela z listą najwybitniejszych szczytów, zawiera listę 48 gór.

W większości przypadków url tworzony jest wg. schematu

https://pl.m.wikipedia.org/wiki/ + Nazwa.

 
Gdybym tworzyła url w w/w sposób, pozbawiłabym się informacji na temat aż 10 gór z 48, gdyż 10 z gór, ma inny url niż nazwa np. Dla góry Łysica, spodziwalibysmy się nazwy https://pl.m.wikipedia.org/wiki/%C5%81ysica

A faktyczny url to

https://pl.m.wikipedia.org/wiki/%C5%81ysica_(G%C3%B3ry_%C5%9Awi%C4%99tokrzyskie)

 
  

Pobrałam adresy url, dla drugiej kolumny tabeli tb (dla Nazwy), co się okazało? Że pomimo iż lista składa się z 48 gór, linków jest 49 i przez to nie mogą połączyć tabeli tb z linkami.

Pewnie, istnieje jakiś automatyczny sposób na wykluczenie tego typu błędów, ale jako, że rekordów było niewiele, uznałam, że  na oko wypatrzę przyczynę. W 21 wierszu, obok siebie widniały 2 linki. Jeden z nich zwyczajnie usunęłam. Niestety nie zawsze, można pozwolić sobie na taką swobodę

 I to byłoby na tyle, kod R znajdziecie poniżej. Jeśli macie pytania, uwagi, sugestie, zachecam do kontaktu.

 


KOD R

library("rvest")

library("plyr")

 

## 1. Okreslam url z którego bede pobierac tablee z lista najwybietnijszych szczytow

 

url <- read_html("https://pl.m.wikipedia.org/wiki/Lista_najwybitniejszych_szczyt%C3%B3w_Polski" , encoding = "UTF-8")

 

## 2. Tworze zmienna tb, ktora przechowuje tabele

tb <- url %>%

 html_node(".wikitable")  %>%  html_table()

tb

 

## 3. Pozyskuje informacje o linkach do nazw z tabeli

links = url %>%

 html_node(".wikitable") %>%

 html_nodes("td:nth-child(2) a") %>%

 html_attr("href")

links

 

## 4. Linki chce przypisac do zmiennej url, tj. do nowej kolumny w tabeli tb

##tb["url"] <- links ## pojawil sie komunikat, ze liczba wierszy w tb i links jest rozna (48) (49), ustalam z czego wynika róznica (w jednym wierszu (22) pojawily sie 2 linki), oczyszczam dane poprzez usuniecie zbednego linku

links <- links[c(-22)]

links<-  paste("https://pl.m.wikipedia.org" ,links,sep="")

tb["url"] <- links

tb

 
 

## 5. Teraz dla kazdego linku, bede pobierac koordynaty w stopniach dziesietncyh .geo-nondefault .latitude

 

d = NULL  ## pusta zmienna. Do niej zostan? do??czone resultat z p?tli

 

for (i in tb$url) {  

 for ( j in 1) {

   tryCatch({

     

     url2 <- read_html(i)

     

     ## 2. tworze zmienna tb ktora bedzie przychwywac tabele

     latitude <- url2  %>%

       html_node(".geo-nondefault .latitude")    %>%   html_text()

     latitude ##odczyt szerokosci geograficzne

     ## 3

     longitude <- url2  %>%

       html_node(".geo-nondefault .longitude")    %>%   html_text()

     longitude ##odczyt szerokosci geograficzne

     

     ## stworzenie zmiennej z koordynatami  (gdybym chciala miec w 1kol)

     coordinates<- paste(latitude, longitude, sep=",")

     d = rbind(d, data.frame(i,   longitude, latitude))

   }

   , error=function(e){cat("ERROR :",conditionMessage(e), "\n")})

 }}

 
 

### 6. podmiana nazw kolumn (wskazane przed joinowaniem )

tb2<-rename(d, c("i"="url" ))  ## podmiana kol i na url

 

tb2

 

 

 

## 7.joinowanie

 

tb_out <-merge(x = tb, y = tb2, by = "url", all.x = TRUE)

 

## 8. zamiana przecinkow na kropki

tb_out$latitude  <- sub(",", ".", tb_out$latitude )

tb_out$longitude  <- sub(",", ".", tb_out$longitude )

tb_out

 

 

 

### 8 zapis

 

 

write.csv(tb_out, file = "tb_out.csv")  ###  odczyt read.csv("tb_out.csv")