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__

 

Compartir