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 鈥渃aracteres extra帽os鈥 al momento de abrir el csv (en excel) como: 鈥溍兟扁 en lugar de 鈥溍扁, deben colocar encoding = 鈥榰tf-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 鈥楳...  ...       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, 鈥淔ailed 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(鈥榞et鈥, 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 鈥榥ews_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