Aún no tienes acceso a esta clase

Crea una cuenta y continúa viendo este curso

Implementando nuestro web scrapper: Obteniendo artículos

18/38
Recursos

Aportes 57

Preguntas 7

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.

Imposible entender el curso. Si no sabes Python veo muy difícil entender lo que aquí se explica. Veré todo el curso y luego haré el curso de Python para dejar de escuchar en Chino Mandarín a David.
Me parece excelente que David no pierda tiempo explicando Python, porque ya hay varios cursos sobre ello esperando a cualquiera que quiera aprender.

Comparto la opinión de muchos compañeros, siento que anterior a este curso debieron estar los de fundamentos de Web Scraping, el que uno sepa programar en Python y tenga conocimientos de POO no significa que sepa hacer Web Scraping con Python automáticamente, mal diseño de la ruta o ¿qué pasó ahí?.

Me gusto mucho esta clase. Vengo de hacer unos 4 cursos con este profesor y me doy cuenta que a veces es cuestión de práctica y de estar familiarizado con las estructuras de datos (listas, diccionarios, etc)

Comparto la configuración de mi yaml. Por si alguien quiere probar con ellos.

news_sites:
  eluniversal:
     url: http://www.eluniversal.com.mx
     queries:
       homepage_article_links: '.field-content a'
       article_body: '.field-name-body'
       article_title: '.pane-content h1'
  larepublica:
     url: https://www.larepublica.co
     queries:
       homepage_article_links: '.tab a'
       article_body: '.field-name-body'
       article_title: '.pane-content h1'
  eltiempo:
     url: https://www.eltiempo.com
     queries:
       homepage_article_links: '.simple a'
       article_body: '.field-name-body'
       article_title: '.pane-content h1'

Observación:
Releer el código siempre ayuda o solidificar los conceptos.

Viendo que en general muchos han tenido descontentos con esta seccion me siento un poco entendido.
Les recomiendo que sigan los pasos tal cual y luego lean lo que escribieron, si saben de python realmente van a entender que lo complicado no es la logica sino un poco la sintaxis.

Si no me equivoco en el momento en el que se grabo este curso el curso de Python era otro diferente al actual y hay muchas cosas que se quedaron sin explicar.

Sin lugar a dudas Aroesti sabe mucho, pero como profesor en este curso se esta quedando muy corto. Acá Platzi cae en el mismo cliche y error de la academia tradicional, donde los profesores saben mucho pero no se preocupan por usar una buena metodología para que el curso sea realmente un factor diferenciador de lo que uno puede encontrar en otras academias. Finalmente uno se hace responsable de su educación y acude a otras fuentes y medios para fortalecer los temas acá mencionados.

Cabe aclarar que mas que una critica es un punto de vista que puede ser tomado como oportunidad de mejora y que actualicen el curso a la version 2020, ya que en lo personal me encanta Platzi y le he sacado mucho jugo.

👨🏻‍💻Pro tip: Si te confude construir los archivos en consola, hazlo en vscode o tu editor de código. verás como se parece más a lo que vas aprendiendo. y ejecutas los scripts en consola para validar que funcione.

Validado por mi mismo, un compañero más que viene de otra área del conocimiento en su camino de Data Science, no te rindas 💙

Fallamos con estos últimos videos, que lastima aun en la lucha comunidad pero difícil, por ahi lei que toca “el Curso de Fundamentos de Web Scraping con Python y Xpath y luego el Curso de Web Scraping: Extracción de Datos en la Web”

Me podrian decir como configurar el VIM como lo tiene el profesor? estuve buscando algunas maneras por internet pero algunas no me funcionaron y otras muy simple, no encontré por lo menos esa que te pone los puntos en la indentación…

Cuando ingreso al sitio https://elpais.com/elpais/portada_america.html hay dos tipos de noticias: 1. Las de titulo grande, éstas se obtienen mediante:
homepage_article_links: '.articulo-titulo a’
2. Las de titulo pequeño, éstas se obtienen mediante:
homepage_article_links: ‘.apoyo-titulo a’

¿Cómo puedo hacer que el programa lea ambas? ,esto es, consiga los articulos con la clase ‘.articulo-titulo a’ y la clase ‘.apoyo-titulo a’

Me volví a ver las clases de este curso porque están muy buenas y un poco complejas. Si hay que ver las varias veces para poder ir viendo más detalles que se escapan.

Así queda mi config.yaml de varios periódicos conocidos de México

news_sites:
  eluniversal:
    url: https://www.eluniversal.com.mx/
    queries:
      homepage_article_links: '.field-content a'
      article_body: '.field-name-body'
      article_title: '.pane-content h1'

  elpais:
    url: https://elpais.com/elpais/portada_america.html
    queries:
      homepage_article_links: '.articulo-titulo a'
      article_body: 'div .articulo-cuerpo'
      article_title: 'div .articulo-titulares h1'

  proceso:
    url: https://www.proceso.com.mx/
    queries:
      homepage_article_links: 'div .vc_custom_heading h4 a'
      article_body: 'div .entry-content-inner'
      article_title: '.postitle h1'

  milenio:
    url: https://www.milenio.com/
    queries:
      homepage_article_links: '.title a'
      article_body: 'div #content-body'
      article_title: '.media-container h1'

Creo que el principal problema del curso es que de entrada se trata de hacer el código lo más abstracto y óptimo posible. Lo cual, en teoría está bien, pero dado que aparte de esa capa de complejidad, le añades que estás aprendiendo temas nuevos. Como que te pierdes, quizás sería mejor hacer primero el código un poquito más boilerplate y de pronto en otra clase refactorizar todo de una manera más óptima.

Buenas tardes, alguien me podría ayudar por favor…Me está apareciendo este error

C:\Users\Julieth\web_scraper_curso_data_eng>python main.py eluniversal
Traceback (most recent call last):
File “main.py”, line 11, in <module>
import news_page_objects as news
File “C:\Users\Julieth\web_scraper_curso_data_eng\news_page_objects.py”, line 4, in <module>
from common import config
File “C:\Users\Julieth\web_scraper_curso_data_eng\common.py”, line 1, in <module>
import yaml
ModuleNotFoundError: No module named ‘yaml’

El video quedo mal editado al final

Muuy Bueno Excelente el Curso!!

Hola, les recomiendo ver esta serie de tutoriales donde se construye desde cero un webscraper, ayuda a entender mejor el proceso:

Python Web Scraping Tutorial

Les recomiendo mucho entrar a cualquier página de su interes y hacer un web scraping, yo lo hice con la NBA y es un cosa de locos porque las páginas cambian mucho, así todos los conceptos se irán aclarando.

Entendi los conceptos, super la clase, aumentó la complejidad, asi que tocó verlo con calma, repetir si es necesario o apoyarse en los comentarios u otros enlaces.

El uso de la función super en la sintaxis mostrada es usando Python 3; cuál sería la forma de usarla teniendo Python2.7?

Una combinación de muchas cosas: POO, decoradores, list comprehensions, Yaml, Html, Clases y subclases (que está en P.O.O.), además el manejo del mismo lenguaje como tal. Me parece una clase muy completa. Creo que es preferible que se muestre algo como esto y no algo básico. Por algo es el último curso de la ruta MinTic,

Ahora bien. Creo conveniente un video adicional con una explicación más abstracta pero que ayude a comprender mejor todo este tema. Venía sufriendo, tratando de seguir y replicar la parte del código sin entender muy bien lo que pasaba en los últimos 3 videos. Para este, decidí anotar puntualmente los cambios realizados mientras veía el video con tranquilidad y el nivel de comprensión aumentó considerablemente.

Para quienes esten atastados, los animo a seguir aprendiendo. Inevitablemente necesitaremos consultar otras fuentes, o ver otros cursos. Si los conceptos no quedan del todo claros, se puede terminar la ruta MinTic, condonar la beca, y aprovechar el tiempo restante de la suscripción para pulir en otros cursos lo qu eno haya quedado claro.

Desde mi punto de vista, muy bien por platzi y que bueno que David nos explique cosas de nivel.

Saludos

from config_yaml import config
import requests
import bs4

classNewsPage:
    def__init__(self, news_site_uid, url):
        self._config = config()['news_sites'][news_site_uid]
        self._queries = self._config['queries']
        self._html = None
        self._visit(url)

    def_select(self, query_string):
        return self._html.select(query_string)

    def_visit(self, url):
        response = requests.get(url)
        response.raise_for_status()
        self._html = bs4.BeautifulSoup(response.text, 'html.parser')

classHomePage(NewsPage):
    def__init__(self, news_site_uid, url):
        super().__init__(news_site_uid,url) #SE HACE EL SUPER PARA HERENCIA DEL HOME_PAGE

    @property
    defarticle_links(self):
        link_list = []
        for link in self._select(self._queries['homepage_article_links']):
            if link and link.has_attr('href'):
                link_list.append(link)

        return set(link['href'] for link in link_list)

classArticlePage(NewsPage):#AGREGAMOS LA CLASE AL SUPER PARA QUE HAYA HERENCIA DE CLASES
    def__init__(self, news_site_uid, url):
        super().__init__(news_site_uid, url) #HERECIA DEL HOME_PAGE

    @property
    defbody(self):
        result = self._select(self._queries['article_body']) 
#se agrega a la estructura 
#//:'news_page´/news_site_uid/queries/article_body

        return result[0].text if len(result) else''
#lee el arreglo de la primera posicion de donde se encuentran los articulos
    @property
    deftitle(self):
        result = self._select(self._queries['article_title']) 
#se agrega a la estructura 
#//:'news_page´/news_site_uid/queries/article_title

        return result[0].text if len(result) else```

Usar Jupiter y escribir por fragmentos nos ayudará a partir el problemas en tareas de código pequeño y que podamos documentar

Puedes hacer lo mismo en cualquier lenguaje y si es orientado a objetos pues escribes menos

Entender Python no es el problema, tener los fundamentos básicos de Ingeniería de Software es la génesis

6 Habilidades que todo Programador Debería Tener:

1- Estructuras de Datos y Algoritmos
2- https://www.youtube.com/watch?v=GT7GY4zh6HE

Para todos aquellos que se les hace un poco difícil el tema de herencia y super clases, les dejo el link a un buen artículo que encontré, el cual refuerza estos fundamentos, que si bien no son netos de Python porque Python no es el lenguaje típico de POO pero si abstrae algunas cosas necesarias y útiles para el desarrollo. Espero les sirva.
https://realpython.com/python-super/

Ansioso por llegar al tema de Pandas! el dia que necesite hacer un web scrapper intentaré aprender este tema. Hoy no veo la utilidad de hacerlo.

Wooow, este curso va genial, esta buenisimo!!

alguien me explica el @property? no entiendo que hace

Se va haciendo mas complejo con cada clase, debo verlas varias veces para dejar claro los conceptos.-

Estos códigos después de terminar el vídeo, me quedo releyendo para terminar de entenderlo, pues tengo bases en el lenguaje. De verdad que este curso tiene su complejidad y se necesita saber mas de lo que se imparte solamente en el curso de Python. Sin embargo, Platzi tiene otros cursos que sirven para este. Así que a darle y no desistir.

minuto 8:25 que paso?, dice modificar archivo main.py y aparece en news_page_objects.py de nuevo…???

Me arroja este error y la verdad no se que pueda ser.

Traceback (most recent call last):
  File "main.py", line 93, in <module>
    _news_scraper(args.news_site)
  File "main.py", line 38, in _news_scraper
    _saved_articles(news_site_uid, articles)
  File "main.py", line 51, in _saved_articles
    writer.writerow(row)
  File "C:\Users\tazvd\Anaconda3\lib\encodings\cp1252.py", line 19, in encode
    return codecs.charmap_encode(input,self.errors,encoding_table)[0]
UnicodeEncodeError: 'charmap' codec can't encode character '\u2192' in position 1565: character maps to <undefined>

alguien que me pueda ayudar.

Las interfaces de linea de comando pueden ser difíciles de asimilar para principiantes

Al día de hoy 26/10/2020 el nuevo valor para la llave article title en el sitio de el universal es:

article_title: '.Encabezado-Articulo h1'








Momento... aquí dice "modificamos el archivo main" y lo escribe en la terminal pero el cuerpo de texto que sale en pantalla es el de news_page_objects.py... so ¿? ¿?

Excelente clase.

en windows 10 me funciona asi

conda run python main.py elpais```

También que aparezca el simbolo de final de linea estaria bueno tenerlo

Hola a todos, en el siguiente enlace esta muy bien explicado la utilización de la función super, espero les sirva como a mi:
https://pythones.net/funcion-super-en-python-bien-explicada-ejemplos-oop/

muy interesante hast el momento!!

Excelente, pero si es necesario ver los últimos dos capítulos un par de veces.

Yo estoy sacando info de la página del proyecto gutemberg
mi config.yaml

books_sites:
  gutenberg:
    url: https://www.gutenberg.org/cache/latest-covers
    queries:
      homepage_book_links: "a.cover-thumb-small"
      book_title: "td[itemprop|=headline]"
      book_author: "a[itemprop|=creator]"

interesante lo de las abstracciones, en esta clase se aprende mucho

lo que veo es que aparte de seguir a tutor… se debe practicar individualmente mucho mas… pero es parte del aprendizaje…-… seguimos adelante… Gracias

news_page_object.py:

from config_yaml import config
import requests
import bs4

class NewsPage:
    def __init__(self, news_site_uid, url):
        self._config = config()['news_sites'][news_site_uid]
        self._queries = self._config['queries']
        self._html = None
        self._visit(url)

    def _select(self, query_string):
        return self._html.select(query_string)

    def _visit(self, url):
        response = requests.get(url)
        response.raise_for_status()
        self._html = bs4.BeautifulSoup(response.text, 'html.parser')

class HomePage(NewsPage):
    def __init__(self, news_site_uid, url):
        super().__init__(news_site_uid,url) #SE HACE EL SUPER PARA HERENCIA DEL HOME_PAGE

    @property
    def article_links(self):
        link_list = []
        for link in self._select(self._queries['homepage_article_links']):
            if link and link.has_attr('href'):
                link_list.append(link)

        return set(link['href'] for link in link_list)

class ArticlePage(NewsPage):#AGREGAMOS LA CLASE AL SUPER PARA QUE HAYA HERENCIA DE CLASES
    def __init__(self, news_site_uid, url):
        super().__init__(news_site_uid, url) #HERECIA DEL HOME_PAGE

    @property
    def body(self):
        result = self._select(self._queries['article_body']) #se agrega a la estructura //:'news_page´/news_site_uid/queries/article_body

        return result[0].text if len(result) else '' #lee el arreglo de la primera posicion de donde se encuentran los articulos
    @property
    def title(self):
        result = self._select(self._queries['article_title']) #se agrega a la estructura //:'news_page´/news_site_uid/queries/article_title

        return result[0].text if len(result) else```

Buenos días, como hago para obtener la ruta de una imagen (src=“https://domino.com/categoria/img.png” )

interesante!

Excelente clase
realizando la activida en windows 10 por que estoy modificando lo datos

config.yaml:

#SE HACEN QUERIES DE DOS PAGINAS
news_sites:
  eluniversal:
    url: https://www.eluniversal.com.mx/
    queries:
      homepage_article_links : '.field-content a'
      article_body: 'field-name-body'
      article_title: '.pane_content h1'```

Vamos por los Artículos…

Ya lleva 10 minutos cargando los links. Como lo detengo?

esperaré pandas porque con este no fué

Paso 3: Implementando nuestro web scrapper


config.yaml

news_sites:
  eluniversal:
    url: https://www.eluniversal.com.mx/
    queries:
      homepage_article_links : '.field-content a'
      article_body: 'field-name-body'
      article_title: '.pane_content h1'

  elpais:
    url: https://elpais.com/america/
    queries:
      homepage_article_links : ''
      article_body: ''
      article_title: ''

news_page_objects.py

1- Se reorganiza haciendo una clase padre, esta clase recibe el argumento y el url, tambien mantiene el select y el request.

2- se hace que la clase homepage quede, pero se agrega el super() para agregar herencia

3- se crea la clase ArticlePage y con herencia, con el fin de recopilar más datos.

from config_yaml import config
import requests
import bs4

class NewsPage:
    def __init__(self, news_site_uid, url):
        self._config = config()['news_sites'][news_site_uid]
        self._queries = self._config['queries']
        self._html = None
        self._visit(url)

    def _select(self, query_string):
        return self._html.select(query_string)

    def _visit(self, url):
        response = requests.get(url)
        response.raise_for_status()
        self._html = bs4.BeautifulSoup(response.text, 'html.parser')

class HomePage(NewsPage):
    def __init__(self, news_site_uid, url):
        super().__init__(news_site_uid,url) #se hace hijo de NewsPage

    @property
    def article_links(self):
        link_list = []
        for link in self._select(self._queries['homepage_article_links']):
            if link and link.has_attr('href'):
                link_list.append(link)

        return set(link['href'] for link in link_list)

class ArticlePage(NewsPage):
    def __init__(self, news_site_uid, url):
        super().__init__(news_site_uid, url) #se hace hijo de NewsPage

    @property
    def body(self):
        result = self._select(self._queries['article_body']) #se agrega a la estructura //:'news_page´/news_site_uid/queries/article_body

        return result[0].text if len(result) else '' #solo lanza el primer resultado y solo si es que hay, si no lanza ''

    @property
    def title(self):
        result = self._select(self._queries['article_title']) #se agrega a la estructura //:'news_page´/news_site_uid/queries/article_title

        return result[0].text if len(result) else ''

Código pre-escrito, muchas propiedades nuevas que no se encuentran en el curso de python, muchas cosas por mejorar…

para errores de requests.exceptions.HTTPError: 405 Client Error: Not allowed.
solución:

headers = {'User-Agent': 'Mozilla/5.0'}
    response = requests.get(url, headers=headers)
    response.raise_for_status()

Los invito a visitar el repositorio que he creado en base al curso, es para hacer scraping a mercadolibre y linio (Mexico y Colombia) , retorna los links de subcategorias y los productos de la primera pagina de una categoría https://github.com/91-julian-sanchez/big-commerce