Aún no tienes acceso a esta clase

Crea una cuenta y continúa viendo este curso

Valores duplicados en Python

33/38
Recursos

Aportes 24

Preguntas 4

Ordenar por:

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

Para aquellos que obtienen “caracteres extraños” al momento de abrir el csv (en excel) como: “ñ” en lugar de “ñ”, deben colocar encoding = ‘utf-8-sig’ en su df.to_csv(clean_filename’)

def _save_data(df,filename):
    logger.info('Guardando el archivo en {}'.format(filename))
    clean_filename = 'clean_{}'.format(filename)
    df.to_csv(clean_filename, encoding = 'utf-8-sig')

Por defecto los archivos CSV se separan por comas, pero en el body hay muchas comas, lo que genera problemas a la hora de abrir el archivo en otro programa como Excel, una opción es que el separador sea ‘;’. Ademas podrían tener problemas con los acentos por lo que es necesario definir el encoding, para eso se modifica la siguiente línea:

df.to_csv(clean_filename, encoding="utf-8", sep = ';')

Quedando la función así:

def _save_data(df, filename):
    clean_filename = 'clean_{}'.format(filename)
    logger.info('Saving data at location: {}'.format(clean_filename))
    df.to_csv(clean_filename, encoding="utf-8", sep = ';')

C:\mintic\python2\web_scrapper>py receta.py semana_2020_04_10_articulos.csv       INFO:__main__:Inicia limpiado                                                     INFO:__main__:Leyendo archivo semana_2020_04_10_articulos.csv                     INFO:__main__:Extrayendo id sitio                                                 INFO:__main__:Hallada id sitio: semana                                            INFO:__main__:Llenando uid_sitio con semana                                       INFO:__main__:Extrayendo el host de urls                                          INFO:__main__:Llenando titulos faltantes                                          INFO:__main__:Generando uid para cada fila                                        INFO:__main__:Limpiando el titulo del articulo                                    INFO:__main__:Limpiando el cuerpo del articulo                                    INFO:__main__:Tokenizando palabras en titulo                                      INFO:__main__:Tokenizando palabras en cuerpo                                      INFO:__main__:Removiendo las entradas duplicadas                                  INFO:__main__:Eliminando filas vacias                                             INFO:__main__:Guardando datos en clean_semana_2020_04_10_articulos.csv                                                                                         cuerpo  ... tk_cuerpo                                                                  uid                                                                                  ...                                                                            35e28f859991bd2375ac31c604236ce2  La Procuraduría General de la Nación afirma qu...  ...       621                                                                  2423919c056437f6db54529c7ba63dab  En medio de la emergencia por el coronavirus, ...  ...       383                                                                  d770672fac28323de9a11b0dd72d69a9  Eso de que el mundo va a ser mejor luego de qu...  ...       415                                                                  f366db1296904bab99f168c3457b09f3  A pocos días de las tradicionales reuniones de...  ...       378                                                                  43ce0880c70d530f7a5e282ca6090d1a  Liliana Giménez tenía 44 años y vivía en Córdo...  ...       340                                                                  ...                                                                             ...  ...       ...                                                                  27f4d9dbf2e392aa7ba679b741cc03eb  El año pasado, Foros Semana realizó el foro ‘M...  ...       370                                                                  093927475a475c7df08c4969415a44b9  Se trata de sobrevivir. Por esa razón miles, m...  ...       705                                                                  97efd70814caf43048ecaed9210a8849  La Fiscalía y la Policía capturaron este jueve...  ...      1186                                                                  d7d19208fd313e8166d1bbb607720de6  En los últimos días, ante la demora en la entr...  ...       285                                                                  5ae8615129620ba12d131d1125a8d9b9  Shirkers - Muy buena Directora: Sandi Tan País...  ...       335                                                                                                                                                    [70 rows x 7 columns] 

Funcionó muy bien 😃

En la función de main dejé el último paso así:

df = _save_data(df, filename)

Y en la función _save_data añadí:

return df

En mi caso, al tener los archivos csv en otra carpeta el filename tenía un slash y al guardar el archivo me daba error.
python newspaper_recipe.py web-scraper/elmundo_2020_07_28_articles.csv
Para solucionarlo hice esto:

def _save_data(df, filename):
	# clean_filename = 'clean_%s' % filename
	# Quitar slash porque da error al guardar el archivo
	clean_filename = 'clean_' + filename.replace('/', '_')

	logger.info('Saving data at location: %s' % clean_filename)
	df.to_csv(clean_filename, encoding='utf-8-sig')

Hola!
Comparto con uds mi repo de GitHub con el ejercicio realizado hasta el momento para el proceso de scraper.
Esta en la siguiente liga

Para el caso practico, yo estoy usando tres blogs de noticias de tecnología como fuentes de información.
Espero que les sea de utilidad.

Saludos.

Tengo el sigiuente error al correr el main.py para el pais: como puedo solucionarlo por favor

INFO:main:Article fetched!!
INFO:main:Star fetching article at https://cincodias.elpais.com/cincodias/2019/09/03/companias/156749225 8_603777.html
Traceback (most recent call last):
File “/usr/lib/python3/dist-packages/urllib3/connection.py”, line 141, in _new_conn
(self.host, self.port), self.timeout, **extra_kw)
File “/usr/lib/python3/dist-packages/urllib3/util/connection.py”, line 60, in create_connection
for res in socket.getaddrinfo(host, port, family, socket.SOCK_STREAM):
File “/usr/lib/python3.6/socket.py”, line 745, in getaddrinfo
for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
socket.gaierror: [Errno -2] Name or service not known

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File “/usr/lib/python3/dist-packages/urllib3/connectionpool.py”, line 601, in urlopen
chunked=chunked)
File “/usr/lib/python3/dist-packages/urllib3/connectionpool.py”, line 346, in _make_request
self._validate_conn(conn)
File “/usr/lib/python3/dist-packages/urllib3/connectionpool.py”, line 852, in _validate_conn
conn.connect()
File “/usr/lib/python3/dist-packages/urllib3/connection.py”, line 284, in connect
conn = self._new_conn()
File “/usr/lib/python3/dist-packages/urllib3/connection.py”, line 150, in _new_conn
self, “Failed to establish a new connection: %s” % e)
urllib3.exceptions.NewConnectionError: <urllib3.connection.VerifiedHTTPSConnection object at 0x7fdf98f73cc0> : Failed to establish a new connection: [Errno -2] Name or service not known

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File “/usr/lib/python3/dist-packages/requests/adapters.py”, line 440, in send
timeout=timeout
File “/usr/lib/python3/dist-packages/urllib3/connectionpool.py”, line 639, in urlopen
_stacktrace=sys.exc_info()[2])
File “/usr/lib/python3/dist-packages/urllib3/util/retry.py”, line 398, in increment
raise MaxRetryError(_pool, url, error or ResponseError(cause))
urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host=‘cincodias.elpais.com’, port=443): Max retries ex ceeded with url: /cincodias/2019/09/03/companias/1567492258_603777.html (Caused by NewConnectionError(’<urll ib3.connection.VerifiedHTTPSConnection object at 0x7fdf98f73cc0>: Failed to establish a new connection: [Err no -2] Name or service not known’,))

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File “main.py”, line 92, in <module>
_news_scrapper(args.news_site)
File “main.py”, line 32, in _news_scrapper
article = _fetch_article(news_site_uid, host, link)
File “main.py”, line 65, in _fetch_article
article = news.ArticlePage(news_site_uid, _build_link(host, link))
File “/home/maego/webscraper/news_page_objects.py”, line 42, in init
super().init(news_site_uid, url)
File “/home/maego/webscraper/news_page_objects.py”, line 14, in init
self._visit(self._url) # changed
File “/home/maego/webscraper/news_page_objects.py”, line 21, in _visit
response = requests.get(url)
File “/usr/lib/python3/dist-packages/requests/api.py”, line 72, in get
return request(‘get’, url, params=params, **kwargs)
File “/usr/lib/python3/dist-packages/requests/api.py”, line 58, in request
return session.request(method=method, url=url, **kwargs)
File “/usr/lib/python3/dist-packages/requests/sessions.py”, line 520, in request
resp = self.send(prep, **send_kwargs)
File “/usr/lib/python3/dist-packages/requests/sessions.py”, line 630, in send
r = adapter.send(request, **kwargs)
File “/usr/lib/python3/dist-packages/requests/adapters.py”, line 508, in send
raise ConnectionError(e, request=request)
requests.exceptions.ConnectionError: HTTPSConnectionPool(host=‘cincodias.elpais.com’, port=443): Max retries exceeded with url: /cincodias/2019/09/03/companias/1567492258_603777.html (Caused by NewConnectionError(’<u rllib3.connection.VerifiedHTTPSConnection object at 0x7fdf98f73cc0>: Failed to establish a new connection: [ Errno -2] Name or service not known’,))

buena clase aplicando para W10 con los datos de mi .csv que es distinto al del profesor y tiene menos datos

interesante!

Excelente clase,

[153 rows x 7 columns]
INFO:__main__:Starting cleaning process
INFO:__main__:Reading file eluniversal_2020_04_04_articles.csv
INFO:__main__:Extracting newspaper uid
INFO:__main__:Newspaper uid detected: eluniversal
INFO:__main__:Filling newspaper_uid column with eluniversal
INFO:__main__:Extracting host from urls
INFO:__main__:Filling missing titles
INFO:__main__:Generating uids for each row
INFO:__main__:Remove new lines from body
INFO:__main__:Calculating the number of unique tokens in title
INFO:__main__:Calculating the number of unique tokens in body
INFO:__main__:Removing duplicate entries
INFO:__main__:Dropping rows with missing values
INFO:__main__:Saving data at location: eluniversal_2020_04_04_articles.csv

<code>

mi resultado funciono muy bien

Les comparto el repositorio de mi código, espero que pueda serles de ayuda.
https://github.com/AngelFA04/newspapers_pipeline_scraping

Agregue las siguientes líneas a la función main en el receipe, para aquellos casos donde no filtraba bien o no eliminaba los valores vacios del titulo o el body.

Nota: También podría ser agregada en otra función.

    df = df[df['n_tokens_title']!=0]
    df = df[df['n_tokens_body']!=0]

Hola compañeros. Me pasa algo curioso: cuando ejecuto nuevamente el código ‘news_scraper.py’ para sacar el web scrapper de El País me aparece este error (abajo). Pero cuando lo ejecuto para El Universal o El Washington Post se ejecuta correctamente. ¿A qué se deberá ésto?

INFO:root:Beginning scraper for https://elpais.com/
INFO:root:Finding links in homepage...
Traceback (most recent call last):
  File "news_scraper.py", line 91, in <module>
    _news_scraper(args.news_site)
  File "news_scraper.py", line 37, in _news_scraper
    _save_articles(news_site_uid, articles)
  File "news_scraper.py", line 68, in _save_articles
    filter(lambda property: not property.startswith('_'), dir(articles[0])))
IndexError: list index out of range

Para quienes deban guardar el CSV en otra instancia y tengan l aruta y no deseen afectar la extensión, pueden hacer uso de los splits y joins para colocar el clean.csv o el identificador, en mi caso contaba con dos . uno en el nombre de usuario y otro para la extensión csv:

def _save_data(df, filename):
    
    nombre_a = filename.split('.')
    nombre_b = '.'.join(nombre_a[0:2])
    clean_filename = '{}_clean.csv'.format(nombre_b)
    logger.info('Guardando datos en {}'.format(clean_filename))
    df.to_csv(clean_filename)

A veces los dataframes vienen con ‘’ o con ‘-’, según el caso. Es decir, se lee un string vacío o una línea de indicación de la página web y esto no es un NaN (None).

Para borrar vacíos en el cuerpo, debemos hacer esto:

    df[column] = df[column].replace('-', np.nan)
    df[column] = df[column].replace('', np.nan)
    return df.dropna(axis=0, subset=[column])```

Entonces para borrar vacios, es mejor solo borrar vacio de body, por que miren lo que David está haciendo. Primero, las que no tienen título las crea a partir de la URL y luego mas adelante, el borra todas las filas con algún valor vacio, es decir,¿eso de que sirve entonces?

¿Seré yo el único aqui que se dá cuenta de lo que pasa o estoy yo mal?

YO TENGO UN MOTTO EN LA PROGRAMACIÓN: "ENTRE LA LIEBRE Y LA TORTUGA, SIEMPRE GANARÁ LA TORTUGA". ESTE TIPO VA A 1,000 KILOMETROS POR HORA Y TODA SU EXPERIENCIA LA ECHA AL TRASTE POR CORRER HACIENDO FUNCIONES EN VES DE PENSAR LA SECUENCIA CORRECTA DE ALGORITMOS.

La secuencia correcta sería: Borrar filas sin cuerpo, remover duplicados, agregar el newspaper_uid, extraer host, completar títulos faltantes, remover nuevas líneas de los cuerpos, y tokenizar las columnas.

Tal vez alguno le guste guardar los datasets en una carpeta diferente de donde esta guardando el script, para ordenar el proyecto. Yo suelo usar la dirección global.
Si ingresan la ruta, le puede aparecer un error como el siguientes:

FileNotFoundError: [Errno 2] No such file or directory: 'clean_/UBICACIÓN/DE_SUS/ARCHIVOS/nombre_data_set

Para solucionar ese error use expresiones regulares, aca les dejo la función _save_data


def _save_data(df, filename):
    patron = re.compile(r'(?P<missing_titles>[^/]+)$')  # Compilar nuestra expresion regular en un objeto de patrones de Python
    filename_clean = str(patron.findall(filename)[0]) # findall(): Encuentra todos los subtextos donde haya una coincidencia y nos devuelve estas coincidencias como una lista. Seleccionamos el elemento 0.
    clean_filename = 'clean_{}'.format(filename_clean)
    logger.info('Saving data at location {}'.format(filename))
    df.to_csv(clean_filename)

Hoy puedo decir que me siento realizada porque tengo mi primera data limpia.

los datos en la BBC salen super limpiios

bbc:
url: http://www.bbc.com
queries:
homepage_article_links: '.articulo-titulo a’
article_title: '.articulo-titulo’
article_body: ‘.articulo-cuerpo’

Fue necesario realizar unos cambios al codigo pero se cumplio el ejercicio, habia hecho mi propio desarrollo para agregar los tokens pero esto entraba en conflicto(no se porque) las funciones de esta clase por lo que primero salia un error acerca de que no tenia atributo dropna() y luego que no tenia atributo to_csv() entonces no guardaba, la solucion desafortunadamente fue copiar tal cual el codigo del profesor, seguire revisando y les contare pero si tienes alguno de estos errores y realizaste tu propio codigo para los tokens creo que es necesario que revises lo esas funciones, se puede hacer la prueba haciendo lo que yo hice(copiar el codigo del profesor0 y si funciona revisar a fondo el conflicto entre las funciones que creaste y las del profesor.

aqui mi resultado

C:\Website-VisualCode\Ingenieria Datos\web_scrapper_curso_datya_eng>newspaper_receipe.py eluniversal_2020_05_10_articles.csv
INFO:main:Starting cleaning process
INFO:main:Reading file eluniversal_2020_05_10_articles.csv
INFO:main:Extracting newspaper uid
INFO:main:Newspaper uid detected: eluniversal
INFO:main:Filling newspaper_uid column with eluniversal
INFO:main:Extracting host from urls
INFO:main:Filling missing titles
INFO:main:Generating uids for each row
INFO:main:Remove new lines from body
INFO:main:Calculating the number of unique tokens in title
INFO:main:Calculating the number of unique tokens in body
INFO:main:Removing duplicate entries
INFO:main:Dropping rows with missing values
INFO:main:Saving data at location: clean_eluniversal_2020_05_10_articles.csv

Funcionó para datasets de el universal y el pais, compartidos por compañeros en clases anteriores.
https://github.com/zamacode-github/DataEngineering_Platzi_Course

uff que bien, excelente esta clase