Skip to content

Commit cde9bfb

Browse files
authored
Merge pull request #20 from anmerinoto/Saskia_Guerrero
Traduccion de Python-Web-Scrapping
2 parents ebc8fb1 + 61a3d34 commit cde9bfb

File tree

1 file changed

+86
-0
lines changed

1 file changed

+86
-0
lines changed

lessons/02_web_scraping.ipynb

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,15 @@
88
"\n",
99
"* * *\n",
1010
"\n",
11+
"### Iconos utilizados en este notebook\n",
12+
"🔔 **Preguntas**: Una pregunta rápida para ayudarte a entender qué está pasando.<br>\n",
13+
"🥊 **Desafío**: Ejercicio interactivo. Lo trabajaremos en el taller.!<br>\n",
14+
"⚠️ **Advertencia**: Aviso sobre cuestiones complicadas o errores comunes.<br>\n",
15+
"💡 **Tip**:Cómo hacer algo de forma un poco más eficiente o efectiva.<br>\n",
16+
"🎬 **Demo**: Mostrando algo más avanzado: ¡para que sepas para qué se puede usar Python!<br>\n",
17+
"\n",
18+
"### Objetivos de aprendizaje\n",
19+
"1. [Objetivos de aprendizaje](#when)\n",
1120
"### Íconos usados ​​en este cuaderno\n",
1221
"🔔 **Pregunta**: Una pregunta rápida para ayudarte a entender qué está pasando.<br>\n",
1322
"🥊 **Desafío**: Ejercicio interactivo. ¡Lo resolveremos en el taller!<br>\n",
@@ -27,13 +36,21 @@
2736
"source": [
2837
"<a id='when'></a>\n",
2938
"\n",
39+
"# “¿Hacer scraping o no hacerlo?”\n",
40+
"\n",
41+
"Cuando queremos acceder a datos de la web, primero debemos asegurarnos de que el sitio web que nos interesa ofrezca una API web. Plataformas como Twitter, Reddit y The New York Times ofrecen API. **Echa un vistazo a D-Lab [Python Web APIs](https://github.com/dlab-berkeley/Python-Web-APIs) Taller si quieres aprender a utilizar las API.**\n",
42+
"\n",
43+
"Sin embargo, a menudo no existe una API web. En estos casos, podemos recurrir al web scraping, donde extraemos el HTML subyacente de una página web y obtenemos directamente la información deseada. Existen varios paquetes en Python que podemos usar para realizar estas tareas. Nos centraremos en dos paquetes: Requests y Beautiful Soup.\n",
44+
"\n",
45+
"Nuestro estudio de caso consistirá en extraer información sobre el [Senadores estatales de Illinois](http://www.ilga.gov/senate), así como el [lista de facturas](http://www.ilga.gov/senate/SenatorBills.asp?MemberID=1911&GA=98&Primary=True) Cada senador ha patrocinado. Antes de empezar, revise estos sitios web para conocer su estructura."
3046
"# Scraping o no scraping\n",
3147
"\n",
3248
"Para acceder a datos de la web, primero debemos asegurarnos de que el sitio web que nos interesa ofrezca una API web. Plataformas como Twitter, Reddit y el New York Times ofrecen API. **Consulta el taller de D-Lab sobre [API web de Python](https://github.com/dlab-berkeley/Python-Web-APIs) si quieres aprender a usar las API.**\n",
3349
"\n",
3450
"Sin embargo, a menudo no existe una API web. En estos casos, podemos recurrir al web scraping, donde extraemos el HTML subyacente de una página web y obtenemos directamente la información que buscamos. Existen varios paquetes en Python que podemos usar para realizar estas tareas. Nos centraremos en dos paquetes: Requests y Beautiful Soup.\n",
3551
"\n",
3652
"Nuestro estudio de caso recopilará información sobre los senadores estatales de Illinois (http://www.ilga.gov/senate), así como la lista de proyectos de ley patrocinados por cada senador. Antes de comenzar, revise estos sitios web para conocer su estructura."
53+
3754
]
3855
},
3956
{
@@ -42,7 +59,11 @@
4259
"source": [
4360
"## Instalación\n",
4461
"\n",
62+
63+
"Utilizaremos dos paquetes principales: [Solicitudes](http://docs.python-requests.org/en/latest/user/quickstart/) y [Beautiful Soup](http://www.crummy.com/software/BeautifulSoup/bs4/doc/). Continúe e instale estos paquetes, si aún no lo ha hecho:"
64+
4565
"Usaremos dos paquetes principales: [Requests](http://docs.python-requests.org/en/latest/user/quickstart/) y [Beautiful Soup](http://www.crummy.com/software/BeautifulSoup/bs4/doc/). Continúe instalando estos paquetes, si aún no lo ha hecho:"
66+
4667
]
4768
},
4869
{
@@ -156,6 +177,11 @@
156177
"\n",
157178
"# Extracción y análisis de HTML\n",
158179
"\n",
180+
"Para extraer y analizar HTML correctamente, seguiremos los siguientes 4 pasos:\n",
181+
"1. Realizar una solicitud GET\n",
182+
"2. Analizar la página con Beautiful Soup\n",
183+
"3. Buscar elementos HTML\n",
184+
"4. Obtener los atributos y el texto de estos elementos"
159185
"Para extraer y analizar correctamente HTML, seguiremos los siguientes 4 pasos:\n",
160186
"1. Realizar una solicitud GET\n",
161187
"2. Analizar la página con Beautiful Soup\n",
@@ -167,6 +193,15 @@
167193
"cell_type": "markdown",
168194
"metadata": {},
169195
"source": [
196+
"## Paso 1: Realizar una solicitud GET para obtener el HTML de una página\n",
197+
"\n",
198+
"Podemos usar la biblioteca Requests para:\n",
199+
"\n",
200+
"1. Realizar una solicitud GET a la página y\n",
201+
"2. Leer el código HTML de la página web.\n",
202+
"\n",
203+
"El proceso de realizar una solicitud y obtener un resultado es similar al del flujo de trabajo de la API web. Sin embargo, ahora realizamos una solicitud directamente al sitio web y tendremos que analizar el HTML nosotros mismos. Esto contrasta con recibir datos organizados en una salida JSON o XML más sencilla."
204+
=======
170205
"## Paso 1: Realiza una solicitud GET para obtener el HTML de una página\n",
171206
"\n",
172207
"Podemos usar la librería Requests para:\n",
@@ -374,7 +409,11 @@
374409
"cell_type": "markdown",
375410
"metadata": {},
376411
"source": [
412+
413+
"¿Cuántos enlaces obtuvimos?"
414+
377415
"¿Cuantos enlaces obtuvimos?"
416+
378417
]
379418
},
380419
{
@@ -466,7 +505,11 @@
466505
"cell_type": "markdown",
467506
"metadata": {},
468507
"source": [
508+
509+
"## 🥊Desafío: Encontrar todo\n",
510+
469511
"## 🥊 Desafío: Encontrar todo\n",
512+
470513
"\n",
471514
"Usa BeautifulSoup para encontrar todos los elementos `a` con la clase `mainmenu`."
472515
]
@@ -484,7 +527,11 @@
484527
"cell_type": "markdown",
485528
"metadata": {},
486529
"source": [
530+
531+
"Paso 4: Obtener los atributos y el texto de los elementos\n",
532+
487533
"## Paso 4: Obtener los atributos y el texto de los elementos\n",
534+
488535
"\n",
489536
"Una vez identificados los elementos, necesitamos la información de acceso de cada uno. Normalmente, esto implica dos cosas:\n",
490537
"\n",
@@ -976,6 +1023,19 @@
9761023
"\n",
9771024
"`http://www.ilga.gov/senate/SenatorBills.asp?MemberID=1911&GA=98&Primary=True`\n",
9781025
"\n",
1026+
1027+
"donde `MEMBER_ID=1911`.\n",
1028+
"\n",
1029+
"Deberías poder ver que, lamentablemente, `MEMBER_ID` no se extrae actualmente en nuestro código de extracción.\n",
1030+
"\n",
1031+
"Tu tarea inicial es modificar el código anterior para que también **recuperemos la URL completa que apunta a la página correspondiente de los proyectos de ley patrocinados por las primarias** de cada miembro, y la devolvamos junto con su nombre, distrito y partido.\n",
1032+
"\n",
1033+
"Consejos:\n",
1034+
"\n",
1035+
"* Para ello, deberá obtener el elemento de anclaje correspondiente (`<a>`) en la fila de cada legislador de la tabla. Puede usar el método `.select()` en el objeto `row` del bucle para hacerlo, de forma similar al comando que busca todas las celdas `td.detail` de la fila. Recuerde que solo necesitamos el enlace a los proyectos de ley del legislador, no a los comités ni a su página de perfil.\n",
1036+
"* El HTML de los elementos de anclaje se verá como `<a href=\"/senate/Senator.asp/...\">Proyectos de ley</a>`. La cadena del atributo `href` contiene el enlace **relativo** que buscamos. Puede acceder a un atributo de un objeto `Tag` de BeatifulSoup de la misma manera que accede a un diccionario de Python: `anchor['attributeName']`. Consulta la <a href=\"http://www.crummy.com/software/BeautifulSoup/bs4/doc/#tag\">documentación</a> para obtener más detalles.\n",
1037+
"* Hay muchas maneras diferentes de usar BeautifulSoup. Puedes usar cualquier método para extraer el `href`.\n",
1038+
9791039
"en el cual `MEMBER_ID=1911`. \n",
9801040
"\n",
9811041
"Deberías poder ver que, lamentablemente, `MEMBER_ID` no se extrae actualmente en nuestro código de extracción.\n",
@@ -987,6 +1047,7 @@
9871047
"* Para ello, deberás obtener el elemento de anclaje apropiado (`<a>`) en la fila de la tabla de cada legislador. Puedes usar el método `.select()` en el objeto `row` del bucle para hacerlo, similar al comando que encuentra todas las celdas `td.detail` de la fila. Recuerda que solo queremos el enlace a los proyectos de ley del legislador, no a los comités ni a su página de perfil.\n",
9881048
"* El HTML de los elementos de anclaje se verá como `<a href=\"/senate/Senator.asp/...\">Proyectos de ley</a>`. La cadena del atributo `href` contiene el enlace **relativo** que buscamos. Puedes acceder a un atributo de un objeto `Tag` de BeatifulSoup de la misma manera que accedes a un diccionario de Python: `anchor['attributeName']`. Consulta la <a href=\"http://www.crummy.com/software/BeautifulSoup/bs4/doc/#tag\">documentación</a> para más detalles.\n",
9891049
"* Hay muchas maneras diferentes de usar BeautifulSoup. Puedes hacer lo que necesites para extraer el `href`.\n",
1050+
9901051
"\n",
9911052
"El código se ha completado parcialmente. Complétalo donde dice `#TU CÓDIGO AQUÍ`. Guarda la ruta en un objeto llamado `full_path`."
9921053
]
@@ -1051,7 +1112,11 @@
10511112
"source": [
10521113
"## 🥊 Desafío: Modulariza tu código\n",
10531114
"\n",
1115+
1116+
"Convierte el código anterior en una función que acepte una URL, rastree la URL para encontrar sus senadores y devuelva una lista de tuplas con información sobre cada senador. "
1117+
10541118
"Convierte el código anterior en una función que acepte una URL, rastree la URL para encontrar sus senadores y devuelva una lista de tuplas con información sobre cada senador."
1119+
10551120
]
10561121
},
10571122
{
@@ -1085,6 +1150,22 @@
10851150
"cell_type": "markdown",
10861151
"metadata": {},
10871152
"source": [
1153+
1154+
"## 🥊 Desafío práctico: Escribir una función de scraping\n",
1155+
"\n",
1156+
"Queremos scraping las páginas web correspondientes a los proyectos de ley patrocinados por cada proyecto de ley.\n",
1157+
"\n",
1158+
"Escribir una función llamada `get_bills(url)` para analizar la URL de un proyecto de ley. Esto implica:\n",
1159+
"\n",
1160+
"- Solicitar la URL mediante la biblioteca <a href=\"http://docs.python-requests.org/en/latest/\">`requests`</a>\n",
1161+
"- Usar las funciones de la biblioteca `BeautifulSoup` para encontrar todos los elementos `<td>` con la clase `billlist`\n",
1162+
"- Devolver una _lista_ de tuplas, cada una con:\n",
1163+
"- Descripción (2.ª columna)\n",
1164+
"- Cámara (S o H) (3.ª columna)\n",
1165+
"- La última acción (4.ª columna)\n",
1166+
"- La fecha de la última acción (5.ª columna)\n",
1167+
"\n",
1168+
10881169
"## 🥊Desafío práctico: Escribir una función de scraping\n",
10891170
"\n",
10901171
"Queremos scraping las páginas web correspondientes a los proyectos de ley patrocinados por cada proyecto de ley.\n",
@@ -1099,6 +1180,7 @@
10991180
"- La última acción (4.ª columna)\n",
11001181
"- La fecha de la última acción (5.ª columna)\n",
11011182
"\n",
1183+
11021184
"Esta función se ha completado parcialmente. Complete el resto."
11031185
]
11041186
},
@@ -1117,7 +1199,11 @@
11171199
" bills = []\n",
11181200
" for row in rows:\n",
11191201
" # YOUR CODE HERE\n",
1202+
1203+
" #bill_id =\n",
1204+
11201205
" # bill_id =\n",
1206+
11211207
" #description =\n",
11221208
" #chamber =\n",
11231209
" #last_action =\n",

0 commit comments

Comments
 (0)