12

News Web Scraping - Código Python

Esta es una breve explicación del codigo que se desarrollo a lo largo del curso, explicando el por qué y para qué de cada uno de las variables, métodos, objetos y librerias utilizadas.

  1. Xpath - La Republica

    Links = //div[@class="container"]//div[not(@class="V_Trends")]/h2/a/@href
    Título = //div[@class="mb-auto"]/h2/a/text()
    Resumen = //div[@class="lead"]/p/text()
    Cuerpo = //div[@class="html-content"]/p[not(@class)]/text(
  2. Librerias utilizadas

    import requests
    import lxml.html as html
    import os
    import datetime
    
    • lxml → Convertir un archivo de texto HTML en un archivo de texto en el cual puedo aplicar xpath
    • os → Crear una carpeta con la fecha actual
    • datetime → Traer la fecha actual
  3. Crear las constantes a partir de las expresiones xpath

    HOME_URL = 'https://www.larepublica.co/'
    XPATH_LINK_TO_ARTICLE = '//text-fill[not(@class)]/a/@href'
    XPATH_TITLE = '//div[@class="mb-auto"]/text-fill/a/text()'
    XPATH_SUMMARY = '//div[@class="lead"]/p/text()'
    XPATH_BODY = '//div[@class="html-content"]/p[not(@class)]/text()'
    • h2 = text-fill → Reemplaamos el h2 para que el xpath pueda ser interpretado por python
  4. Enviar la solicitud HTTP a la web desde python para extraer los links de las noticias.

    defparse_home():try:
            response = requests.get(HOME_URL)
            if response.status_code == 200:
                home = response.content.decode('utf-8')
                parsed = html.fromstring(home)
                links_to_notices = parsed.xpath(XPATH_LINK_TO_ARTICLE)
                # print(links_to_notices)
    
                today = datetime.date.today().strftime('%d-%m-%Y')
                ifnot os.path.isdir(today):
                    os.mkdir(today)
    
                for link in links_to_notices:
                    parse_notice(link, today)
            else:
                raise ValueError(f'Error: {response.status_code}')
        except ValueError as ve:
            print(ve)
    
    • Try & Except → Recomendado cuando hacemos solicitudes externas, por si la página envía como respuesta un status code de error nuestro código no se rompa
    • response → Obtener el archivo html de la página
    • If / else → Válida el status code de la solicitud a la web, si es 200, pudimos obtener el archivo html de la página y podemos continuar. Sí envia un status code diferente, lo tomá como error, muestra en pantalla el status code y el programa finaliza
    • home → Método para transformar todos los caracteres especiales (ñ, tíldes, acentos) para que python pueda guardar correctamente el texto
    • parsed → Toma el contenido de la variable home (archivo html de la web) y lo transforma en un documento en el cual puedo aplicar xpath
    • links_to_notices → Contiene el resultudo de aplicar xpath, obtiene una lista de links
    • today →
      • datetime.date.today() → Módulo datetime maneja fechas, función date nos traer una fecha y today nos da la fecha de hoy. Guardamos dentro de la variable today un objeto de tipo fecha
      • strftime(’%d-%m-%Y’) → Convierte el objeto tipo de fecha en una cadena de caracteres con el formato descrito en los parentesis
    • if not os.path.isdir(today) → Nos devuelve un valor de true o false, busca en la carpeta en la que estamos (donde esta el archivo .py guardado)si existe una carpeta con el nombre de la variable que asignamos (today)
    • os.mkdir(today) → Crea una carpeta con el nombre de la variable que asignamos (today), esto creará una carpeta con la fecha actual
  5. Extracción de la información en cada una de las noticias

    defparse_notice(link, today):try:
            response = requests.get(link)
            if response.status_code == 200:
                notice = response.content.decode('utf-8')
                parsed = html.fromstring(notice)
    
                try:
                    title = parsed.xpath(XPATH_TITLE)[0]
                    title = title.replace('\"', '')
                    summary = parsed.xpath(XPATH_SUMMARY)[0]
                    body = parsed.xpath(XPATH_BODY)
                except IndexError:
                    returnwith open(f'{today}/{title}.txt', 'w', encoding='utf-8') as f:
                    f.write(title)
                    f.write('\n\n')
                    f.write(summary)
                    f.write('\n\n')
                    for p in body:
                        f.write(p)
                        f.write('\n')
                    f.write('\n\n\n')
                    f.write(f'Link de la noticia: {link}')
            else:
                raise ValueError(f'Error: {response.status_code}')
        except ValueError as ve:
            print(ve)
    
    • El primer Try & Except es el mismo de la funcion parse_home(), el segundo es para la extracción de la información de título, resumen y cuerpo
    • If / else → Válida el status code de la solicitud a la web, si es 200, pudimos obtener el archivo html de la página y podemos continuar. Sí envia un status code diferente, lo tomá como error, muestra en pantalla el status code y el programa finaliza
    • title → Contiene el resultudo de aplicar xpath y se obtiene una lista valores, agregamos [0] ya que solo queremos el valor(texto) del título.
      Después reemplazamos ‘’ con un campo vacio ‘’
    • summary → Misma lógica que la variable title
    • body → Misma lógica que laa variables title y summary, solo que aqui no especificamos una posición para retornar el valor, ya que pueden haber más de un párrafo
    • with open → With, manejador contextual que mantiene los archivos de manera segura, open permite abrir archivos
      • ‘{today}/{title}.txt’ → El primer argumento que se le da a open es el nombre del archivo con el cual voy a trabajar, en este caso, el archivo se escribirá en la carpeta con la fecha actual (today), recibira el nombre del título de la noticia (title) y será un archivo de texto plano .txt
      • ‘w’ → Write indica que escribiremos dentro de un archivo, si no está creado, este argumento lo creará
    • f.write(title) / f.write(summary) → la función write escribe las variables que se le indiquen, en este caso el título y el resumen
    • for p in body: f.write§ → Debido a que puede haber más de un párrafo, creamos un for que recorra la lista de párrafos y vaya escribiendo uno por uno
    • f.write(f’Link de la noticia: {link}’) → Escribe el link de la noticia
    • f.write(’\n’) → Saltos de linea, cada \n que se le agregue es un salto más.
Escribe tu comentario
+ 2
Ordenar por:
8
10826Puntos

Por que h2 = Text-fill, es decir, por que se tiene que hacer ese cambio específico en esa etiqueta y no en otras.

¿Que es lo que pasa con esa etiqueta que impide que la podamos dejar así?

1
3295Puntos

En esta parte:

home → Método para transformar todos los caracteres especiales (ñ, tíldes, acentos) para que python pueda guardar correctamente el texto

No es home, es .decode(“utf-8”)

0
41113Puntos

Excelente Resumen… me ayudo mucho