Kako preuzeti e-mailove sa web stranice pomoću R-a?

Kako preuzeti e-mailove sa web stranice pomoću R-a?

Mali poduzetnici do novih potencijalnih klijenta dolaze na četiri glavna načina: poštom, e-mailom, hladnim pozivom ili preporukom. Iako postoji cijela teorija marketinga o tome kako doći do novih klijenata, prvi kontakt se u većini slučajeva temelji na ove 4 jednostavne tehnike (barem kada je riječ o B2B prodaji). U ovom postu ću pokazati kako se pomoću programskog jezika R može relativno jednostavno prikupiti javno dostupne e-mail adrese sa određene stranice. Studij slučaja koji ću prikazati isprogramirao sam s ciljem preuzimanja e-mail adresa banaka u BiH. Jednostavnim google pretraživanjem naišao sam na sljedeću stranicu. Na toj web adresi nalaze se e-mail adrese svih banaka u Federaciji i Republici Srpskoj. Specifičnost ovoga pothvata je u tome što e-mail adrese nisu dio texta (nisu unutar <p> taga), nego su slika (tekst se nalazi unutar slike). U nastavku je opis kako programski preuzeti ove adrese koristeći R.

Glavni alat za ovakav projekt je poznati paket za web scraping u R-u, rvest. Prvo je potrebno učitati web stranicu kao html file:

library(tidyverse)
## -- Attaching packages ----------------------------------------------------------------------------------------------------------------------- tidyverse 1.2.1 --
## <U+221A> ggplot2 3.2.0     <U+221A> purrr   0.3.2
## <U+221A> tibble  2.1.3     <U+221A> dplyr   0.8.3
## <U+221A> tidyr   0.8.3     <U+221A> stringr 1.4.0
## <U+221A> readr   1.3.1     <U+221A> forcats 0.4.0
## -- Conflicts -------------------------------------------------------------------------------------------------------------------------- tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()
library(rvest)
## Loading required package: xml2
## 
## Attaching package: 'rvest'
## The following object is masked from 'package:purrr':
## 
##     pluck
## The following object is masked from 'package:readr':
## 
##     guess_encoding
library(tesseract)


# get pictures links
p <- read_html("https://www.cbbh.ba/Content/Read/7", encoding = "UTF-8")
p
## {xml_document}
## <html>
## [1] <head>\n<meta http-equiv="Content-Type" content="text/html; charset= ...
## [2] <body class=" ">    \r\n    <div class="overlay"></div>\r\n    <!--  ...

Output pokazuje status 200, što znači da je zahtjev prošao i da smo uspješno preuzeli web stranicu kao html dokument. Sljedeći korak je pronalaženje svih e-mail adresa na stranici. Za to ćemo koristiti dvije funkcije: html_nodes i html_attr. Prva funkcija izvlači dijelove HTML dokumenta prema zadanom XPath-u ili CSS selectoru, koji su posebno korisni u kombinaciji sa selectorgadget alatom koji omogućuje lako pronalaženje željenog dijela HTML dokumenta, odnosno poveznicu podatka koji se preuzima. Budući da su e-mailovi spremljeni kao slike, potražit ćemo sve dijelove HTML dokumenta koji imaju <img> tag, a zatim izvući poveznicu na kojoj se nalazi slika izvlačenjem src atributa. Postupak za to je sljedeći:

email <- p %>% 
  html_nodes("img") %>% 
  html_attr("src") %>% 
  .[stringr::str_detect(., "img_mails")]
email
##  [1] "/data/images/img_mails/addico_bank.jpg"            
##  [2] "/data/images/img_mails/asa-banka-signature.png"    
##  [3] "/data/images/img_mails/bbi.png"                    
##  [4] "/data/images/img_mails/intesasanpaolobanka.png"    
##  [5] "/data/images/img_mails/kibbanka.png"               
##  [6] "/data/images/img_mails/nlb.png"                    
##  [7] "/data/images/img_mails/pbs-mail-2017.png"          
##  [8] "/data/images/img_mails/procreditbank.png"          
##  [9] "/data/images/img_mails/rbb-sarajevo.raiffeisen.png"
## [10] "/data/images/img_mails/rbfbih.png"                 
## [11] "/data/images/img_mails/sberbank.png"               
## [12] "/data/images/img_mails/sparkasse.png"              
## [13] "/data/images/img_mails/unicreditgroup.png"         
## [14] "/data/images/img_mails/unionbank.png"              
## [15] "/data/images/img_mails/vakuba.png"                 
## [16] "/data/images/img_mails/ziraatbosnia.png"           
## [17] "/data/images/img_mails/addico_rs.png"              
## [18] "/data/images/img_mails/kombank-bl.png"             
## [19] "/data/images/img_mails/mfbanka.png"                
## [20] "/data/images/img_mails/novabanka.png"              
## [21] "/data/images/img_mails/pavlovic-banka.png"         
## [22] "/data/images/img_mails/sberbankbl.png"             
## [23] "/data/images/img_mails/unicreditgroup-bl.png"

Zadnja linija koda filtira samo one slike koje sadrže e-mail, to jest elemente vektora koji sadrže pojam “img_mails”. Output čine poveznice na slike koje sadrže e-mail adrese. Kada bi e-mailovi bili u tekstualnom fomatu, a ne slikovnom, posao bi bio ovdje završio. U samo tri linije koda bi preuzeli sve e-mail adrese sa stranice. Međutim, ovdje to nije slučaj. Sljedeći zadatak je preuzimanje svih slika pomoću poveznica i njihovo spremanje na lokalnom računalu. Ovo je relatinvo jednostavan zadatak i može se izvesti pomoću funkcije download.file. Koristeći poveznice kao prvi argument, lokaciju za lokalno pohranjivanje kao drugi i model za spremanje kao treći argument, u samo jednoj liniji koda preuzimamo sve dokumente:

# doewnload pictures
for (i in 1:length(email)) {
  download.file(paste0("https://www.cbbh.ba", email[i]), paste0("C:/Users/Mislav/Documents/email_", i, ".png"), mode = "wb")
}

Glavna funbkcija je uklopljena u for loop koji za svaki e-mail primjenjuje download.file funkciju. Nakon što o smo preuzeli sve slike potrebno je napraviti samo još jedan korak, prepoznati tekst na slikama. Ovo je moguće pomoću poznatog open source paketa za čitanje teksta sa slika - tesseract:

# ocr pictures
engine <- tesseract(language = "eng",
                    options = list(tessedit_char_whitelist = "0123456789abcdefghijklmnopqrstuvwxyz"))

emailPath <- list.files("C:/Users/Mislav/Documents", pattern = "email", full.names = TRUE)
emailOCR <- vector("character", length(emailPath))
for (i in 1:length(emailPath)) {
  emailOCR[i] <- ocr(emailPath[i], engine = engine)
}
emailOCR <- trimws(emailOCR)
emailOCR
##  [1] "into.toin@addiko.com"                
##  [2] "info@rbfbih.ba"                      
##  [3] "info@sberbank.ba"                    
##  [4] "info@sparkasse.ba"                   
##  [5] "info@unicreditgroup.ba"              
##  [6] "info@unionbank.ba"                   
##  [7] "vakufska@vakuba.ba"                  
##  [8] "info@ziraatbosnia.com"               
##  [9] "info.rs.ba@addiko.com"               
## [10] "office@kombank-bl.com"               
## [11] "office@mfbanka.com"                  
## [12] "info@asabanka.ba"                    
## [13] "office@novabanka.com"                
## [14] "office@paviovic-banka.com"           
## [15] "info@sberbankbl.ba"                  
## [16] "info-bl@unicreditgroup.ba"           
## [17] "info@bbi.ba"                         
## [18] "info@intesasanpaolobanka.ba"         
## [19] "kibbanka@bih.net.ba"                 
## [20] "info@nlb.ba"                         
## [21] "info@pbs.ba"                         
## [22] "info@procreditbank.ba"               
## [23] "info.rbbh@rbb-sarajevo.raiffeisen.at"

To je sve! Pomoću nekoliko redova koda preuzeli smo e-mail adrese sa web stranice, koje su prvotno bile prikazane kao slike. Ako se e-mailovi nalaze u <p> tagovima, proces je znatno jednostavniji od prikaznog pa e-mail adrese možete preuzeti uz par linija koda.



Comments powered by Talkyard.

Preplatite se

Preplatite se putem newslettera ili RSS feeda