Clase Web Scraping para SEO – Clase 11

Conversión a Python versión 3.6

 

En esta clase convertiremos nuestro programa de la versión 2.7 a la versión 3.6

 

# Proyecto Web Scraping para SEO con Python
# Clase 11: Conversión a Python versión 3.6
# webscrap11

import urllib.request, urllib.parse, urllib.error
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]
   
    htmlbytes = urllib.request.urlopen(url).read()
    html2 = htmlbytes.decode(«utf-8»)
    html = urllib.parse.unquote(html2)


    #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’)
    # no es necesario en la version 3.6
    #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()

 

Las diferencias entre la versión 2.7 y la 3.6 para este programa son

    htmlbytes = urllib.request.urlopen(url).read()
    html2 = htmlbytes.decode(«utf-8»)
    html = urllib.parse.unquote(html2)

 

Cambia la función urlopen y devuelve una secuencia de bytes en vez de un string.

Se aplica la función decode para obtener un string en formato UTF-8

Con urllib.parse.unquote se quitan las marcas especiales (%20…)

 

Los ficheros por defecto son en formato UTF-8

En python 3.6 print es una función no una sentencia por lo que tiene que ir con paréntesis.

 

Deja una respuesta

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