No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Convierte tus certificados en títulos universitarios en USA

Antes: $249

Currency
$209

Paga en 4 cuotas sin intereses

Paga en 4 cuotas sin intereses
Suscríbete

Termina en:

17 Días
23 Hrs
12 Min
40 Seg

Manejo de errores

7/30
Recursos

Aportes 27

Preguntas 6

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

En el curso de CRUD con Python, David recomienda nunca dejar un except con pass, siempre se debe informar el error.

del zen de python

“Errors should never pass silently.
Unless explicitly silenced.”

Siempre es importante defnir en un except el tipo de errores que esperamos recibir, podemos dejar el except sencillo pero no tendriamos el feedback de lo que ocurrio

Para profundizar sobre try - except https://docs.python.org/3/tutorial/errors.html

Gracias a tus clases logré procesar hasta el momento más de 3000 datos, gracias!

Esto es tremendamente importante, gracias 😄

como se deja corriendo un scraper en automatico ? ejemplo que todos los dia sa las 5am se ejecute la function para hacer scraper de una pagina y se atualize el database ??

def obtener_notas(soup):
    lista_notas = []
    
    #Articulo promocionado
    featured_article = soup.find('section',attrs={'class':'top-content'})
    if featured_article:
        lista_notas.append(featured_article.a.get('href'))
        
    #Listado de articulos TOP
    article_list_top = soup.find('section', attrs = {'class':'list-content'}).find_all('h3')
    for article in article_list_top:
        if article.a:
            lista_notas.append(article.a.get('href'))
    
    #Listado de articulos SUB
    article_list_sub = s_section.find('section', attrs = {'class':'list-content'}).find_all('h4')
    for article in article_list_sub:
        if article.a:
            lista_notas.append(article.a.get('href'))
    
    return lista_notas

Si hubiera usado manejo de errores en el reto de la clase pasada, me hubiera ahorrado como 2 horas para resolverlo. :"v

<code>
import requests
from requests.exceptions import HTTPError

for url in ['https://api.github.com', 'https://api.github.com/invalid']:
    try:
        response = requests.get(url)

        # If the response was successful, no Exception will be raised
        response.raise_for_status()
    except HTTPError as http_err:
        print(f'HTTP error occurred: {http_err}')  # Python 3.6
    except Exception as err:
        print(f'Other error occurred: {err}')  # Python 3.6
    else:
        print('Success!')

Anotaciones y Ejercicios Curso de Web Scraping - Modulo II
Les dejo esta y todas las anotaciones del curso actualizados al 2023, tome nota de los comentarios y ejercicios resueltos de cada sección. Lleve en cuenta las explicaciones del docente y más! Espero les sirva. 👌
(si quieres apoyar deja una estrella a la repo ✌⭐)

Tambien se puede utilizar el try/except directamente en la ejecucion asi ahorramos lineas de codigo.

# Scrapper. Regresa cada uno de los URL de cada una de las categorías
# y los organiza por medio de un diccionario

def scrapper(page_list):
    # Paso 0. Creamos un dict para agrupar las URL que vamos a obtener
    dict_url = dict()

    # Paso 1. Extraer una sopa de cada una de las páginas de lista de entrada
    for each_web in page_list:
        page = requests.get(each_web)
        soup = BeautifulSoup(page.text)

        # Paso 2. Creamos una key en el diccionario
        dict_url[each_web] = list()
        
        #print(dict_url)
        
        # Paso 2.1. Extraer los artículos generales y guardarlos
        articulos = soup.find_all('div',attrs = {'class':'article-box__container'})
        dict_url[each_web] = [article.a.get('href') for article in articulos]
        
        # Paso 2.2. Extraer el artículo resaltado (features) y guardarlo (al final de la lista)
        try:
            promocionado = soup.find('div',attrs = {'class':'featured-article__container'})
            dict_url[each_web].append(promocionado.a.get('href'))
        except:
            dict_url[each_web].append('None')

    return dict_url

# PROGRAMA PRINCIPAL
if __name__ == '__main__':
    # variable de entrada
    dict_secciones = {'El país': 'https://www.pagina12.com.ar/secciones/el-pais',
                     'Economía': 'https://www.pagina12.com.ar/secciones/economia',
                     'Sociedad': 'https://www.pagina12.com.ar/secciones/sociedad',
                     'Cultura y Espectáculos': 'https://www.pagina12.com.ar/suplementos/cultura-y-espectaculos',
                     'El mundo': 'https://www.pagina12.com.ar/secciones/el-mundo',
                     'Deportes': 'https://www.pagina12.com.ar/secciones/deportes',
                     'Contratapa': 'https://www.pagina12.com.ar/secciones/contratapa',
                     'Recordatorios': 'https://www.pagina12.com.ar/secciones/recordatorios'}
    
    page_list = list(dict_secciones.values())
    
    resultado = scrapper(page_list)
    print(resultado)

Exc clase, realmente es una clase importante.

Esto es un try & catch
como se le conoce en Java

Try - except

En el manejo de errores, ¿Solo se debe poner una instrucción?

Añado una pequeña corrección, en la nueva estructura de la página ya no viene incluida la raíz, por lo cual hay que concatenarla antes de añadirla a nuestra lista, así tener url funcionales.

def obtener_notas(soup):
    '''Función que recibe un objeto de BeatiFulSoup de una página de una sección
    y devuelve una lista de URLs a las notas de esa sección
    '''
    lista_notas = []

    #Obtengo el articulo promocionado
    featured_article= soup.find('div', attrs={'class': 'article-item__header deco-bar-here'})
    if featured_article:
        url_art= url+featured_article.a.get('href')
        lista_notas.append(url_art)
        

    #obtengo el listado de artículos
    article_list= soup.find_all('div',attrs={'class': 'articles-list'})
    article_list
    for articles in article_list:
        #print(articles.prettify())
        #print('aqui')
        for article in articles.find_all('div', attrs={'class': 'article-item__header'}):
            #print(article)
            #print('paso algo')
            if article.a:
                url_art= url+article.a.get('href')
                lista_notas.append(url_art)

    return lista_notas

📌 “Puede pasar que dejemos corriendo en la noche un scraper, nos vayamos a dormir y a la mañana siguiente cuando esperamos encontrarnos con un montón de contenido ya descargado nos encontramos que a los 10min de que lo pusimos a correr ocurrió ocurrió un error y se interrumpió la ejecución”

¡excelente tus clases!

excelente

Hola, cuando escribo:
lista_notas = obtener_notas(s_seccion)
lista_notas

No me aparecen los link, solo me aparecen dos cochetes [ ]
[ ]

Alguien sabe por que?

try:
	requests.url(url_mala)
except Exception as e:
	print('Error en la requests)
	print(e)
	print('\n')```
```js def links_articles(sopa): link_secciones_articles_list = [article_list.a.get('href') for article_list in sopa] link_articulos_completos = [url_para_concatenar + link for link in link_secciones_articles_list] return link_articulos_completos ```def links\_articles(sopa): link\_secciones\_articles\_list = \[article\_list.a.get('href') for article\_list in sopa] link\_articulos\_completos = \[url\_para\_concatenar + link for link in link\_secciones\_articles\_list] return link\_articulos\_completos

Actualmente la estructura de la primera seccion es diferente, les comparto mi solucion

def obtener_notas(soup):
    '''
    Función que recibe un objeto de BeautifulSoup de una página de una sección
    y devuelve una lista de URLs a las notas de esa sección
    '''
    
    #Buscamos la seccion que contiene todos los articulos, compuestos a su vez por dos etiquetas section y article
    seccion_articles = soup.find('div',attrs={'class':'main-content'})
    
    #En todo lo que traemos obtendremos solo los divs del titulo para cada articulo a pesar de su estructura
    articles = seccion_articles.find_all('div',attrs={'class':'article-item__content'})
    
    #Retornamos los links, en este caso relativos a la url actual
    articles_a = [article.find('a').get('href') for article in articles]
    
    
    return articles_a 
    
obtener_notas(soup_seccion)

Estas es mi solucion

def ObtenerLinkNotas(soup):
    notas_array = list()
    notas = soup.find_all('div',{'class':'articles-list'})
    #len(notas)
    notas_link = notas[1].find_all('div',{'class':'article-item__content'})
    for i_notas_link in notas_link:
        if i_notas_link.find('a'):
            notas_array.append(i_notas_link.find('a').get('href'))
    return notas_array

Si alguna persona está sufriendo como yo, por los cambios en la página web, dejo por aquí mi solución, la solución del profesor con las modificaciones respectivas.

def obtener_notas(soup):
    '''Función que recibe un objeto de BeatiFulSoup de una página de una sección
    y devuelve una lista de URLs a las notas de esa sección
    '''
    lista_notas = []

    #Obtengo el articulo promocionado
    featured_article= soup.find('div', attrs={'class': 'article-item__header deco-bar-here'})
    if featured_article:
        lista_notas.append(featured_article.a.get('href'))

    #obtengo el listado de artículos
    article_list= soup.find_all('div',attrs={'class': 'articles-list'})
    article_list
    for articles in article_list:
        #print(articles.prettify())
        #print('aqui')
        for article in articles.find_all('div', attrs={'class': 'article-item__header'}):
            #print(article)
            #print('paso algo')
            if article.a:
                url_art= url+article.a.get('href')
                lista_notas.append(url_art)

    return lista_notas

Excelente