Curso Web Scraping para SEO – Clase 10

Guardar resultados en fichero

 

En esta clase veremos cómo podemos escribir los resultados en un fichero en vez de la consola.

 

Para escribir los resultados en un fichero podemos proceder de varias maneras:

. abrir un fichero y cambiar los print por write

. redirigir la salida estandard a un fichero al ejecutar el script

. redirigir la salida standard al fichero abierto desde python

 

Seguiremos el tercer procedimiento

 

# -*- coding: utf-8 -*-

# Proyecto Web Scraping para SEO con Python
# Clase 10: Guardar resultados en fichero
# webscrap10
import urllib
import re
import sys

url_sitio = «https://evginformatica.blogspot.com/»
url_inicio=url_sitio
lista_enlaces = []
titulos = []
descripciones = []

def buscar_enlaces(posicion,busqueda):
   
    url = lista_enlaces[posicion]
   
    htmluni = urllib.urlopen(url).read()
    html=urllib.unquote(htmluni).decode(«utf-8»)

    #buscar <title>
    if titulos[posicion]==«»:
        titulo = re.findall(«<title>.+</title>», html)
        if titulo<>[]:
            titulo_esp=titulo[0]
            titulos[posicion]=titulo_esp[7:-8]
   
    #buscar descripcion
    #<meta content=’…’ name=’description’/>
    if descripciones[posicion]==«»:
        desc = re.findall(«<meta content=.+name=’description’/>», html)
        if desc<>[]:
            desc_esp=desc[0]
            descripciones[posicion]=desc_esp[15:-22]
 
    #buscar enlaces href
    enlaces = re.findall(busqueda, html)
    for enlace in enlaces:
   
        #quitar href=’ y quitar comilla final
        enlace2 = enlace[6:-1]
   
        #enlaces excluidos
        #/search
        # o que contienen #
        # solo paginas .html
        anadir=True
        if enlace2.find(«.html»)<0:
            anadir=False
       
        if enlace2.find(«/search»)>0:
            anadir=False
       
        if enlace2.find(«#»)>0:
            anadir=False
       
        if enlace2 in lista_enlaces:
            anadir=False
           
        if anadir:
            lista_enlaces.append(enlace2)
            titulos.append(«»)
            descripciones.append(«»)



def web_scrapin():
   
    print «— Web Scraping —«

    #esto es para indicar que la codificación del fichero es utf-8     #no ascii
    reload(sys)
    sys.setdefaultencoding(‘utf-8’)
   
    #redirigir salida estandard a fichero
    fichero=open(‘c:\webscrap.txt’, ‘w’)
    sys.stdout=fichero



    print «— Información del sitio «+url_sitio
    print «— Enlaces internos —«
   
    lista_enlaces.append(url_inicio)
    titulos.append(«»)
    descripciones.append(«»)
    posicion = 0
   
    while True:
        #print «— «+lista_enlaces[posicion]
       
        busqueda = «href='»+url_sitio+«.+?'»
        buscar_enlaces(posicion,busqueda)
        busqueda = ‘href=»‘+url_sitio+‘.+?»‘
        buscar_enlaces(posicion,busqueda)
       
           
        posicion = posicion+1
        #pruebas
        #if posicion >= 2:
        #    break
       
        if posicion >= len(lista_enlaces):
            break
           
    i=1
    for lenlace in lista_enlaces:
        print str(i)+» «+lenlace       
        print »     Titulo: «+titulos[i-1]
        print »     Descripcion: «+descripciones[i-1]
        i=i+1

    #volver a poner la salida estandard como estaba
    sys.stdout=sys.__stdout__
    print «— Fin Web Scraping —«



if __name__ == «__main__»:  
    web_scrapin()

 

Para que no haya problemas con los acentos debemos indicar que la salida standard como el fichero a abrir tienen la codificación UTF-8

Para indicar que la salida estandard es UTF-8 hay que poner al principio

# -*- coding: utf-8 -*-

 

En la función web_scrapin cambiamos la codificación de los ficheros de texto de ascii a utf-8 con las líneas

     reload(sys)
    sys.setdefaultencoding(‘utf-8’)

 

después abrimos el fichero y redireccionamos la salida estandard a ese fichero con

    fichero=open(‘c:\webscrap.txt’, ‘w’)
    sys.stdout=fichero

 

cuando ya hemos escrito toda la información volvemos a poner la salida estandard como estaba con

   sys.stdout=sys.__stdout__

 

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *