Spiegazione codice in R


PRENDERE EMAIL DALLE PAGINE GIALLE

Per prima cosa bisogna importare le librerie che ci serviranno durante il progetto, nel caso queste non siano già state installate occorre scaricarle con il comando install.packages("library_name")

library(xml2)
library(XML)
library(rvest)
library(gmailr)
library(RCurl)
library(plotrix)
library(fmsb)
library(RColorBrewer)
library(readr)
library(xml2)
library(XML)
library(rvest)
library(stringr, warn.conflicts = F)
library(readxl)

Per avere informazioni relative alla geolocalizzazione creiamo due vettori uno con le province ed uno con le regioni relative alle province.

Provincia<-c('Agrigento','Alessandria','Ancona','Aosta','Arezzo','Ascoli Piceno','Asti','Avellino','Bari','Barletta-Andria-Trani','Belluno','Benevento','Bergamo','Biella','Bologna','Bolzano','Brescia','Brindisi','Cagliari','Caltanissetta','Campobasso','Caserta','Catania','Catanzaro','Chieti','Como','Cosenza','Cremona','Crotone','Cuneo','Enna','Fermo','Ferrara','Firenze','Foggia','Forl<ec>-Cesena','Frosinone','Genova','Gorizia','Grosseto','Imperia','Isernia',"L'Aquila",'La Spezia','Latina','Lecce','Lecco','Livorno','Lodi','Lucca','Macerata','Mantova','Massa-Carrara','Matera','Messina','Milano','Modena','Monza e Brianza','Napoli','Novara','Nuoro','Oristano','Palermo','Padova','Parma','Pavia','Perugia','Pesaro e Urbino','Pescara','Piacenza','Pisa','Pistoia','Pordenone','Potenza','Prato','Reggio Calabria','Ragusa','Ravenna','Reggio Emilia','Rieti','Rimini','Roma','Rovigo','Salerno','Sassari','Savona','Siena','Siracusa','Sondrio','Sud Sardegna','Taranto','Teramo','Terni','Torino','Trapani','Trento','Treviso','Trieste','Udine','Varese','Venezia','Verbano-Cusio-Ossola','Vercelli','Verona','Vibo Valentia','Vicenza','Viterbo')
Regione<-c('Sicilia','Piemonte','Marche',"Valle d'Aosta",'Toscana','Marche','Piemonte','Campania','Puglia','Puglia','Veneto','Campania','Lombardia','Piemonte','Emilia-Romagna','Trentino-Alto Adige','Lombardia','Puglia','Sardegna','Sicilia','Molise','Campania','Sicilia','Calabria','Abruzzo','Lombardia','Calabria','Lombardia','Calabria','Piemonte','Sicilia','Marche','Emilia-Romagna','Toscana','Puglia','Emilia-Romagna','Lazio','Liguria','Friuli-Venezia Giulia','Toscana','Liguria','Molise','Abruzzo','Liguria','Lazio','Puglia','Lombardia','Toscana','Lombardia','Toscana','Marche','Lombardia','Toscana','Basilicata','Sicilia','Lombardia','Emilia-Romagna','Lombardia','Campania','Piemonte','Sardegna','Sardegna','Sicilia','Veneto','Emilia-Romagna','Lombardia','Umbria','Marche','Abruzzo','Emilia-Romagna','Toscana','Toscana','Friuli-Venezia Giulia','Basilicata','Toscana','Calabria','Sicilia','Emilia-Romagna','Emilia-Romagna','Lazio','Emilia-Romagna','Lazio','Veneto','Campania','Sardegna','Liguria','Toscana','Sicilia','Lombardia','Sardegna','Puglia','Abruzzo','Umbria','Piemonte','Sicilia','Trentino-Alto Adige','Veneto','Friuli-Venezia Giulia','Friuli-Venezia Giulia','Lombardia','Veneto','Piemonte','Piemonte','Veneto','Calabria','Veneto','Lazio')

Per seconda cosa chiamiamo lavori il nome della mansione che dobbiamo cercare, inoltre creiamo una matrice che chiamiamo database_scar per poi inserire all'interno le mail della società e le informazioni.

lavori= "mansione da cercare"
database_scar<-matrix(ncol = 5)
colnames(database_scar)<-c("Sito-web","Email","Tipo di struttura","Provincia","Regione")

Infine facciamo la parte di ricerca delle mail che consiste nel ricercare per ogni procincia tramite un ciclo for tutti coloro i quali si sono registrati inserendo il sito web per poi andare ad ricercare all'interno del sito web la mail ricercando all'interno dei link inseriti all'interno del sito il mailto.
In tutto questo utilizziamo molte volte il try per evitare gli errori 404 e anche eventuali errori di blocco da parte del sito per i troppi accessi.

posizione<-0
for(zone in Provincia){
  posizione<-posizione+1
  regione<-Regione[posizione]
  errore=0
  for (i in 1:2000) {
    print(paste(lavori,zone,i))
    try({
    mail<-"le mail"
    page<-"ciao"
    try(page<-read_html(paste0("https://www.paginegialle.it/ricerca/",gsub(" ","%20",lavori),"/",gsub(" ","%20",zone),"/p-",i)))
    if(length(page)==1){
      try(page<-read_html(paste0("https://www.paginegialle.it/ricerca/",gsub(" ","%20",lavori),"/",gsub(" ","%20",zone),"/p-",i)))

      if(length(page)==1){
        try(page<-read_html(paste0("https://www.paginegialle.it/ricerca/",gsub(" ","%20",lavori),"/",gsub(" ","%20",zone),"/p-",i)))

      if(length(page)==1){
        try(page<-read_html(paste0("https://www.paginegialle.it/ricerca/",gsub(" ","%20",lavori),"/",gsub(" ","%20",zone),"/p-",i)))

      if(length(page)==1){
        try(page<-read_html(paste0("https://www.paginegialle.it/ricerca/",gsub(" ","%20",lavori),"/",gsub(" ","%20",zone),"/p-",i)))

      if(length(page)==1){
        try(page<-read_html(paste0("https://www.paginegialle.it/ricerca/",gsub(" ","%20",lavori),"/",gsub(" ","%20",zone),"/p-",i)))

      if(length(page)==1){
        try(page<-read_html(paste0("https://www.paginegialle.it/ricerca/",gsub(" ","%20",lavori),"/",gsub(" ","%20",zone),"/p-",i)))

      if(length(page)==1){
        try(page<-read_html(paste0("https://www.paginegialle.it/ricerca/",gsub(" ","%20",lavori),"/",gsub(" ","%20",zone),"/p-",i)))

      if(length(page)==1){
        try(page<-read_html(paste0("https://www.paginegialle.it/ricerca/",gsub(" ","%20",lavori),"/",gsub(" ","%20",zone),"/p-",i)))

      if(length(page)==1){
        try(page<-read_html(paste0("https://www.paginegialle.it/ricerca/",gsub(" ","%20",lavori),"/",gsub(" ","%20",zone),"/p-",i)))
    }}}}}}}}}
    if(length(page)!=1){
      try(txt<-as.character(html_nodes(page,xpath = '//a')))
      d<-str_locate(txt, "btn-black")
      h<-c(1:length(d[,1]))[-which(is.na(d[,1]))]
      sitiwebdent<-txt[h]
      sitodent<-numeric()
      for (t in 1:length(sitiwebdent)) {
        d<-str_locate(sitiwebdent[t],"www.paginegialle.it")
        if(is.na(as.integer(d[1,1]))){
          inizio<-as.integer(str_locate(sitiwebdent[t],"href=\"")[1,2])
          fine<-as.integer(str_locate(sitiwebdent[t],"\" target=\"_blank\"")[1,1])
          sitodent<-c(sitodent,substr(sitiwebdent[t],inizio+1,fine-1))
        }
      }
      if(length(sitodent)>0){
        for(t in 1:length(sitodent)){
          try(page<-read_html(sitodent[t]))
          try(txt<-as.character(html_nodes(page,xpath = '//a')))
          for(h in 1:length(txt)){
            d<-str_locate(txt[h],"mailto:")
            if(is.na(as.integer(d[1,1]))==F){
              inizio<-as.integer(str_locate(txt[h],"mailto:")[1,2])
              mail[t]<-substr(txt[h],inizio+1,nchar(txt[h]))
              fine<-as.integer(str_locate((mail[t]),"\"")[1,1])
              mail[t]<-substr(mail[t],0,fine-1)
            }
          }
        }
        database_scar<-rbind(database_scar,cbind(sitodent,mail,lavori,zone,regione))
      }
    }else{
      errore=errore+1
    }
    print(errore)
    if(errore>10){break}
  })}
}

Dopo opportune operazioni di eliminazione di eventuali errori previsti o comuni salviamo il file in formato csv

# 'riordino'
dim(database_scar)
db<-data.frame(database_scar)
d<-which(is.na(db$Email))
if(length(d)>0){db<-db[-d,]}
d<-which(is.na(db$Sito.web))
if(length(d)>0){db<-db[-d,]}
d<-which(db$Email=="le mail")
if(length(d)>0){db<-db[-d,]}
d<-which(db$Sito.web=="")
if(length(d)>0){db<-db[-d,]}
d<-which(db$Email=="")
if(length(d)>0){db<-db[-d,]}
err<-numeric()
for(i in 1:length(db$Email)){
  db$Email[i]<-gsub("%20","",db$Email[i])
  db$Email[i]<-gsub("/","",db$Email[i])
  db$Email[i]<-gsub(",","",db$Email[i])
  db$Sito.web[i]<-gsub(",","",db$Sito.web[i])
  if(is.na(str_locate(db$Email[i],"%")[1,1])==F){
    err<-c(err,i)
  }
  if(is.na(str_locate(db$Email[i],"@")[1,1])){
    err<-c(err,i)
  }
}
if(length(err)>0){db<-db[-err,]}
liv<-levels(as.factor(db$Email))
a<-numeric()
for(i in 1:length(liv)){
  a<-c(a,which(db$Email==liv[i])[1])
}
d<-which(is.na(a))
if(length(d)>0){a<-a[-d]}
finale<-db[a,]

# 'salvo csv'
write.csv(finale,paste0(path,"/mail_scaricate.csv"))