No tienes acceso a esta clase

隆Contin煤a aprendiendo! 脷nete y comienza a potenciar tu carrera

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

鈥淓rrors 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

馃搶 鈥淧uede 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