#!/usr/bin/env python
# coding: utf-8

# # Rastreator automatizado

# In[2]:


driver.close()


# In[3]:


from selenium import webdriver
import time
import pandas as pd
import random
import tqdm as tqdm
import warnings

warnings.simplefilter("ignore")

options = webdriver.ChromeOptions()
options.add_argument('--remote-debugging-port=9515')
#driver = webdriver.Chrome('./chromedriver.exe', options=options)
driver = webdriver.Chrome('/usr/bin/chromedriver', options=options)
url_ra = 'https://www.rastreator.com/tarifas-internet-fijo-movil.aspx'
driver.implicitly_wait(3)
driver.get(url_ra)


# In[4]:


# Hacemos click en Aceptar cookies
driver.find_element_by_xpath('//*[@id="cookies"]/div/div[2]/button[2]').click()


# In[5]:


# Introducimos el CP
driver.find_element_by_css_selector('#cp > input').send_keys("48014")

# Seleccionamos Autónomos
driver.find_element_by_css_selector('#submit-form > div > div.form-wrap.clearfix > div.form-control.normal-radio.col-xs-12.col-md-6 > label:nth-child(2) > span').click()

# Pulsamos en Ver todas las ofertas
driver.find_element_by_xpath('//*[@id="submit-form"]/div/div[2]/button').click()


# In[6]:


# Esperamos a que carguen los resultados...
time.sleep(15)

#Hacemos scroll hasta el final para cargar todas las tarifas
last_height = driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
while True:
    # Scroll down to bottom
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    time.sleep(0.5)

    # Calculate new scroll height and compare with last scroll height
    new_height = driver.execute_script("return document.body.scrollHeight")
    if new_height == last_height:
        break
    last_height = new_height


# In[7]:


# Extraemos la información de todas las ofertas.  Esto nos permite saber el total de iteraciones a realizar para obtener las ofertas de rastreator
time.sleep(3)
ofertas = driver.find_element_by_css_selector('.tel-result')
total_ofertas = len(ofertas.find_elements_by_class_name('coverage-label'))
total_ofertas


# In[12]:


# Extracción de la sección COBERTURA
ofertas.find_elements_by_class_name('coverage-label')  # tantos elementos como ofertas hay en la página, obtenemos una lista de 48 elementos

ofertas.find_elements_by_class_name('coverage-label')[0].text

# Dato limpio (para la primera oferta)
ofertas.find_elements_by_class_name('coverage-label')[0].text.replace('COBERTURA: ','')


# In[15]:


# Extracción de la url de la imagen.
# Habitualmente las imágenes aparecen con la etiqueta img.  
# En éste caso, la imagen, tiene un atributo que es src que es donde está la url de descarga
ofertas.find_elements_by_tag_name('img') 

# Dato limpio (para la primera oferta)
ofertas.find_elements_by_tag_name('img')[0].get_attribute('src')


# In[29]:


# Extracción de los datos de compañía, descripción y condiciones.
# En este caso, vamos a extraer la compañía a través del nombre de la imagen.  
# Tendremos que tener en cuenta los diferentes tipos de nombres de imagen que podrán aparecer
# para definir el código de extracción. He entontrado que las imágenes que utiliza rastreator
# tienen la extensión png, jpg, logo, Logo, _ y 68x48, pero podría haber otras.

aux2 = ofertas.find_elements_by_tag_name('img')[0].get_attribute('src').split('/')
print(aux2)

# Dato limpio (para la primera oferta)
# Hemos localizado el nombre de la compañía en el último elemento de la lista.  Lo limpiamos
print(aux2[len(aux2)-1].replace('.png','').replace('.jpg','').replace('logo','').replace('Logo','').replace('_','').replace('68x48',''))


#Extracción de la descripción
#Podemos encontrar la descripción de la oferta en la clase info-block-container.  Nos interesa el texto de la clase
print(ofertas.find_elements_by_class_name('info-block-container')[0].text)

#Extracción de las condiciones de la oferta.
#Podemos encontrar las condiciones de la oferta bajo el selector css p.tel-condition-text
#Como en el caso anterior, extraemos el texto de ese selector
print(ofertas.find_elements_by_css_selector('p.tel-condition-text')[0].text)


# In[31]:


# Extraemos los elementos internet, fijo, móvil
# Estos 3 elementos se encuentran bajo la misma clase tel-feature y dentro de la etiqueta li
# Para cada oferta, tendremos por tanto 3 elementos a extraer
aux = ofertas.find_elements_by_class_name('tel-feature')[0].find_elements_by_tag_name('li')
print(aux)

# Extracción del dato de internet (texto).  Es el primer elemento de la lista
print(aux[0].text.replace('INTERNET','').lstrip())

# Extracción del dato de fijo (texto).  Es el segundo elemento de la lista
print(aux[1].text.replace('FIJO','').lstrip())

# Extracción del dato de móvil (texto).  Es el tercer elemento de la lista
print(aux[2].text.replace('MÓVIL','').lstrip())


# In[32]:


#Extracción del precio final.
#Encontramos el dato del precio final, bajo el selector css div.promo-and-crossprice
#Nos interesa el texto.  Eliminamos los saltos de línea del dato extraído
print(ofertas.find_elements_by_css_selector('div.promo-and-crossprice')[0].text.replace('\n',' '))


# In[216]:


# Ya tenemos todos los elementos, ahora lo automatizamos
cobertura = []
img = []
aux = ""
aux2 = ""
compania = []
descripcion = []
condiciones = []
internet = []
fijo = []
movil = []
precio_final = []
lst_rast = list()
df = pd.DataFrame()

for a in range(total_ofertas):
    print(a)
    cobertura.append(ofertas.find_elements_by_class_name('coverage-label')[a].text.replace('COBERTURA: ',''))
    img.append(ofertas.find_elements_by_tag_name('img')[a].get_attribute('src'))
    aux2 = ofertas.find_elements_by_tag_name('img')[a].get_attribute('src').split('/')
    compania.append(aux2[len(aux2)-1].replace('.png','').replace('.jpg','').replace('logo','').replace('Logo','').replace('_','').replace('68x48',''))
    descripcion.append(ofertas.find_elements_by_class_name('info-block-container')[a].text)
    condiciones.append(ofertas.find_elements_by_css_selector('p.tel-condition-text')[a].text)
    aux = ofertas.find_elements_by_class_name('tel-feature')[a].find_elements_by_tag_name('li')
    internet.append(aux[0].text.replace('INTERNET','').lstrip().replace('\n', ' '))
    fijo.append(aux[1].text.replace('FIJO','').lstrip())
    movil.append(aux[2].text.replace('MÓVIL','').lstrip())
    precio_final.append(ofertas.find_elements_by_css_selector('div.promo-and-crossprice')[a].text.replace('\n',' '))


# In[217]:


# Construimos el dataframe con los datos extraídos.
df = pd.DataFrame(list(zip(cobertura, img, compania, descripcion, condiciones, internet, fijo, movil, precio_final)),
               columns =['cobertura', 'img','compania', 'descripcion', 'condiciones', 'internet', 'fijo', 'movil', 'precio_final'] )


# In[218]:


df


# In[219]:


# Cerramos el navegador
driver.quit()


# In[230]:


# Guardamos el resultado

import datetime as dt
nombre = "ofertas_telefonia " + dt.date.today().strftime("%d-%m-%Y") + ".csv"


df.to_csv(nombre, sep = "|", index=False, encoding="UTF-8")


# Ejercicio:  Dentro de la web de rastreator, scrapea los resultados del comparador de precios de la luz.
# Como datos de filtrado (los introducidos inicialmente), selecciona 2 personas, vivienda de 80m2 y código postal 48001
# 
# Si te animas, automatiza el proceso para que extráiga esos mismos resultados para los 40 primeros códigos postales del fichero listado-de-codigos-postales-de-españa.csv
