Web Scraping 2
Web Scraping 2
Web Scraping 2
PID_00256970
Ninguna parte de esta publicación, incluido el diseño general y la cubierta, puede ser copiada,
reproducida, almacenada o transmitida de ninguna forma, ni por ningún medio, sea éste eléctrico,
químico, mecánico, óptico, grabación, fotocopia, o cualquier otro, sin la previa autorización escrita
de los titulares del copyright.
© FUOC • PID_00256970 Web scraping
Índice
Introducción............................................................................................... 5
Objetivos....................................................................................................... 8
7. Aspectos legales.................................................................................. 52
Resumen....................................................................................................... 60
Ejercicios de autoevaluación.................................................................. 61
Solucionario................................................................................................ 62
Glosario........................................................................................................ 63
Bibliografía................................................................................................. 66
© FUOC • PID_00256970 5 Web scraping
Introducción
Por ejemplo, cuando necesitamos analizar la competencia para así definir es-
trategias en nuestro negocio, puede ser interesante recuperar toda aquella in-
formación relacionada con productos o precios que se encuentre en su página
web. Asimismo, podemos recuperar datos para hacer un estudio que permita
mejorar nuestro servicio o producto. Por ejemplo, en la página web de un hos-
pital donde se registre la lista de espera en urgencias en tiempo real, recupe-
rar esta información de forma periódica nos puede ayudar a detectar aquellas
horas más concurridas que necesitan la incorporación de personal sanitario
© FUOC • PID_00256970 6 Web scraping
Previamente a la aparición del web scraping, los datos debían recogerse ma-
nualmente de diferentes fuentes, de forma poco eficiente, no reproducible y
propensa a errores. No obstante, la ciencia de datos ha ido incorporando ca-
da vez más procesos automatizados para la recopilación y publicación de in-
formación en línea, a través del uso de herramientas de software expandidas
principalmente para las etapas de análisis, como Python, aunque también se
puede realizar web scraping en R, como detallan Munzert y otros (2014), con
el objetivo de extender estas herramientas a las fases previas a la minería de
datos.
Así, para abordar los aspectos fundamentales del web scraping, este material
didáctico se divide en ocho secciones principales. El apartado 1 incluye algu-
nas reflexiones sobre por qué y cómo debe aplicarse esta técnica. A continua-
ción, se detallan los primeros pasos a realizar cuando se aplica web scraping,
utilizando el lenguaje de programación Python. En el apartado 3, se aborda
la extracción de información de contenido audiovisual, y en la siguiente sec-
ción, se revisan los formatos estandarizados más comúnmente utilizados en
el almacenamiento de datos generados mediante web scraping, así como los
principales repositorios públicos en los que poder compartir dichos datos.
objetivo de resaltar los potenciales beneficios del uso de esta técnica, se nom-
bran algunos ejemplos y casos de éxito en los que el web scraping ha permitido
extraer información de gran interés.
Por último, tras un breve resumen de los contenidos más relevantes de este
material didáctico, se proponen algunos ejercicios de autoevaluación, así co-
mo sus soluciones, con los que el lector puede revisar la asimilación de los
principales conceptos que aquí se presentan.
Este material didáctico se acompaña de un repositorio Github donde se in- Enlace de interés
cluye el código de algunos de los ejemplos proporcionados. De este modo, el
Podéis acceder al reposito-
lector puede descargar, probar y modificar directamente cada uno de dichos rio Github en este enlace:
ejemplos, sin la necesidad de copiarlos manualmente. https://github.com/datalife-
cicleuoc.
© FUOC • PID_00256970 8 Web scraping
Objetivos
10. Conocer diferentes casos de éxito o usos prácticos del web scraping.
© FUOC • PID_00256970 9 Web scraping
• Una lista de críticas de un sitio web sobre libros, series o películas, con
el objetivo de crear un motor de recomendación, o construir un modelo
predictivo que detecte aquellas críticas falsas.
Por lo tanto, por regla general, buscaremos en primer lugar si existe una API
que nos permita extraer la información deseada. Si nuestro objetivo es, por
ejemplo, recuperar una lista de tuits más recientes, dicha información puede
descargarse fácilmente mediante la API de Twitter. No obstante, se pueden dar
diversas situaciones en las que la extracción de datos mediante web scraping
puede ser interesante, incluso cuando ya existe una API para tal efecto:
• Cuando existe una API, pero esta no es gratuita; mientras que el acceso a Bibliografía
la página web sí lo es. recomendada
• Cuando la API limita el número de accesos por segundo, por día, etc. CEBIT d!talk, 12.06.2018,
• Cuando la API no permite recuperar toda aquella información de interés Keynote «Data Is The New
Oil - The Internet revolution
que se muestra en la página web. already started years ago and
it isn't over yet», Mikko Hyp-
pönen, Chief Research Offi-
Así, en un mundo donde, según Mikko Hypponen, «los datos son el nuevo cer, F-Secure. URL: https://
www.youtube.com/watch?
petróleo», el web scraping juega un papel relevante al abrir la puerta a datos v=HE0RuDUy9JM.
prácticamente ilimitados, que pueden ser de gran utilidad en cualquier disci-
plina. El acceso a información disponible en internet ha abierto nuevas fron-
Enlace de interés
teras para la creación de conocimiento, permitiendo realizar pronósticos de
mercado en cualquier sector económico como el ocio, la restauración, la au- Puede ser de vuestro interés
tomoción, etc.; mejorar el diagnóstico médico a partir de información proce- la página web del proyecto
«We Feel Fine» por Jonathan
dente de foros de salud; e incluso ha revolucionado el mercado del arte. En Harris y Sep Kamvar http://
www.wefeelfine.org.
2006, Jonathan Harris y Sep Kamvar lanzaron el proyecto «We Feel Fine» (nos
sentimos bien), durante el cual crearon, a partir de la información compartida
en una extensa gama de blogs, una base de datos formada con frases empezan-
do por «I feel/I am feeling» (me siento/me estoy sintiendo). Este experimento
dio lugar a una visualización de la información que se hizo muy popular, al
describir cómo el mundo se sentía día tras día, minuto tras minuto. Así, inde-
pendientemente del campo de interés, el web scraping cuenta con un potencial
incalculable que, adecuadamente aplicado, puede incrementar la eficiencia de
cualquier investigación o negocio.
Además, el uso de web scraping aporta el valor añadido de ser fácilmente auto-
matizable. Cuando detectamos información útil para nuestro proyecto que se
encuentra disponible en internet, la recolección automática, o semiautomáti-
ca, puede ser altamente recomendable si:
D.�Kouzis-Loukas (2016).
1.2.1. Evaluación inicial Learning Scrapy. Packt Publis-
hing.
bloqueados.
User-agent: *
Disallow: /cgi-bin/
Disallow: /tmp/
Disallow: /~joe/
User-agent: *
Disallow: /
User-agent: *
© FUOC • PID_00256970 13 Web scraping
Disallow:
User-agent: Google
Disallow:
User-agent: *
Disallow: /
User-agent: *
Disallow: /~joe/junk.html
Disallow: /~joe/foo.html
Disallow: /~joe/bar.html
2)�Mapa�del�sitio�web. Examinar el mapa del sitio web (sitemap, en inglés) Enlace de interés
nos ayudará a localizar el contenido actualizado sin la necesidad de rastrear
El formato Simplemaps
cada una de las páginas que lo componen. El mapa de un sitio web se describe XML se describe en deta-
mediante el formato Simplemaps XML y se compone, principalmente, por las lle en el siguiente enlace:
https://www.sitemaps.org/
siguientes etiquetas: protocol.html.
La principal ventaja de los sitemaps es que permiten a los motores de búsqueda, Enlace de interés
como Google o Bing, rastrear más fácilmente el sitio web. Aunque estos busca-
Para más información sobre
dores suelen indexar correctamente cualquier página web pequeña o mediana XML-Sitemaps, consultad
adecuadamente diseñada, rastrear aquellos sitios de mayor tamaño presenta- el enlace siguiente: https://
www.xml-sitemaps.com/.
rá ciertas complejidades, principalmente cuando se actualicen con frecuencia.
Asimismo, el sitemap permite a los usuarios navegar más cómodamente por
el sitio. Por ello, existen algunos generadores automáticos de sitemaps, como
XML-Sitemaps.
Por otro lado, inspeccionar la estructura de una página web puede ser también
de gran utilidad. Con este objetivo se puede clicar el botón derecho del ratón
para posteriormente seleccionar la opción «View page source», tal y como se
muestra en la figura 1.
Fuente: Wikipedia
Asimismo, para inspeccionar más fácilmente el contenido de una página web, Bibliografía
se puede añadir la extensión Firebug Lite al navegador. En la figura 2 se muestra recomendada
un ejemplo donde se puede observar el contenido de una página procedente Acodemy (2015). Learn Web
de la plataforma Wikipedia. Scraping With Python In A
Day: The Ultimate Crash Cour-
se to Learning the Basics of
Web Scraping With Python In
Según Acodemy (2015), aunque Wikipedia es una extensa fuente de informa-
No Time. CreateSpace Inde-
ción, su formato no siempre facilita la extracción de datos, por lo que analizar pendent Publishing Platform.
su estructura previamente a realizar web scraping acostumbra a ser muy reco-
mendable.
© FUOC • PID_00256970 15 Web scraping
Fuente: Wikipedia
import whois
print(whois.whois('https://www.wordpress.com'))
Donde la función whois llama al sitio web del cual se pretende conocer el
propietario; por lo que para el mismo ejemplo de WordPress, el resultado ob-
tenido se muestra a continuación:
#{
#"registrar": "MarkMonitor, Inc.",
#"city": null,
#"expiration_date": [
#"2020-03-03 12:13:23",
#"2020-03-03 04:13:23-08:00"
#],
#"domain_name": [
#"WORDPRESS.COM",
#"wordpress.com"
#],
#"dnssec": "unsigned",
#"name": null,
#"state": "CA",
#"status": [
#"clientDeleteProhibited https://icann.org/epp#clientDeleteProhibited",
#"clientTransferProhibited https://icann.org/epp#clientTransferProhibited",
#"clientUpdateProhibited https://icann.org/epp#clientUpdateProhibited",
#"serverDeleteProhibited https://icann.org/epp#serverDeleteProhibited",
#"serverTransferProhibited https://icann.org/epp#serverTransferProhibited",
#"serverUpdateProhibited https://icann.org/epp#serverUpdateProhibited",
#"clientUpdateProhibited (https://www.icann.org/epp#clientUpdateProhibited)",
#"clientTransferProhibited (https://www.icann.org/epp#clientTransferProhibited)",
#"clientDeleteProhibited (https://www.icann.org/epp#clientDeleteProhibited)",
#"serverUpdateProhibited (https://www.icann.org/epp#serverUpdateProhibited)",
#"serverTransferProhibited (https://www.icann.org/epp#serverTransferProhibited)",
#"serverDeleteProhibited (https://www.icann.org/epp#serverDeleteProhibited)"
#],
#"org": "Automattic, Inc.",
#"whois_server": "whois.markmonitor.com",
#"country": "US",
#"emails": [
#"[email protected]",
#"[email protected]"
#],
#"zipcode": null,
#"creation_date": [
#"2000-03-03 12:13:23",
#"2000-03-03 04:13:23-08:00"
#],
© FUOC • PID_00256970 18 Web scraping
#"name_servers": [
#"NS1.WORDPRESS.COM",
#"NS2.WORDPRESS.COM",
#"NS3.WORDPRESS.COM",
#"NS4.WORDPRESS.COM",
#"ns2.wordpress.com",
#"ns3.wordpress.com",
#"ns4.wordpress.com",
#"ns1.wordpress.com"
#],
#"updated_date": [
#"2017-01-12 22:53:10",
#"2017-01-13 14:26:51-08:00"
#],
#"referral_url": null,
#"address": null
#}
Aunque el web scraping se presenta como una herramienta con un enorme po- Bibliografía
tencial al permitir el acceso a datos prácticamente ilimitados, como comenta recomendada
O. Bosch (2017) en un documento oficial de la Comisión Europea, con este se O.�Bosch (2017). An intro-
presentan importantes retos que debemos tener presentes a la hora de rastrear duction to web scraping, IT
and Legal aspects. <https://
datos de cualquier página web. bit.ly/2pMUYKC>
Por un lado, será relevante determinar qué datos se desean extraer al realizar
web scraping. Así, aunque diversos sitios web ofrecerán información de nues-
tro interés, deberemos analizar cuáles de estos sitios son los más adecuados
en función de nuestras necesidades. Asimismo, deberemos identificar aque-
llas fuentes de información que cuenten con la última versión de los datos.
También se debe analizar la calidad de los mismos; punto que se tratará en el
apartado 8, donde se enumeran las variables a tener en cuenta a la hora de
determinar la calidad de la información. En ocasiones, será necesario escoger
entre el propietario de los datos y un agregador de contenidos, por lo que será
interesante explorar los flujos entre sitios web.
algunas páginas pueden dejar de existir con el paso del tiempo, otras nuevas
aparecerán. Así, lo más recomendable será monitorizar constantemente la in-
formación de interés.
Una idea clave a la hora de realizar web scraping es que, con el objeti-
vo de planificar e implementar una descarga óptima de la información
contenida en una página web determinada, es necesario entender cómo
funciona el navegador mediante el cual se accede al contenido de dicha
página.
Por ello, en este apartado, se trata en primer lugar el funcionamiento del na-
vegador web. Posteriormente, se detalla cómo se debe descargar la página web
que se desea rastrear, así como la estructura anidada que de este proceso se
obtiene. Finalmente, con el objetivo de identificar la información de interés,
se presentan diversas operaciones útiles a la hora de navegar por dicha estruc-
tura anidada, disponibles mediante el uso de la librería BeautifulSoup.
Navegamos por la web todos los días, cada vez que accedemos a nuestro co-
rreo electrónico y redes sociales, consultamos las últimas noticias, realizamos
alguna compra en internet, buscamos información en Wikipedia o tutoriales
en YouTube sobre un tema de interés, etc. Pero ¿cómo funciona realmente el
proceso en el que se accede a una página web desde nuestro navegador? Prin-
cipalmente, este proceso puede resumirse en tres pasos:
• Cookie. Otro concepto importante son las cookies, ya que permiten esta-
blecer preferencias que persisten a lo largo de diferentes páginas web.
Una vez realizada la petición HTTP por parte del navegador, el servidor envía
una respuesta de tipo HTTP/2.0 200 OK, incluyendo cabeceras HTTP de res-
puesta, así como un documento HTML. La figura 5 muestra un ejemplo de
cabeceras de respuesta.
© FUOC • PID_00256970 22 Web scraping
• 2XX. Peticiones exitosas. Esta clase de código de estado indica que la pe-
tición fue recibida correctamente, entendida y aceptada. Otro ejemplo de
este tipo es el 201 Created, que indica que la petición ha sido completa-
da y ha resultado en la creación de un nuevo recurso.
• 3XX. Redirecciones. En este caso, el cliente debe tomar una acción adicio-
nal para completar la petición. Un ejemplo de este tipo es el código 300
Multiple Choices, el cual indica opciones múltiples que el cliente debe
seleccionar: presentando distintas opciones de formato para la visualiza-
ción de vídeos, listando archivos con distintas extensiones, etc.
Finalmente, el navegador parsea la página web objetivo para así construir una
estructura anidada conocida como el document object model (DOM). Aunque
este modelo puede ser muy complejo, establece la jerarquía anidada de cual-
quier sitio web. La figura 6 muestra, de forma esquemática, un ejemplo de
DOM.
En web scraping, el primer paso a realizar es la descarga del sitio web de interés.
Esto se puede realizar mediante las librerías Requests y BeautifulSoup.
page = requests.get(str)
© FUOC • PID_00256970 24 Web scraping
Así, page será un objeto que, entre sus atributos más importantes, destacan:
print(soup.prettify())
# <html>
# <head>
# <title># The Dormouse's story
# </title>
# </head>
# <body>
# <p class="title">
# <b>
# The Dormouse's story
# </b>
# </p>
# <p class="story">
# Once upon a time there were three little sisters; and their names were
# <a class="sister" href="http://example.com/elsie" id="link1">
# Elsie
# </a>
# ,
# <a class="sister" href="http://example.com/lacie" id="link2">
# Lacie
# </a>
# and
# <a class="sister" href="http://example.com/tillie" id="link2">
# Tillie
# </a>
# ; and they lived at the bottom of a well.
# </p>
# <p class="story">
© FUOC • PID_00256970 25 Web scraping
# ...
# </p>
# </body>
# </html>
2.3.1. Tag
tag.name
# u'b'
tag.attrs
# {u'id': 'boldest'}
O bien directamente:
tag['id']
# u'boldest'
Por otro lado, los atributos de un tag se pueden añadir, eliminar o modificar:
tag['id'] = 'verybold'
tag['another-attribute'] = 1
tag
# <b another-attribute="1" id="verybold"></b>
© FUOC • PID_00256970 26 Web scraping
del tag['id']
del tag['another-attribute']
tag
# <b></b>
tag['id']
# KeyError: 'id'
print(tag.get('id'))
# None
2.3.2. NavigableString
tag.string
# u'Extremely bold'
type(tag.string)
# <class 'bs4.element.NavigableString'>
2.3.3. BeautifulSoup
soup.name
# u'[document]'
2.3.4. Comment
comment = soup.b.string
type(comment)
# <class 'bs4.element.Comment'>
print(soup.prettify())
# <html>
# <head>
# <title># The Dormouse's story
# </title>
# </head>
# <body>
# <p class="title">
# <b>
# The Dormouse's story
# </b>
# </p>
# <p class="story">
# Once upon a time there were three little sisters; and their names were
# <a class="sister" href="http://example.com/elsie" id="link1">
# Elsie
# </a>
# ,
# <a class="sister" href="http://example.com/lacie" id="link2">
# Lacie
© FUOC • PID_00256970 28 Web scraping
# </a>
# and
# <a class="sister" href="http://example.com/tillie" id="link2">
# Tillie
# </a>
# ; and they lived at the bottom of a well.
# </p>
# <p class="story">
# ...
# </p>
# </body>
# </html>
1)�soup.title
2)�soup.title.name
# u'title'
3�)�soup.title.string
4)�soup.title.parent.name
# u'head'
5)�soup.p
6)�soup.p['class']
# u'title'
7)�soup.a
8)�soup.find_all('a')
9)�soup.find(id="link3")
Asimismo, es habitual extraer todas las URL contenidas en un sitio web, aso-
ciadas a las etiquetas de tipo <a>, mediante la instrucción:
print(soup.get_text())
# The Dormouse's story
# Once upon a time there were three little sisters; and their names were
# Elsie,
# Lacie and
# Tillie;
# and they lived at the bottom of a well.
# ...
Los diferentes tags pueden contener cadenas de caracteres, así como otros tags
o etiquetas. Estos elementos son lo que se conocen como los hijos (children, en
inglés) de la etiqueta y BeautifulSoup proporciona gran cantidad de métodos
que permiten navegar e iterar sobre los hijos de dicha etiqueta.
head_tag = soup.head
head_tag
# <head><title>The Dormouse's story</title></head>
soup.body.b
# <b>The Dormouse's story</b>
Es importante destacar que este método solo devuelve el primer tag con dicho
nombre, por lo que si se pretende recuperar todas las etiquetas de un mismo
tipo, es necesario utilizar la función find_all.
Otro método para obtener los hijos de un tag consiste en utilizar la fun-
ción .contents:
head_tag.contents
# [<title>The Dormouse's story</title>]
title_tag = head_tag.contents[0]
title_tag
# <title>The Dormouse's story</title>
title_tag.contents
# [u'The Dormouse's story']
Asimismo, en lugar de obtener los hijos como una lista, se pueden extraer
mediante el generador .children:
Tanto .contents como .children solo consideran los hijos directos de una
etiqueta. Así, en el ejemplo anterior, <head> solo tiene como hijo directo
la etiqueta <title>, pero esta última tiene a su vez un hijo, el string «The
Dormouse’s story», por lo que este string puede considerarse también descen-
dencia de la etiqueta <head>. Si se quiere recuperar la totalidad de la descen-
dencia de un tag, será necesario utilizar el método .descendants:
head_tag.contents
# [<title>The Dormouse's story</title>]
title_tag = soup.title
title_tag
# <title>The Dormouse's story</title>
title_tag.parent
# <head><title>The Dormouse's story</title></head>
Finalmente, dado que .parent solo accede al elemento padre directo, la ins-
trucción .parents permite iterar sobre toda la ascendencia. El siguiente ejem-
plo muestra cómo es posible navegar, mediante la función .parents, desde
una etiqueta <a> contenida en un documento hasta la parte superior de dicho
documento:
link = soup.a
link
# <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>
sibling_soup = BeautifulSoup("<a><b>text1</b><c>text2</c></b></a>")
print(sibling_soup.prettify())
# <html>
# <body>
# <a>
# <b>
# text1
# </b>
# <c>
# text2
# </c>
# </a>
# </body>
© FUOC • PID_00256970 32 Web scraping
# </html>
Las etiquetas <b> y <c> se presentan como hermanas, al ser ambas elementos
hijos de una etiqueta <a>.
sibling_soup.b.next_sibling
# <c>text2</c>
sibling_soup.c.previous_sibling
# <b>text1</b>
• find_all. Este método extrae todos los objetos Tag y NavigableString Bibliografía
de la estructura analizada que coinciden con los criterios dados. Función recomendada
Además del texto procedente de un sitio web, puede ser de utilidad extraer y
almacenar ciertas imágenes u otro contenido audiovisual. Para ello, se puede
implementar un método que guarde dicho contenido predeterminado, dada
su URL. El siguiente ejemplo almacena la imagen con URL source_url en
la carpeta Pictures:
import requests
def load_requests(source_url):
r = requests.get(source_url, stream = True)
if r.status_code == 200:
aSplit = source_url.split('/')
ruta = "/home/user/Pictures/"+aSplit[len(aSplit)-1]
print(ruta)
output = open(ruta,"wb")
for chunk in r:
output.write(chunk)
output.close()
Por lo tanto, para realizar web scraping sobre las imágenes de un sitio web de-
beremos obtener sus URL para, posteriormente, almacenarlas en una carpeta,
en este caso Pictures, mediante la función load_requests creada anterior-
mente.
Fuente: Wikipedia.
Asimismo, existen algunas librerías, como la presentada en Heydt (2018), que Bibliografía
permiten obtener capturas de pantalla periódicas de una página web. En fun- recomendada
ción del objetivo final del web scraping aplicado, esta información almacenada M.�Heydt (2018). Python Web
en formato gráfico puede ser de gran utilidad para el rastreo de la evolución Scraping Cookbook: Over 90
proven recipes to get you scra-
de una página web. ping with Python, microservi-
ces, Docker, and AWS. Packt
Publishing.
© FUOC • PID_00256970 37 Web scraping
No obstante, existen muchos otros formatos estandarizados para el almacena- R.�Mitchell (2015). Web Scra-
miento de datos, como pueden ser XML o RDF. ping with Python: Collecting
Data from the Modern Web.
O'Reilly.
4.1. Creación de un archivo de datos CSV
Tras realizar web scraping, el formato más comúnmente utilizado para almace-
nar datos de tipo texto es el CSV o comma separated values.
import csv
with open('eggs.csv', 'w', newline='') as csvfile:
spamwriter = csv.writer(csvfile, delimiter=' ',
quotechar='|', quoting=csv.QUOTE_MINIMAL)
spamwriter.writerow(['Spam'] * 5 + ['Baked Beans'])
spamwriter.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam'])
Enlace de interés
import csv
with open('eggs.csv', newline='') as csvfile:
spamreader = csv.reader(csvfile, delimiter=' ', quotechar='|')
for row in spamreader:
print(', '.join(row))
Otro tipo de datos que puede ser interesante, a la hora de almacenar la infor-
mación extraída mediante web scraping, es el formato JSON (Javascript Object
Notation), ya que se trata de un formato computacionalmente sencillo, que
resulta fácil de leer, interpretar y escribir.
Fuente: JSON
Por otro lado, un array se define entre corchetes (‘[]’); separando los diferentes
valores mediante comas (ver figura 9).
Fuente: JSON
Por su parte, cada valor puede ser un string, un número, un true, un false, un
null, un objeto o un array (ver figura 10).
© FUOC • PID_00256970 39 Web scraping
Fuente: JSON
Fuente: JSON
Fuente: JSON
© FUOC • PID_00256970 40 Web scraping
import json
json.dumps(['foo', {'bar': ('baz', None, 1.0, 2)}])
# '["foo", {"bar": ["baz", null, 1.0, 2]}]'
Enlace de interés
{
"name" : "Carril_Bici_Construccio_GeoJson",
"type" : "FeatureCollection",
"crs" : {
"type" : "name",
"properties" : {
"name" : "EPSG:25831"
}
},
"features" : [
{
"type" : "Feature",
"geometry" : {
"type" : "LineString",
"coordinates" : [
[ 427704.83499489503, 4579666.9013711698 ],
[ 427709.81394183601, 4579642.00360063 ],
[ 427716.32587691199, 4579625.1497550504 ],
[ 427723.98780126096, 4579607.9119127104 ],
[ 427763.058417933, 4579528.6226368099 ],
[ 427780.27225003002, 4579497.1649236102 ],
[ 427781.06223390898, 4579466.1872106604 ],
[ 427899.71207724401, 4579251.9421635903 ],
[ 428209.77504851203, 4578673.2964416901 ],
© FUOC • PID_00256970 41 Web scraping
[ 428242.22674152104, 4578647.8856680803 ],
[ 428341.96476299502, 4578447.6954964502 ],
[ 428357.75161059998, 4578424.7347049201 ],
[ 428549.68073765899, 4578075.81088675 ]
]
},
"properties" : {
"CODI_CAPA" : "K028",
"CODI_SUBCAPA" : "K06",
"ID" : "GL241872",
"TOOLTIP" : "Carril Bici Bidireccional pg Zona Franca"
}
},
[...]
}
Una vez obtenidos los datos de interés mediante web scraping, puede ser intere- Bibliografía
sante crear una API que contenga y acceda de forma amigable a dichos datos. recomendada
app = Flask(__name__)
api = Api(app)
class HelloWorld(Resource):
def get(self):
return {'hello': 'world'}
api.add_resource(HelloWorld, '/')
if __name__ == '__main__':
app.run(debug=True)
Enlace de interés
Para más información acerca de la generación de API mediante Flask, se puede consultar
el siguiente enlace: https://bit.ly/2sWRCFU.
© FUOC • PID_00256970 42 Web scraping
Figura 14. Ejemplo de los conjuntos de datos disponibles en UCI Machine Learning Repository
Fuente: Github
© FUOC • PID_00256970 44 Web scraping
Fuente: DataWorld
© FUOC • PID_00256970 45 Web scraping
Con el objetivo de evitar el web scraping, el administrador de un sitio web Enlace de interés
puede aplicar diversas medidas que permitan detener o ralentizar el uso de
Para más información sobre
bots. Como consecuencia, se han desarrollado nuevas herramientas basadas el concepto de web scraping,
en visión por computador y procesado de lenguaje natural que simulan el consultad el enlace siguiente:
https://en.wikipedia.org/wi-
comportamiento humano y, por tanto, consiguen acceder al contenido web ki/Web_scraping.
que se pretende rastrear.
Aunque existen diversos métodos diseñados para la prevención del web scra-
ping; a continuación, se listan algunos de los más habituales:
3) Uso del archivo robots.txt para especificar el bloqueo de ciertos bots, como
googlebot, o cadenas user agent.
Figura17. Ejemplo de un
CAPTCHA (smwm)
Fuente: Wikipedia(computing)
8) Uso de CSS sprites para mostrar datos, tales como números de teléfono o
direcciones de correo electrónico, ya que esto dificulta la extracción de texto
por parte de los rastreadores automáticos (ver figura 19). No obstante, este
método supone una pérdida de accesibilidad para los lectores de pantalla y los
motores de búsqueda, así como una disminución en el rendimiento del sitio.
Fuente: FormGet
A continuación, se resumen diferentes métodos que permiten evitar los obs- Bibliografía
táculos o trampas diseñadas para prevenir el web scraping en una página web. recomendada
Una de las cabeceras por defecto más importantes es el user agent, ya que con-
tiene información sobre el software que está enviando la petición. En cual-
quier navegador web, este se ajusta automáticamente a valores tales como Mo-
zilla/5.0 (Macintosh; Intel Mac OS X...). De hecho, es posible identificar qué
user agent está utilizando nuestro navegador simplemente escribiendo «check
user agent» en la barra de direcciones, como se muestra en la figura 20.
import requests
headers = {
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,\
*/*;q=0.8",
"Accept-Encoding": "gzip, deflate, sdch, br",
© FUOC • PID_00256970 48 Web scraping
"Accept-Language": "en-US,en;q=0.8",
"Cache-Control": "no-cache",
"dnt": "1",
"Pragma": "no-cache",
"Upgrade-Insecure-Requests": "1",
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/5\
37.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36"
}
r = requests.get("http://www.example.com", headers=headers)
import requests
session = requests.Session()
session.post("http://example.com/login", data=dict(
email="[email protected]",
password="secret_value"
))
<!-- peticiones realizadas con session agregan automáticamente las cookies-->
r = session.get("http://example.com/protected_page")
Estas restricciones son solo una sugerencia y nunca una obligación, por lo que
en muchos casos es posible recuperar información de páginas en las que el
propietario ha expresado su voluntad de no ser rastreado. No obstante, lo más
© FUOC • PID_00256970 49 Web scraping
El usuario promedio toma unos segundos navegando por una página antes de
intentar acceder a la siguiente, lo que desencadena otra petición HTTP en su
navegador. No obstante, cuando las peticiones proceden de un script, este pue-
de mandar tantas peticiones simultáneas que es capaz de saturar el servidor
web. Incluso si el web scraping está permitido en una página web determinada,
otros usuarios pueden estar navegando al mismo tiempo, por lo que es impor-
tante verificar que nuestras acciones no están colapsando el servidor web.
import time
for term in ["web scraping", "web crawling", "scrape this site"]:
t0 = time.time()
r = requests.get("http://example.com/search", params=dict(query=term))
Sin embargo, cabe mencionar que el uso de estos servidores suele suponer un Bibliografía
coste adicional, que gira en torno a 40 USD por cada 100 direcciones IP, según recomendada
En un servidor web, los timeouts se producen cuando dicho servidor tarda mu-
cho en devolver una respuesta, generalmente más de 30 segundos. Cuando
una petición toma tanto tiempo, se asume que algo no está funcionando co-
rrectamente. Por ello, lo más recomendable en estos casos es anular la peti-
ción, esperar un poco y volver a intentarlo de nuevo.
try:
<!-- esperar hasta 10 segundos-->
requests.get("http://example.com", timeout=10)
except requests.exceptions.Timeout:
pass
try:
requests.get("http://example.com")
except requests.exceptions.RequestException:
pass
© FUOC • PID_00256970 51 Web scraping
7. Aspectos legales
Por ello, esta sección, basada en Vanden Broucke y Baeysens (2018), resume Bibliografía
las principales disposiciones en las que suelen basarse los casos judiciales aso- recomendada
ciados al web scraping, así como algunos consejos para evitar problemas legales S.�Vanden�Broucke;�B.�Bae-
a la hora de embarcarse en proyectos que impliquen la extracción de informa- sens (2018). Practical Web
Scraping for Data Science.
ción de sitios web que no sean de nuestra propiedad. Springer
Por ello, el uso de una casilla de verificación explícita o enlace del tipo «Acep-
to» obliga al web scraper a aceptar activamente los términos. Del mismo mo-
do, en aquellos sitios en los que es necesario iniciar sesión, la creación de una
cuenta suele incluir un acuerdo explícito de los términos y condiciones.
Ejemplo�de�navegación�privada
Para navegar de forma privada, por ejemplo en Mozilla Firefox, se debe acceder al nave-
gador como se muestra en la figura 21. Cabe mencionar que, en estos casos, el navegador
muestra una máscara en la parte superior.
© FUOC • PID_00256970 56 Web scraping
El web scraping puede aplicarse a dominios muy variados, con diferentes fines. Bibliografía
A continuación, se citan varios ejemplos de uso potencial en diferentes áreas. recomendada
S.�Vanden�Broucke;�B.�Bae-
• Analizar�la�competencia. El web scraping puede ser de utilidad para com- sens (2018). Practical Web
Scraping for Data Science.
parar productos y precios de nuestros principales competidores. Springer
• Gestionar�la�reputación�de�una�marca,�comercial�o�personal,�en�inter-
net. Esto se puede realizar mediante grafos de relaciones obtenidos de Wi-
kipedia, realizando análisis de sentimientos procedentes de redes sociales,
etc.
• Mejorar�el�posicionamiento:�search�engine�optimization�(SEO). El posi-
cionamiento SEO se basa en diversos parámetros, entre los que se encuen-
tra el contenido de la página web. Así, analizar dicho contenido mediante
web scraping puede ayudar en la optimización del posicionamiento.
• En RRHH, esta técnica está ganando cada vez más fuerza. La startup hiQ,
Enlace de interés
por ejemplo, se ha especializado en la venta de información sobre emplea-
dos, o potenciales empleados, mediante el uso de datos recopilados de in- Podéis acceder a la página
web de hiQ en este enlace:
ternet, principalmente extraídos de los perfiles públicos de LinkedIn. https://www.hiqlabs.com/.
• Las empresas de marketing digital, así como los artistas digitales, utilizan Enlace de interés
los datos presentes en internet para diseñar todo tipo de proyectos creati-
Para más información sobre
vos. El proyecto «We Feel Fine», introducido en el apartado 1, en el que el proyecto, consultad el en-
Jonathan Harris y Sep Kamvar rastrearon todas aquellas frases presentes lace: wefeelfine.org/.
en blogs empezando por «I feel/I am feeling», dio lugar a una forma muy
creativa de mostrar cómo se sentía el mundo a lo largo del día.
• En otro estudio, los mensajes descargados de Twitter, blogs y otras redes Enlace de interés
sociales fueron analizados para construir una base de datos que permitiera
Acceded al estudio sobre
construir un modelo predictivo para la identificación de patrones de de- Twitter en este enlace:
presión y pensamientos suicidas. Aunque esta herramienta podría tener https://bit.ly/2wIGpsy.
• En un artículo de Cavallo y Rigobon (2016), titulado «The Billion Prices Enlace de interés
Project: Using Online Prices for Measurement and Research» (el proyecto
Acceded al estudio de Cava-
de los mil millones de precios: el uso de precios en línea para la medición llo y Rigobon (2016) en este
y la investigación), se utilizó web scraping para recolectar un conjunto de enlace: http://www.nber.org/
papers/w22111.
datos compuesto por gran cantidad de precios presentes en internet, con el
objetivo de construir un índice robusto de precios diarios, para diferentes
países.
• Los científicos sociopolíticos también utilizan el web scraping para analizar Enlace de interés
los sentimientos de la población, así como su orientación política. Un fa-
Acceded al artículo en
moso artículo titulado «Dissecting Trump’s Most Rabid Online Following» la página web: https://
describe los resultados de uno de estos estudios, en el que se analizaron fivethirtyeight.com/featu-
res/dissecting-trumps-most-
rabid-online-following/.
© FUOC • PID_00256970 59 Web scraping
Resumen
Tras revisar algunos pasos previos necesarios para planificar cualquier proceso
de web scraping de forma óptima, se han revisado las principales herramientas
disponibles en las librerías Requests y BeautifulSoup que permiten recuperar
textos, imágenes o cualquier otro contenido audiovisual procedentes de inter-
net.
Ejercicios de autoevaluación
1. Explicad con vuestras propias palabras cuándo es útil realizar web scraping. Imaginad que
tenéis un negocio, explicad cuándo podría ser útil aplicar web scraping.
2. Poned un ejemplo donde publicar datos obtenidos mediante web scraping sea legal, y otro
en el que no.
3. Enumerad los cinco pasos previos necesarios para planificar cualquier proceso de web scra-
ping de forma óptima.
4. ¿Los errores en la descarga de páginas web pueden ser temporales? Explicad por qué.
6. Enumerad los métodos utilizados para resolver los obstáculos más habituales en web scra-
ping.
e) Contenido. ¿Qué campos incluye? ¿Cuál es el periodo de tiempo de los datos y cómo se
han recogido?
g) Inspiración. ¿Por qué es interesante este conjunto de datos? ¿Qué preguntas le gustaría
responder a la comunidad?
h) Licencia. Se debe seleccionar una de las siguientes licencias y justificar la elección: Relea-
sed Under CC0: Public Domain License, Released Under CC BY-NC-SA 4.0 License, Released
Under CC BY-SA 4.0 License, Database Released Under Open Database License, Individual
Contents Under Database Contents License, Other (specified above) o Unknown License.
8. Imaginad que queréis crear una empresa con el objetivo de vender un producto o servicio.
Después de explicar en tres líneas la misión de dicha empresa, detallad diferentes conjuntos
de datos, ya existentes o creados mediante web scraping, que utilizaríais para mejorar el pro-
ducto o servicio ofrecido.
© FUOC • PID_00256970 62 Web scraping
Solucionario
Ejercicios de autoevaluación
1.�Es útil realizar web scraping cuando no disponemos de API para acceder a los datos web,
o cuando las API disponibles no aportan información suficiente para nuestro proyecto de
datos. Como ejemplo de negocio, podemos suponer una zapatería que pretende hacer un
seguimiento de los precios de la competencia. Podríamos analizar el sitio web del principal
competidor todos los días, con el objetivo de comparar los precios de los diferentes zapatos
a la venta; sin embargo, esto tomaría mucho tiempo y no permitiría controlar cambios fre-
cuentes en la oferta. Por lo tanto, una alternativa consistiría en reemplazar este proceso ma-
nual y repetitivo por una solución automatizada, basada en técnicas de web scraping.
2.�Ejemplo legal: listas de teléfonos. Ejemplo ilegal: opiniones (asociadas a derechos de autor).
3.�Revisar el archivo robots.txt, examinar el mapa del sitio web, estimar su tamaño, identificar
la tecnología utilizada y conocer el webmaster o propietario.
4.�Sí, los errores de descarga pueden ser temporales. Un ejemplo de error temporal es el código
de estado 503 Service Unavailable, tras el que se puede intentar la descarga más tarde.
5.�No es necesario, pero es recomendable ya que algunos sitios web bloquean al usuario por
defecto, para evitar el uso de rastreadores automáticos.
6.�Modificar el user agent, gestionar los logins y cookies de sesión, analizar el archivo robots.txt,
espaciar las peticiones HTTP, usar múltiples direcciones IP mediante servidores proxy, confi-
gurar timeouts y evitar las spider traps o trampas de araña.
8.�La misión de la empresa es ofrecer calzado fabricado con materias primas 100 % reciclables
y ecológicas. Tanto la materia prima como la elaboración del producto serán de proximidad,
fomentando el empleo local y el comercio justo. Algunos conjuntos de datos ya existentes
de utilidad podrían ser los siguientes:
Asimismo, con el objetivo de realizar un estudio de mercado, se podría aplicar web scraping
para recuperar información sobre los productos y precios que ofrece la competencia.
Por otro lado, sería interesante analizar las opiniones de nuestros clientes en el sitio web o
en redes sociales, con el objetivo de adaptar tanto el producto/servicio ofrecido como el plan
de marketing.
El web scraping también podría servir para encontrar direcciones de correo electrónico de
potenciales clientes, interesados en el comercio justo, en proteger el medio ambiente y en
el calzado de diseño.
Por último, contar con un resumen de toda la información disponible sobre calzado ecológico
de comercio justo en un mismo sitio podría ser interesante a la hora de tomar decisiones
sobre nuestro modelo de negocio.
© FUOC • PID_00256970 63 Web scraping
Glosario
API f véase interfaz�de�programación�de�aplicaciones.
atom feeds m Formato de redifusión web basado en un fichero XML, desarrollado como
alternativa al formato RSS.
bot m Aféresis de robot. Programa informático autónomo, capaz de llevar a cabo tareas
concretas y repetitivas a través de internet, cuya realización por parte de un humano sería
imposible o muy tediosa.
CAPTCHA Siglas de completely automated public turing test to tell computers and humans apart
(prueba de Turing completamente automática y pública para diferenciar ordenadores de hu-
manos). Prueba de tipo desafío-respuesta, utilizada en computación para determinar cuándo
un usuario es o no humano.
galleta f Pequeño archivo con datos procedentes de un sitio web, almacenados en el nave-
gador del usuario. Dado que proporciona información sobre la actividad previa del usuario
en dicho sitio web, permite agilizar la navegación.
en cookie
CSS sprites f En una página web, conjunto de imágenes o iconos agrupados en una misma
imagen.
hoja de estilo en cascada f Lenguaje de diseño gráfico que permite presentar, de manera
estructurada, un documento escrito en lenguaje de marcado. Se usa principalmente en el
diseño visual de documentos web e interfaces de usuario escritas en XML o HTML.
sigla CSS
en cascading style sheets
JSON Acrónimo de JavaScript Object Notation. Formato de texto ligero utilizado para el
intercambio de datos.
mapa de sitio web m Conjunto de páginas de un sitio web, accesibles por parte de bus-
cadores y usuarios.
en sitemap
parsear Recorrer todos los registros de una base de datos. Un parser, en computación, es
un analizador sintáctico, es decir, un programa informático que analiza la sintaxis de un
documento escrito en un lenguaje en particular.
profundidad (de una página web) f Número promedio de clics necesarios para llegar
a una determinada página del sitio.
RSS feed Siglas de Really Simple Syndication (Sindicación Realmente Simple). Formato XML
utilizado para la difusión de contenido web.
servidor proxy m Equipo dedicado o sistema de software que actúa como intermediario
en las peticiones de recursos que realiza un cliente a otro servidor.
trampa de araña f Conjunto de páginas web que, intencionadamente o no, pueden causar
que un rastreador web o bot de búsqueda se bloquee entre un número infinito de peticiones.
en spider trap
valor separado por comas m Archivo de texto que almacena los datos en forma de tabla,
donde las columnas se separan por comas (o punto y coma en aquellos idiomas en los que
la coma es el separador decimal) y las filas por saltos de línea.
sigla CSV
© FUOC • PID_00256970 65 Web scraping
en comma-separated values
Bibliografía
Acodemy (2015). Learn Web Scraping With Python In A Day: The Ultimate Crash Course to
Learning the Basics of Web Scraping With Python In No Time. CreateSpace Independent Publis-
hing Platform.
Broucke, S. Vanden; Baesens, B. (2018). Practical Web Scraping for Data Science. Springer.
Cavallo, A.; Rigobon, R. (2016). The Billion Prices Project: Using Online Prices for Measure-
ment and Research. Journal of Economic Perspectives (vol. 30, núm. 2, págs. 151-178).
Heydt, M. (2018). Python Web Scraping Cookbook: Over 90 proven recipes to get you scraping
with Python, microservices, Docker, and AWS. Packt Publishing.
Mitchell, R. (2015). Web Scraping with Python: Collecting Data from the Modern Web. O'Reilly.
Munzert, S.; Rubba, C.; Meißner, P.; Nyhuis, D. (2014). Automated Data Collection with
R: A Practical Guide to Web Scraping and Text Mining. Hoboken, NJ; Chichester; West Sussex:
John Wiley & Sons.
Nair, V.G. (2014). Getting started with BeautifulSoup. Packt Publishing Ltd. Open Source
Collaborative framework in Python. [Fecha de consulta: 15 de marzo de 2018]. <https://
scrapy.org>