Commit c4014121 authored by Emil Bordin's avatar Emil Bordin
Browse files

Task 2 abgeschlossen

parent 89f693f9
Loading
Loading
Loading
Loading
+5524 −0

File added.

Preview size limit exceeded, changes collapsed.

+5524 −0

File added.

Preview size limit exceeded, changes collapsed.

+13 −0
Original line number Diff line number Diff line
Version: 1.0

RestoreWorkspace: Default
SaveWorkspace: Default
AlwaysSaveHistory: Default

EnableCodeIndexing: Yes
UseSpacesForTab: Yes
NumSpacesForTab: 2
Encoding: UTF-8

RnwWeave: Sweave
LaTeX: pdfLaTeX
+342 −0
Original line number Diff line number Diff line
#Take Home Assignment
#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#Task 1 ----
#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

#Ordner erstellt und Assignment hinterlegt

#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#Task 2 ----
#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
rm(list=ls())

#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# LOAD LIBRARIES ---- 
#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
library("readxl")
library("httr")
library("dplyr")
library("jsonlite")
library("lubridate")

#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#Task 2: a ----
#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

# API-Zugangsdaten
headers = c("Content-Type" = 'application/x-www-form-urlencoded')

data = list(
  client_id = 'c003a37f-024f-462a-b36d-b001be4cd24a',
  client_secret = '32a39620-32b3-4307-9aa1-511e3d7f48a8',
  grant_type = 'client_credentials'
)

# Token anfordern
res <- POST(url = 'https://rest.arbeitsagentur.de/oauth/gettoken_cc',
            add_headers(.headers = headers),
            body = data,
            encode = 'form')

token <- content(res)$access_token

# Basis-URL der API
base_url <- "https://rest.arbeitsagentur.de/jobboerse/jobsuche-service/pc/v4/jobs"

# Parameter für die initiale Anfrage
initial_payload <- list(
  "was" = "Daten",
  "wo" = "Stuttgart",
  size = 1,
  page = 1,
  "umkreis" = 100
)

# Initiale Anfrage, um die Gesamtanzahl der Ergebnisse zu bekommen
initial_response <- GET(url = base_url, 
                        add_headers(Authorization = paste("Bearer", token), Accept = "application/json"),
                        query = initial_payload)

initial_content <- rawToChar(initial_response$content)
Encoding(initial_content) <- "UTF-8"
initial_json <- fromJSON(initial_content)

# Debugging: Ausgabe des gesamten Inhalts der initialen API-Antwort
print(initial_json)

# maxErgebnisse bestimmen
maxErgebnisse <- initial_json$maxErgebnisse

# Debugging: Ausgabe von maxErgebnisse
cat("Max Ergebnisse:", maxErgebnisse, "\n")

# Anzahl der Seiten berechnen
size <- 200
num_pages <- ceiling(maxErgebnisse / size)

# Liste zum Speichern der Ergebnisse von jeder Seite
all_job_postings <- list()

# Schleife zum Herunterladen aller Seiten
for (page in 1:num_pages) {
  payload <- list(
    "was" = "Daten",
    "wo" = "Stuttgart",
    size = size,
    page = page,
    "umkreis" = 100
  )
  
  response <- GET(url = base_url, 
                  add_headers(Authorization = paste("Bearer", token), Accept = "application/json"),
                  query = payload)
  
  content <- rawToChar(response$content)
  Encoding(content) <- "UTF-8"
  data <- fromJSON(content)
  
  # Debugging: Ausgabe der Daten für die aktuelle Seite
  print(data)
  
  if (!is.null(data$stellenangebote)) {
    job_postings <- data$stellenangebote
    # Ergebnisse zur Liste hinzufügen
    all_job_postings[[page]] <- job_postings
  } else {
    message("Keine Stellenangebote auf Seite ", page)
  }
}

# Alle DataFrames in der Liste zu einem gemeinsamen DataFrame zusammenfügen
if (length(all_job_postings) > 0) {
  job_postings <- bind_rows(all_job_postings)
} else {
  job_postings <- tibble()
}

# Den gefilterten DataFrame anzeigen
print(job_postings)

#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#Task 2: b ----
#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

unnest_dataframes <- function(x) {
  y <- do.call(data.frame, x)
  if ("data.frame" %in% sapply(y, class)) unnest_dataframes(y)
  return(y)
}

# Anwenden der Entpackungsfunktion auf job_postings
job_postings_unnested <- unnest_dataframes(job_postings)

# Den entpackten DataFrame anzeigen
print(job_postings_unnested)

#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#Task 2: c ----
#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

# Funktion zum Anfordern des Tokens
get_token <- function() {
  headers <- c("Content-Type" = 'application/x-www-form-urlencoded')
  
  data <- list(
    client_id = 'c003a37f-024f-462a-b36d-b001be4cd24a',
    client_secret = '32a39620-32b3-4307-9aa1-511e3d7f48a8',
    grant_type = 'client_credentials'
  )
  
  res <- POST(url = 'https://rest.arbeitsagentur.de/oauth/gettoken_cc',
              add_headers(.headers = headers),
              body = data,
              encode = 'form')
  
  token <- content(res)$access_token
  return(token)
}

# Funktion zum Entpacken der DataFrames
unnest_dataframes <- function(x) {
  y <- do.call(data.frame, x)
  if ("data.frame" %in% sapply(y, class)) y <- unnest_dataframes(y)
  return(y)
}

# Funktion zum Herunterladen aller Jobs
download_all_jobs <- function(searchterm, location, radius) {
  token <- get_token()
  base_url <- "https://rest.arbeitsagentur.de/jobboerse/jobsuche-service/pc/v4/jobs"
  
  # Parameter für die initiale Anfrage
  initial_payload <- list(
    "was" = searchterm,
    "wo" = location,
    size = 1,
    page = 1,
    "umkreis" = radius
  )
  
  # Initiale Anfrage, um die Gesamtanzahl der Ergebnisse zu bekommen
  initial_response <- GET(url = base_url, 
                          add_headers(Authorization = paste("Bearer", token), Accept = "application/json"),
                          query = initial_payload)
  
  initial_content <- rawToChar(initial_response$content)
  Encoding(initial_content) <- "UTF-8"
  initial_json <- fromJSON(initial_content)
  
  # Debugging: Ausgabe des gesamten Inhalts der initialen API-Antwort
  print(initial_json)
  
  # maxErgebnisse bestimmen
  maxErgebnisse <- initial_json$maxErgebnisse
  
  # Debugging: Ausgabe von maxErgebnisse
  cat("Max Ergebnisse:", maxErgebnisse, "\n")
  
  # Anzahl der Seiten berechnen
  size <- 200
  num_pages <- ceiling(maxErgebnisse / size)
  
  # Liste zum Speichern der Ergebnisse von jeder Seite
  all_job_postings <- list()
  
  # Schleife zum Herunterladen aller Seiten
  for (page in 1:num_pages) {
    payload <- list(
      "was" = searchterm,
      "wo" = location,
      size = size,
      page = page,
      "umkreis" = radius
    )
    
    response <- GET(url = base_url, 
                    add_headers(Authorization = paste("Bearer", token), Accept = "application/json"),
                    query = payload)
    
    content <- rawToChar(response$content)
    Encoding(content) <- "UTF-8"
    data <- fromJSON(content)
    
    # Debugging: Ausgabe der Daten für die aktuelle Seite
    print(data)
    
    if (!is.null(data$stellenangebote)) {
      job_postings <- data$stellenangebote
      # Ergebnisse zur Liste hinzufügen
      all_job_postings[[page]] <- job_postings
    } else {
      message("Keine Stellenangebote auf Seite ", page)
    }
  }
  
  # Alle DataFrames in der Liste zu einem gemeinsamen DataFrame zusammenfügen
  if (length(all_job_postings) > 0) {
    job_postings <- bind_rows(all_job_postings)
  } else {
    job_postings <- tibble()
  }
  
  # Den gefilterten DataFrame anzeigen
  print(job_postings)
  
  
  # Anwenden der Entpackungsfunktion auf job_postings
  job_postings_unnested <- unnest_dataframes(job_postings)
  
  # Den normalen DataFrame anzeigen
  cat("Normaler DataFrame:\n")
  print(job_postings)
  
  # Den entpackten DataFrame anzeigen
  cat("Entpackter DataFrame:\n")
  print(job_postings_unnested)
  
  
}

# Beispielaufruf der Funktion
test_function <- download_all_jobs("Daten", "Stuttgart", 100)


#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#Task 2: d ----
#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

jobs <- download_all_jobs("Daten", "Stuttgart", 100)
today_date <- Sys.Date()
file_name <- paste0(today_date, "_jobs_daten_full.csv")
file_path <- file.path("C:/Users/Surface/git/ids_2024_thas_public/01_data/raw", file_name)
write.csv(jobs, file_path, row.names = FALSE)


#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#Task 2: e ----
#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

conditional_save_downloads <- function(subfolder, jobs, refid_active_jobs = NULL, searchterm) {
  # Das heutige Datum im Format YYYY-MM-DD
  today_date <- Sys.Date()
  
  # Wochentag abrufen (1 = Sonntag, 2 = Montag, ..., 7 = Samstag)
  today_wday <- wday(today_date)
  
  # Pfad des Unterordners erstellen
  base_path <- "C:/Users/Surface/git/ids_2024_thas_public/01_data/downloads"
  subfolder_path <- file.path(base_path, subfolder)
  
  # Sicherstellen, dass der Unterordner existiert, ansonsten erstellen
  if (!dir.exists(subfolder_path)) {
    dir.create(subfolder_path, recursive = TRUE)
  }
  
  # Überprüfen, ob der Unterordner leer ist
  is_empty_subfolder <- length(list.files(subfolder_path)) == 0
  
  # Bedingung: Heute ist Montag oder der Unterordner ist leer
  if (today_wday == 2 || is_empty_subfolder) {
    # Dateiname für den vollständigen Datensatz
    file_name_full <- paste0(today_date, "_jobs_", searchterm, "_full.csv")
    file_path_full <- file.path(subfolder_path, file_name_full)
    
    # Speichern des vollständigen Datensatzes
    write.csv(jobs, file_path_full, row.names = FALSE)
    
    # Ausgabe des Dateipfads zur Bestätigung
    cat("Vollständiger Datensatz gespeichert unter:", file_path_full, "\n")
  } else {
    # Bedingung: refid_active_jobs ist nicht NULL
    if (!is.null(refid_active_jobs)) {
      # Identifizieren neuer und alter Jobs
      new_jobs <- jobs[!jobs$refnr %in% refid_active_jobs, ]
      old_jobs <- data.frame(refnr = refid_active_jobs[refid_active_jobs %in% jobs$refnr])
      
      # Dateinamen für neue und alte Jobs
      file_name_new <- paste0(today_date, "_jobs_", searchterm, "_new.csv")
      file_name_old <- paste0(today_date, "_jobs_", searchterm, "_old.csv")
      
      file_path_new <- file.path(subfolder_path, file_name_new)
      file_path_old <- file.path(subfolder_path, file_name_old)
      
      # Speichern der neuen Jobs
      write.csv(new_jobs, file_path_new, row.names = FALSE)
      
      # Speichern der alten Jobs
      write.csv(old_jobs, file_path_old, row.names = FALSE)
      
      # Ausgabe der Dateipfade zur Bestätigung
      cat("Neue Jobs gespeichert unter:", file_path_new, "\n")
      cat("Alte Jobs gespeichert unter:", file_path_old, "\n")
    } else {
      # Wenn refid_active_jobs NULL ist und es nicht Montag ist, nichts tun
      cat("Keine neuen Daten zu speichern, da refid_active_jobs NULL ist und heute nicht Montag ist.\n")
    }
  }
}

# Beispielaufruf der Funktion zum Testen
jobs <- download_all_jobs("Daten", "Stuttgart", 100)
refid_active_jobs <- c("12345", "67890") # Beispiel-IDs
conditional_save_downloads("00_jobs_searchterm", jobs, refid_active_jobs, "daten")