En el curso de CRUD con Python, David recomienda nunca dejar un except con pass, siempre se debe informar el error.
Scrapy, Tesseracts y Proxies
Introducción, definiciones y ética
Introducción y definiciones
Ética y Legalidad
Configuración del entorno de trabajo con Jupyter
HTML: Requests y BeautifulSoup
Descargando una página web
Parseando HTML con BeautifulSoup
Extrayendo información
Manejo de errores
Descargando contenido
Contenido multimedia
Unificando el scraper
Scraping JavaScript con Selenium
Instalación y configuración de Selenium
Sitios dinámicos y Selenium
Selección de elementos
Interactuando con los elementos
Scrapeando escalas y tarifas
Construyendo Funciones
Construyendo la función para unificar el scraper
Demoras dinámicas
Comentarios finales
APIs
Introducción a APIs
Utilizando APIs: Construir una URL
Utilizando APIs: Tokens y Búsqueda
Obteniendo la discografía
Obteniendo los albums
Fin del proyecto + bonus
Scrapy, Tesseract y Proxies
Scrapy
Ejecutando el scraper con scrapy
Proxies
Tesseract
Conclusión y cierre del curso
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
Paga en 4 cuotas sin intereses
Termina en:
Martín Sokolowicz
Aportes 27
Preguntas 6
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
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')```
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
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?