R: Hämta annonsdata från Platsbanken

I helgen pysslade jag med att hämta ut annonsdata från Platsbankens API, med användning av R. En student ska analysera annonser, och jag funderade på om det inte fanns något enklare sätt att samla in annonserna än klipp & klistra. Det gjorde det.

En initialt klurig sak var att få fatt i alla träffar och inte bara de 20 första. Där fick jag cykla över alla sidor och skapa en lista över samtliga annons-ID i en kategori.

# Initiera en tom lista
totalAnnonsIDlista <- c()

# När detta körs, fylls listan på
for(page in pages) {
  pageURL <- paste0("http://api.arbetsformedlingen.se/platsannons/matchning?yrkesomradeid=", yrkesomradeid, "&sida=", page)
  # print(pageURL)
  annonsIDXML <- GET(pageURL, add_headers("Accept-Language" = "se-sv,sv"), accept_xml())
  annonsIDDOM = xmlRoot(xmlTreeParse(annonsIDXML))
  annonsIDlistasida <- getAnnonsIDlista(annonsIDDOM)
  totalAnnonsIDlista <- append(totalAnnonsIDlista, annonsIDlistasida)
}

Sen ville jag för varje annons plocka ut rubrik, vem som satt in annonser, yrkeskategori, och annonstext.

getAnnonser <- function(doc) {
  matrix <- data.frame(annonsid=NA, annonsrubrik=NA, yrkesbenamning=NA, arbetsplatsnamn=NA, annonstext=NA)
  for(i in doc) {
    print(i)
    URLannons <- paste0("http://api.arbetsformedlingen.se/platsannons/", i)
    print(URLannons)
    annonsXML <- GET(URLannons, add_headers("Accept-Language" = "se-sv,sv"), accept_xml())
    annonsDOM = xmlRoot(xmlTreeParse(annonsXML))
    row <- c(annonsDOM[[1]][1]$annonsid[1]$text$value, annonsDOM[[1]][2]$annonsrubrik[1]$text$value, annonsDOM[[1]][4]$yrkesbenamning[1]$text$value, annonsDOM[[4]][1]$arbetsplatsnamn[1]$text$value, annonsDOM[[1]][3]$annonstext[1]$text$value )
    matrix <- rbind(matrix, row)
  }
  return(matrix)
}

# Stoppa in lista med ID i denna funktion, t.ex. ovan totalAnnonsIDlista
annonser <- getAnnonser(totalAnnonsIDlista)

EGENTLIGEN skulle jag ha velat ha en funktion som kunde hitta, i den fria annonstexten, enbart sådant som beskriver kandidatens egenskaper, men det känns som det krävs nån slags avancerad språkmotor för något sånt. Det här hjälper dock till med att samla in data i ett första steg, som sen måste analyseras av en människa i vilket fall.

Hela koden med för-steg och skriv till fil etc finns på GitHub.