primer_separador

portada

primer_separador

WEB SCRAPING:

jupyter notebook para practicar la solicitud html de una página web y el parseo del mismo usndo tanto la libreria urllib como requests

Usando la libreria urllib:

URLLIB

  1. Request
    1.1 Open URLs
  2. Response
    2.1 Used internally (don't work with this)
  3. Error
    3.1 request exceptions
  4. Parse
    4.1 useFul URL funtions
  5. robotparser
    5.1 robot.txt file

NOTA: Recuerde URL son las siglas en ingles de Uniform Resource Locator que significa localizador de recursos uniformes más información aquí

Importar la libreria urllib

In [1]:
import urllib
dir(urllib)
Out[1]:
['__builtins__',
 '__cached__',
 '__doc__',
 '__file__',
 '__loader__',
 '__name__',
 '__package__',
 '__path__',
 '__spec__',
 'error',
 'parse',
 'request',
 'response']
In [2]:
from urllib import request
dir(request)
Out[2]:
['AbstractBasicAuthHandler',
 'AbstractDigestAuthHandler',
 'AbstractHTTPHandler',
 'BaseHandler',
 'CacheFTPHandler',
 'ContentTooShortError',
 'DataHandler',
 'FTPHandler',
 'FancyURLopener',
 'FileHandler',
 'HTTPBasicAuthHandler',
 'HTTPCookieProcessor',
 'HTTPDefaultErrorHandler',
 'HTTPDigestAuthHandler',
 'HTTPError',
 'HTTPErrorProcessor',
 'HTTPHandler',
 'HTTPPasswordMgr',
 'HTTPPasswordMgrWithDefaultRealm',
 'HTTPPasswordMgrWithPriorAuth',
 'HTTPRedirectHandler',
 'HTTPSHandler',
 'MAXFTPCACHE',
 'OpenerDirector',
 'ProxyBasicAuthHandler',
 'ProxyDigestAuthHandler',
 'ProxyHandler',
 'Request',
 'URLError',
 'URLopener',
 'UnknownHandler',
 '__all__',
 '__builtins__',
 '__cached__',
 '__doc__',
 '__file__',
 '__loader__',
 '__name__',
 '__package__',
 '__spec__',
 '__version__',
 '_cut_port_re',
 '_ftperrors',
 '_have_ssl',
 '_localhost',
 '_noheaders',
 '_opener',
 '_parse_proxy',
 '_proxy_bypass_macosx_sysconf',
 '_randombytes',
 '_safe_gethostbyname',
 '_thishost',
 '_url_tempfiles',
 'addclosehook',
 'addinfourl',
 'base64',
 'bisect',
 'build_opener',
 'contextlib',
 'email',
 'ftpcache',
 'ftperrors',
 'ftpwrapper',
 'getproxies',
 'getproxies_environment',
 'getproxies_registry',
 'hashlib',
 'http',
 'install_opener',
 'io',
 'localhost',
 'noheaders',
 'os',
 'parse_http_list',
 'parse_keqv_list',
 'pathname2url',
 'posixpath',
 'proxy_bypass',
 'proxy_bypass_environment',
 'proxy_bypass_registry',
 'quote',
 're',
 'request_host',
 'socket',
 'splitattr',
 'splithost',
 'splitpasswd',
 'splitport',
 'splitquery',
 'splittag',
 'splittype',
 'splituser',
 'splitvalue',
 'ssl',
 'string',
 'sys',
 'tempfile',
 'thishost',
 'time',
 'to_bytes',
 'unquote',
 'unquote_to_bytes',
 'unwrap',
 'url2pathname',
 'urlcleanup',
 'urljoin',
 'urlopen',
 'urlparse',
 'urlretrieve',
 'urlsplit',
 'urlunparse',
 'warnings']

Abrir la Url objetivo

Usando la funcion .urlopen de la biblioteca request se accede a la url objetivo

In [3]:
resp = request.urlopen("http://toscrape.com/")
type(resp)
Out[3]:
http.client.HTTPResponse

Verificación de la solicitud haya sido exitosa

Para comprobar que la respuesta fue exitosa usar la funcion .code y verificar de acuerdo a la siguiente tabla:

Codigoerror

Cortesia Socratica:

Para más informacion de los códigos de estado en el protocolo HTTP revizar el siguiente link

In [4]:
resp.code
Out[4]:
200
Excelente!!!

El protocolo nos dice que todo esta OK!


Para ver la longitud de la respuesta usar la funcion .length, esto retorna la longitud en Bytes de la respuesta

In [5]:
resp.length
Out[5]:
3776

Observar la respuesta a la solicitud

Para observar una pequeña parte de la respuesta usar la funcion .peek()

  • NOTA: observe atentamente "b'<!DOCTYPE...." al inicio de la respuesta, esto indica que la respuesta es un objeto tipo byte, no string.

  • NOTA: De igual manera note el valor de la variable charset es UTF-8

In [6]:
resp.peek()
Out[6]:
b'<!DOCTYPE html>\n<html lang="en">\n    <head>\n        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">\n        <title>Scraping Sandbox</title>\n        <link href="./css/bootstrap.min.css" rel="stylesheet">\n        <link href="./css/main.css" rel="stylesheet">\n    </head>\n    <body>\n        <div class="container">\n            <div class="row">\n                <div class="col-md-1"></div>\n                <div class="col-md-10 well">\n                    <img class="logo" src="img/sh-logo.png" width="200px">\n                    <h1 class="text-right">Web Scraping Sandbox</h1>\n                </div>\n            </div>\n\n            <div class="row">\n                <div class="col-md-1"></div>\n                <div class="col-md-10">\n                    <h2>Books</h2>\n                    <p>A <a href="http://books.toscrape.com">fictional bookstore</a> that desperately wants to be scraped. It\'s a safe place for beginners learning web scraping and for developers validating their scraping technologies as well. Available at: <a href="http://books.toscrape.com">books.toscrape.com</a></p>\n                    <div class="col-md-6">\n                        <a href="http://books.toscrape.com"><img src="./img/books.png" class="img-thumbnail"></a>\n                    </div>\n                    <div class="col-md-6">\n                        <table class="table table-hover">\n                            <tr><th colspan="2">Details</th></tr>\n                            <tr><td>Amount of items </td><td>1000</td></tr>\n                            <tr><td>Pagination </td><td>&#10004;</td></tr>\n                            <tr><td>Items per page </td><td>max 20</td></tr>\n                            <tr><td>Requires JavaScript </td><td>&#10008;</td></tr>\n                        </table>\n                    </div>\n                </div>\n            </div>\n\n            <div class="row">\n                <div class="col-md-1"></div>\n                <div class="col-md-10">\n                    <h2>Quotes</h2>\n                    <p><a href="http://quotes.toscrape.com/">A website</a> that lists quotes from famous people. It has many endpoints showing the quotes in many different ways, each of them including new scraping challenges for you, as described below.</p>\n                    <div class="col-md-6">\n                        <a href="http://quotes.toscrape.com"><img src="./img/quotes.png" class="img-thumbnail"></a>\n                    </div>\n                    <div class="col-md-6">\n                        <table class="table table-hover">\n                            <tr><th colspan="2">Endpoints</th></tr>\n                            <tr><td><a href="http://quotes.toscrape.com/">Default</a></td><td>Microdata and pagination</td></tr>\n                            <tr><td><a href="http://quotes.toscrape.com/scroll">Scroll</a> </td><td>infinite scrolling pagination</td></tr>\n                            <tr><td><a href="http://quotes.toscrape.com/js">JavaScript</a> </td><td>JavaScript generated content</td></tr>\n                            <tr><td><a href="http://quotes.toscrape.com/tableful">Tableful</a> </td><td>a table based messed-up layout</td></tr>\n                            <tr><td><a href="http://quotes.toscrape.com/login">Login</a> </td><td>login with CSRF token (any user/passwd works)</td></tr>\n                            <tr><td><a href="http://quotes.toscrape.com/search.aspx">ViewState</a> </td><td>an AJAX based filter form with ViewStates</td></tr>\n                            <tr><td><a href="http://quotes.toscrape.com/random">Random</a> </td><td>a single random quote</td></tr>\n                        </table>\n                    </div>\n                </div>\n            </div>\n        </div>\n    </body>\n</html>\n'

separador_dos

Confirmando el tipo de dato de la respuesta:

  • NOTA: usar la funcion .read() para leer la respuesta entera a la solicitud
In [7]:
data = resp.read()
type(data)
print(f"La respuesta es de tipo = [{type(data)}] y tiene una longitud de = [{len(data)}]")
La respuesta es de tipo = [<class 'bytes'>] y tiene una longitud de = [3776]

Convertir la respuesta a la solicitud en texto:

La idea principal es convertir esta respuesta a texto, es decir, obtener un objeto tipo String sobre el cual iterar, y realizar diferentes métodos

Para ello haremos una decodificación en función del parámetro de la variable charset = UTF-8

  • NOTA: la decodificación se realiza con la función .decode("parámetro_de_códificado_usado")
In [8]:
html = data.decode("UTF-8")
print(f"Ahora ya tenemos un objeto tipo = {type(html)}")
Ahora ya tenemos un objeto tipo = <class 'str'>

Veamos que contiene la variable html:

In [9]:
print(html)
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Scraping Sandbox</title>
        <link href="./css/bootstrap.min.css" rel="stylesheet">
        <link href="./css/main.css" rel="stylesheet">
    </head>
    <body>
        <div class="container">
            <div class="row">
                <div class="col-md-1"></div>
                <div class="col-md-10 well">
                    <img class="logo" src="img/sh-logo.png" width="200px">
                    <h1 class="text-right">Web Scraping Sandbox</h1>
                </div>
            </div>

            <div class="row">
                <div class="col-md-1"></div>
                <div class="col-md-10">
                    <h2>Books</h2>
                    <p>A <a href="http://books.toscrape.com">fictional bookstore</a> that desperately wants to be scraped. It's a safe place for beginners learning web scraping and for developers validating their scraping technologies as well. Available at: <a href="http://books.toscrape.com">books.toscrape.com</a></p>
                    <div class="col-md-6">
                        <a href="http://books.toscrape.com"><img src="./img/books.png" class="img-thumbnail"></a>
                    </div>
                    <div class="col-md-6">
                        <table class="table table-hover">
                            <tr><th colspan="2">Details</th></tr>
                            <tr><td>Amount of items </td><td>1000</td></tr>
                            <tr><td>Pagination </td><td>&#10004;</td></tr>
                            <tr><td>Items per page </td><td>max 20</td></tr>
                            <tr><td>Requires JavaScript </td><td>&#10008;</td></tr>
                        </table>
                    </div>
                </div>
            </div>

            <div class="row">
                <div class="col-md-1"></div>
                <div class="col-md-10">
                    <h2>Quotes</h2>
                    <p><a href="http://quotes.toscrape.com/">A website</a> that lists quotes from famous people. It has many endpoints showing the quotes in many different ways, each of them including new scraping challenges for you, as described below.</p>
                    <div class="col-md-6">
                        <a href="http://quotes.toscrape.com"><img src="./img/quotes.png" class="img-thumbnail"></a>
                    </div>
                    <div class="col-md-6">
                        <table class="table table-hover">
                            <tr><th colspan="2">Endpoints</th></tr>
                            <tr><td><a href="http://quotes.toscrape.com/">Default</a></td><td>Microdata and pagination</td></tr>
                            <tr><td><a href="http://quotes.toscrape.com/scroll">Scroll</a> </td><td>infinite scrolling pagination</td></tr>
                            <tr><td><a href="http://quotes.toscrape.com/js">JavaScript</a> </td><td>JavaScript generated content</td></tr>
                            <tr><td><a href="http://quotes.toscrape.com/tableful">Tableful</a> </td><td>a table based messed-up layout</td></tr>
                            <tr><td><a href="http://quotes.toscrape.com/login">Login</a> </td><td>login with CSRF token (any user/passwd works)</td></tr>
                            <tr><td><a href="http://quotes.toscrape.com/search.aspx">ViewState</a> </td><td>an AJAX based filter form with ViewStates</td></tr>
                            <tr><td><a href="http://quotes.toscrape.com/random">Random</a> </td><td>a single random quote</td></tr>
                        </table>
                    </div>
                </div>
            </div>
        </div>
    </body>
</html>

Como vemos, la variable html guarda la estructura html de la página a la que se le realizó la solicitud.


NOTA: Si intenta leer nuevamente la respuesta, esta estará vacía, ya que cuando se lee la respuesta python cierra la conexión

In [10]:
resp.read()
Out[10]:
b''

separador_dos

Veamos otro ejemplo de solicitud url:

In [ ]:
resp = request.urlopen("https://www.google.com/search?client=firefox-b-d&q=vac%C3%ADo")

Nos retorna error 403, el servidor se rehúsa(Forbidden==Prohibido) a responder, es decir, el servidor conecta con nuestra solicitud, la entiende, pero no nos da acceso a lo que se le solicita. Bien puede ser porqué es un contenido reservado, o porqué como clientes no tenemos permisos suficientes para acceder a este contenido.

error403

En general los errores 4XX son errores del cliente. Para más información sobre el error 403 consultar aquí

In [ ]:
resp.peek()

separador_dos

requests

Usando la libreria Requests:

Importe la libreria requests

In [1]:
import requests
dir(requests)
Out[1]:
['ConnectTimeout',
 'ConnectionError',
 'DependencyWarning',
 'FileModeWarning',
 'HTTPError',
 'NullHandler',
 'PreparedRequest',
 'ReadTimeout',
 'Request',
 'RequestException',
 'RequestsDependencyWarning',
 'Response',
 'Session',
 'Timeout',
 'TooManyRedirects',
 'URLRequired',
 '__author__',
 '__author_email__',
 '__build__',
 '__builtins__',
 '__cached__',
 '__cake__',
 '__copyright__',
 '__description__',
 '__doc__',
 '__file__',
 '__license__',
 '__loader__',
 '__name__',
 '__package__',
 '__path__',
 '__spec__',
 '__title__',
 '__url__',
 '__version__',
 '_check_cryptography',
 '_internal_utils',
 'adapters',
 'api',
 'auth',
 'certs',
 'chardet',
 'check_compatibility',
 'codes',
 'compat',
 'cookies',
 'cryptography_version',
 'delete',
 'exceptions',
 'get',
 'head',
 'hooks',
 'logging',
 'models',
 'options',
 'packages',
 'patch',
 'post',
 'put',
 'pyopenssl',
 'request',
 'session',
 'sessions',
 'status_codes',
 'structures',
 'urllib3',
 'utils',
 'warnings']

Use la función .get("url") para realizar la solicitud a la url

In [2]:
respuesta = requests.get("http://toscrape.com/")
type(respuesta)
Out[2]:
requests.models.Response
  • Nota: Observe que la función .get("url") retorna un objeto tipo respuesta
In [13]:
#respuesta? Esta opcion no es usual ya que abre una ventana auxiliar en la parte inferir del notebook
dir(respuesta)
#Con el comando dir veremos que atributos y métodos posee la respuesta que hemos recibido
Out[13]:
['__attrs__',
 '__bool__',
 '__class__',
 '__delattr__',
 '__dict__',
 '__dir__',
 '__doc__',
 '__enter__',
 '__eq__',
 '__exit__',
 '__format__',
 '__ge__',
 '__getattribute__',
 '__getstate__',
 '__gt__',
 '__hash__',
 '__init__',
 '__init_subclass__',
 '__iter__',
 '__le__',
 '__lt__',
 '__module__',
 '__ne__',
 '__new__',
 '__nonzero__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__setattr__',
 '__setstate__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 '__weakref__',
 '_content',
 '_content_consumed',
 '_next',
 'apparent_encoding',
 'close',
 'connection',
 'content',
 'cookies',
 'elapsed',
 'encoding',
 'headers',
 'history',
 'is_permanent_redirect',
 'is_redirect',
 'iter_content',
 'iter_lines',
 'json',
 'links',
 'next',
 'ok',
 'raise_for_status',
 'raw',
 'reason',
 'request',
 'status_code',
 'text',
 'url']

Para una mejor visualización de las funciones utilizables con la solicitud se realiza un help(respuesta), por ejemplo:

In [5]:
print(help(respuesta))
Help on Response in module requests.models object:

class Response(builtins.object)
 |  The :class:`Response <Response>` object, which contains a
 |  server's response to an HTTP request.
 |  
 |  Methods defined here:
 |  
 |  __bool__(self)
 |      Returns True if :attr:`status_code` is less than 400.
 |      
 |      This attribute checks if the status code of the response is between
 |      400 and 600 to see if there was a client error or a server error. If
 |      the status code, is between 200 and 400, this will return True. This
 |      is **not** a check to see if the response code is ``200 OK``.
 |  
 |  __enter__(self)
 |  
 |  __exit__(self, *args)
 |  
 |  __getstate__(self)
 |  
 |  __init__(self)
 |      Initialize self.  See help(type(self)) for accurate signature.
 |  
 |  __iter__(self)
 |      Allows you to use a response as an iterator.
 |  
 |  __nonzero__(self)
 |      Returns True if :attr:`status_code` is less than 400.
 |      
 |      This attribute checks if the status code of the response is between
 |      400 and 600 to see if there was a client error or a server error. If
 |      the status code, is between 200 and 400, this will return True. This
 |      is **not** a check to see if the response code is ``200 OK``.
 |  
 |  __repr__(self)
 |      Return repr(self).
 |  
 |  __setstate__(self, state)
 |  
 |  close(self)
 |      Releases the connection back to the pool. Once this method has been
 |      called the underlying ``raw`` object must not be accessed again.
 |      
 |      *Note: Should not normally need to be called explicitly.*
 |  
 |  iter_content(self, chunk_size=1, decode_unicode=False)
 |      Iterates over the response data.  When stream=True is set on the
 |      request, this avoids reading the content at once into memory for
 |      large responses.  The chunk size is the number of bytes it should
 |      read into memory.  This is not necessarily the length of each item
 |      returned as decoding can take place.
 |      
 |      chunk_size must be of type int or None. A value of None will
 |      function differently depending on the value of `stream`.
 |      stream=True will read data as it arrives in whatever size the
 |      chunks are received. If stream=False, data is returned as
 |      a single chunk.
 |      
 |      If decode_unicode is True, content will be decoded using the best
 |      available encoding based on the response.
 |  
 |  iter_lines(self, chunk_size=512, decode_unicode=False, delimiter=None)
 |      Iterates over the response data, one line at a time.  When
 |      stream=True is set on the request, this avoids reading the
 |      content at once into memory for large responses.
 |      
 |      .. note:: This method is not reentrant safe.
 |  
 |  json(self, **kwargs)
 |      Returns the json-encoded content of a response, if any.
 |      
 |      :param \*\*kwargs: Optional arguments that ``json.loads`` takes.
 |      :raises ValueError: If the response body does not contain valid json.
 |  
 |  raise_for_status(self)
 |      Raises stored :class:`HTTPError`, if one occurred.
 |  
 |  ----------------------------------------------------------------------
 |  Data descriptors defined here:
 |  
 |  __dict__
 |      dictionary for instance variables (if defined)
 |  
 |  __weakref__
 |      list of weak references to the object (if defined)
 |  
 |  apparent_encoding
 |      The apparent encoding, provided by the chardet library.
 |  
 |  content
 |      Content of the response, in bytes.
 |  
 |  is_permanent_redirect
 |      True if this Response one of the permanent versions of redirect.
 |  
 |  is_redirect
 |      True if this Response is a well-formed HTTP redirect that could have
 |      been processed automatically (by :meth:`Session.resolve_redirects`).
 |  
 |  links
 |      Returns the parsed header links of the response, if any.
 |  
 |  next
 |      Returns a PreparedRequest for the next request in a redirect chain, if there is one.
 |  
 |  ok
 |      Returns True if :attr:`status_code` is less than 400, False if not.
 |      
 |      This attribute checks if the status code of the response is between
 |      400 and 600 to see if there was a client error or a server error. If
 |      the status code is between 200 and 400, this will return True. This
 |      is **not** a check to see if the response code is ``200 OK``.
 |  
 |  text
 |      Content of the response, in unicode.
 |      
 |      If Response.encoding is None, encoding will be guessed using
 |      ``chardet``.
 |      
 |      The encoding of the response content is determined based solely on HTTP
 |      headers, following RFC 2616 to the letter. If you can take advantage of
 |      non-HTTP knowledge to make a better guess at the encoding, you should
 |      set ``r.encoding`` appropriately before accessing this property.
 |  
 |  ----------------------------------------------------------------------
 |  Data and other attributes defined here:
 |  
 |  __attrs__ = ['_content', 'status_code', 'headers', 'url', 'history', '...

None

Comprobar si la solicitud es exitosa:

La función .status_code es simíl en requests a la funcions .code de la libreria urllib.
El objetivo de esta función es conocer el estado de la conexión con la url, o mejor dicho, el estado de la respuesta del servidor que ante la solicitud, de nuevo, se espera una respuesta códificada según el código de status del protocolo Html.

In [3]:
respuesta.status_code
Out[3]:
200

Otras formas de saber si la respuesta a la solicitud fue exitosa:

In [4]:
print(respuesta)
print(respuesta.ok)
<Response [200]>
True
EXITOSO!

El código 200 indica que todo esta OK!

Headers de la url consultada:

Los heders de la url solicitada nos indica información de los metadatos que la misma contiene:

In [5]:
headers_url = respuesta.headers
for key,value in headers_url.items():
    print(f"El header {key} contiene [{value}]")
El header Server contiene [nginx/1.12.1]
El header Date contiene [Tue, 05 Nov 2019 15:30:33 GMT]
El header Content-Type contiene [text/html]
El header Transfer-Encoding contiene [chunked]
El header Connection contiene [keep-alive]
El header Last-Modified contiene [Wed, 29 Jun 2016 21:51:37 GMT]
El header X-Upstream contiene [toscrape-sites-master_web]
El header Content-Encoding contiene [gzip]
In [7]:
print(respuesta.headers["Server"])
nginx/1.12.1
In [9]:
print(respuesta.headers['content-type'])
text/html
In [10]:
print(respuesta.encoding)
ISO-8859-1

Obtener el texto de la respuesta:

para obtener el texto de la solicitud se debe usar la función .text, como sigue:

In [11]:
Texto = respuesta.text
print(f"El texto almacenado es te tipo {type(Texto)}")
print("y además contiene: ")
print(Texto)
El texto almacenado es te tipo <class 'str'>
y además contiene: 
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Scraping Sandbox</title>
        <link href="./css/bootstrap.min.css" rel="stylesheet">
        <link href="./css/main.css" rel="stylesheet">
    </head>
    <body>
        <div class="container">
            <div class="row">
                <div class="col-md-1"></div>
                <div class="col-md-10 well">
                    <img class="logo" src="img/sh-logo.png" width="200px">
                    <h1 class="text-right">Web Scraping Sandbox</h1>
                </div>
            </div>

            <div class="row">
                <div class="col-md-1"></div>
                <div class="col-md-10">
                    <h2>Books</h2>
                    <p>A <a href="http://books.toscrape.com">fictional bookstore</a> that desperately wants to be scraped. It's a safe place for beginners learning web scraping and for developers validating their scraping technologies as well. Available at: <a href="http://books.toscrape.com">books.toscrape.com</a></p>
                    <div class="col-md-6">
                        <a href="http://books.toscrape.com"><img src="./img/books.png" class="img-thumbnail"></a>
                    </div>
                    <div class="col-md-6">
                        <table class="table table-hover">
                            <tr><th colspan="2">Details</th></tr>
                            <tr><td>Amount of items </td><td>1000</td></tr>
                            <tr><td>Pagination </td><td>&#10004;</td></tr>
                            <tr><td>Items per page </td><td>max 20</td></tr>
                            <tr><td>Requires JavaScript </td><td>&#10008;</td></tr>
                        </table>
                    </div>
                </div>
            </div>

            <div class="row">
                <div class="col-md-1"></div>
                <div class="col-md-10">
                    <h2>Quotes</h2>
                    <p><a href="http://quotes.toscrape.com/">A website</a> that lists quotes from famous people. It has many endpoints showing the quotes in many different ways, each of them including new scraping challenges for you, as described below.</p>
                    <div class="col-md-6">
                        <a href="http://quotes.toscrape.com"><img src="./img/quotes.png" class="img-thumbnail"></a>
                    </div>
                    <div class="col-md-6">
                        <table class="table table-hover">
                            <tr><th colspan="2">Endpoints</th></tr>
                            <tr><td><a href="http://quotes.toscrape.com/">Default</a></td><td>Microdata and pagination</td></tr>
                            <tr><td><a href="http://quotes.toscrape.com/scroll">Scroll</a> </td><td>infinite scrolling pagination</td></tr>
                            <tr><td><a href="http://quotes.toscrape.com/js">JavaScript</a> </td><td>JavaScript generated content</td></tr>
                            <tr><td><a href="http://quotes.toscrape.com/tableful">Tableful</a> </td><td>a table based messed-up layout</td></tr>
                            <tr><td><a href="http://quotes.toscrape.com/login">Login</a> </td><td>login with CSRF token (any user/passwd works)</td></tr>
                            <tr><td><a href="http://quotes.toscrape.com/search.aspx">ViewState</a> </td><td>an AJAX based filter form with ViewStates</td></tr>
                            <tr><td><a href="http://quotes.toscrape.com/random">Random</a> </td><td>a single random quote</td></tr>
                        </table>
                    </div>
                </div>
            </div>
        </div>
    </body>
</html>

Como se observa la funcion .text nos retorna un objeto tipo str iterable. Ahora jugemos un poco con la biblioteca requests para ver que más puede hacer.

Obteniendo una imagen

In [45]:
from IPython.display import Image

#Realizando la solicitud:
respuesta = requests.get("http://toscrape.com/img/books.png")
#-----------------------------------------------------------------------
#Verificando la solicitid:

if(respuesta.status_code == 200):    
    print("El la solocitud ha sido contestada exitosamente!!")    
else:
    print("Solicitud no constestada.")    
#-----------------------------------------------------------------------

#-----------------------------------------------------------------------
#Generando la imagen
print("La imagen es: ")
with open('imagen.png', 'wb') as f:
    f.write(respuesta.content)
Image(filename='imagen.png')
#-----------------------------------------------------------------------
El la solocitud ha sido contestada exitosamente!!
La imagen es: 
Out[45]:

Obteniendo el Json de la respuesta:

In [13]:
print(respuesta.json)
<bound method Response.json of <Response [200]>>

Notas finales de las libreria:

  • La librería urllib es vieja, poco usada hoy en día, y más complicada en sus métodos en comparación a la librería requests
  • La librería requests es mucho más fácil y entendible, por ellos es mucho más usada hoy en día.

separador_dos

bs4

Usando la libreria Beautifulsoup

Esta libreria nos permitirá parsea el html obtenido por solicitud con la libreria requests, la idea básica es que beautifulsoup nos permitirá realizar con mayor rapidez y facilidad la identificación de los datos que se obtienen al realizar solicitudes de url's, para más información visita este link

In [1]:
from bs4 import BeautifulSoup
import requests
dir(BeautifulSoup)
Out[1]:
['ASCII_SPACES',
 'DEFAULT_BUILDER_FEATURES',
 'NO_PARSER_SPECIFIED_WARNING',
 'ROOT_TAG_NAME',
 '__bool__',
 '__call__',
 '__class__',
 '__contains__',
 '__copy__',
 '__delattr__',
 '__delitem__',
 '__dict__',
 '__dir__',
 '__doc__',
 '__eq__',
 '__format__',
 '__ge__',
 '__getattr__',
 '__getattribute__',
 '__getitem__',
 '__getstate__',
 '__gt__',
 '__hash__',
 '__init__',
 '__init_subclass__',
 '__iter__',
 '__le__',
 '__len__',
 '__lt__',
 '__module__',
 '__ne__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__setattr__',
 '__setitem__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 '__unicode__',
 '__weakref__',
 '_all_strings',
 '_check_markup_is_url',
 '_feed',
 '_find_all',
 '_find_one',
 '_is_xml',
 '_lastRecursiveChild',
 '_last_descendant',
 '_linkage_fixer',
 '_popToTag',
 '_should_pretty_print',
 'append',
 'childGenerator',
 'children',
 'clear',
 'decode',
 'decode_contents',
 'decompose',
 'descendants',
 'encode',
 'encode_contents',
 'endData',
 'extend',
 'extract',
 'fetchNextSiblings',
 'fetchParents',
 'fetchPrevious',
 'fetchPreviousSiblings',
 'find',
 'findAll',
 'findAllNext',
 'findAllPrevious',
 'findChild',
 'findChildren',
 'findNext',
 'findNextSibling',
 'findNextSiblings',
 'findParent',
 'findParents',
 'findPrevious',
 'findPreviousSibling',
 'findPreviousSiblings',
 'find_all',
 'find_all_next',
 'find_all_previous',
 'find_next',
 'find_next_sibling',
 'find_next_siblings',
 'find_parent',
 'find_parents',
 'find_previous',
 'find_previous_sibling',
 'find_previous_siblings',
 'format_string',
 'formatter_for_name',
 'get',
 'getText',
 'get_attribute_list',
 'get_text',
 'handle_data',
 'handle_endtag',
 'handle_starttag',
 'has_attr',
 'has_key',
 'index',
 'insert',
 'insert_after',
 'insert_before',
 'isSelfClosing',
 'is_empty_element',
 'new_string',
 'new_tag',
 'next',
 'nextGenerator',
 'nextSibling',
 'nextSiblingGenerator',
 'next_elements',
 'next_siblings',
 'object_was_parsed',
 'parentGenerator',
 'parents',
 'parserClass',
 'popTag',
 'prettify',
 'previous',
 'previousGenerator',
 'previousSibling',
 'previousSiblingGenerator',
 'previous_elements',
 'previous_siblings',
 'pushTag',
 'recursiveChildGenerator',
 'renderContents',
 'replaceWith',
 'replaceWithChildren',
 'replace_with',
 'replace_with_children',
 'reset',
 'select',
 'select_one',
 'setup',
 'smooth',
 'string',
 'strings',
 'stripped_strings',
 'text',
 'unwrap',
 'wrap']
In [7]:
help(BeautifulSoup)
Help on class BeautifulSoup in module bs4:

class BeautifulSoup(bs4.element.Tag)
 |  BeautifulSoup(markup='', features=None, builder=None, parse_only=None, from_encoding=None, exclude_encodings=None, **kwargs)
 |  
 |  This class defines the basic interface called by the tree builders.
 |  
 |  These methods will be called by the parser:
 |    reset()
 |    feed(markup)
 |  
 |  The tree builder may call these methods from its feed() implementation:
 |    handle_starttag(name, attrs) # See note about return value
 |    handle_endtag(name)
 |    handle_data(data) # Appends to the current data node
 |    endData(containerClass=NavigableString) # Ends the current data node
 |  
 |  No matter how complicated the underlying parser is, you should be
 |  able to build a tree using 'start tag' events, 'end tag' events,
 |  'data' events, and "done with data" events.
 |  
 |  If you encounter an empty-element tag (aka a self-closing tag,
 |  like HTML's <br> tag), call handle_starttag and then
 |  handle_endtag.
 |  
 |  Method resolution order:
 |      BeautifulSoup
 |      bs4.element.Tag
 |      bs4.element.PageElement
 |      builtins.object
 |  
 |  Methods defined here:
 |  
 |  __copy__(self)
 |      A copy of a Tag is a new Tag, unconnected to the parse tree.
 |      Its contents are a copy of the old Tag's contents.
 |  
 |  __getstate__(self)
 |  
 |  __init__(self, markup='', features=None, builder=None, parse_only=None, from_encoding=None, exclude_encodings=None, **kwargs)
 |      Constructor.
 |      
 |      :param markup: A string or a file-like object representing
 |      markup to be parsed.
 |      
 |      :param features: Desirable features of the parser to be used. This
 |      may be the name of a specific parser ("lxml", "lxml-xml",
 |      "html.parser", or "html5lib") or it may be the type of markup
 |      to be used ("html", "html5", "xml"). It's recommended that you
 |      name a specific parser, so that Beautiful Soup gives you the
 |      same results across platforms and virtual environments.
 |      
 |      :param builder: A TreeBuilder subclass to instantiate (or
 |      instance to use) instead of looking one up based on
 |      `features`. You only need to use this if you've implemented a
 |      custom TreeBuilder.
 |      
 |      :param parse_only: A SoupStrainer. Only parts of the document
 |      matching the SoupStrainer will be considered. This is useful
 |      when parsing part of a document that would otherwise be too
 |      large to fit into memory.
 |      
 |      :param from_encoding: A string indicating the encoding of the
 |      document to be parsed. Pass this in if Beautiful Soup is
 |      guessing wrongly about the document's encoding.
 |      
 |      :param exclude_encodings: A list of strings indicating
 |      encodings known to be wrong. Pass this in if you don't know
 |      the document's encoding but you know Beautiful Soup's guess is
 |      wrong.
 |      
 |      :param kwargs: For backwards compatibility purposes, the
 |      constructor accepts certain keyword arguments used in
 |      Beautiful Soup 3. None of these arguments do anything in
 |      Beautiful Soup 4; they will result in a warning and then be ignored.
 |      
 |      Apart from this, any keyword arguments passed into the BeautifulSoup
 |      constructor are propagated to the TreeBuilder constructor. This
 |      makes it possible to configure a TreeBuilder beyond saying
 |      which one to use.
 |  
 |  decode(self, pretty_print=False, eventual_encoding='utf-8', formatter='minimal')
 |      Returns a string or Unicode representation of this document.
 |      To get Unicode, pass None for encoding.
 |  
 |  endData(self, containerClass=<class 'bs4.element.NavigableString'>)
 |  
 |  handle_data(self, data)
 |  
 |  handle_endtag(self, name, nsprefix=None)
 |  
 |  handle_starttag(self, name, namespace, nsprefix, attrs)
 |      Push a start tag on to the stack.
 |      
 |      If this method returns None, the tag was rejected by the
 |      SoupStrainer. You should proceed as if the tag had not occurred
 |      in the document. For instance, if this was a self-closing tag,
 |      don't call handle_endtag.
 |  
 |  insert_after(self, successor)
 |      Makes the given element(s) the immediate successor of this one.
 |      
 |      The elements will have the same parent, and the given elements
 |      will be immediately after this one.
 |  
 |  insert_before(self, successor)
 |      Makes the given element(s) the immediate predecessor of this one.
 |      
 |      The elements will have the same parent, and the given elements
 |      will be immediately before this one.
 |  
 |  new_string(self, s, subclass=<class 'bs4.element.NavigableString'>)
 |      Create a new NavigableString associated with this soup.
 |  
 |  new_tag(self, name, namespace=None, nsprefix=None, attrs={}, **kwattrs)
 |      Create a new tag associated with this soup.
 |  
 |  object_was_parsed(self, o, parent=None, most_recent_element=None)
 |      Add an object to the parse tree.
 |  
 |  popTag(self)
 |  
 |  pushTag(self, tag)
 |  
 |  reset(self)
 |  
 |  ----------------------------------------------------------------------
 |  Data and other attributes defined here:
 |  
 |  ASCII_SPACES = ' \n\t\x0c\r'
 |  
 |  DEFAULT_BUILDER_FEATURES = ['html', 'fast']
 |  
 |  NO_PARSER_SPECIFIED_WARNING = 'No parser was explicitly specified, so ...
 |  
 |  ROOT_TAG_NAME = '[document]'
 |  
 |  ----------------------------------------------------------------------
 |  Methods inherited from bs4.element.Tag:
 |  
 |  __bool__(self)
 |      A tag is non-None even if it has no contents.
 |  
 |  __call__(self, *args, **kwargs)
 |      Calling a tag like a function is the same as calling its
 |      find_all() method. Eg. tag('a') returns a list of all the A tags
 |      found within this tag.
 |  
 |  __contains__(self, x)
 |  
 |  __delitem__(self, key)
 |      Deleting tag[key] deletes all 'key' attributes for the tag.
 |  
 |  __eq__(self, other)
 |      Returns true iff this tag has the same name, the same attributes,
 |      and the same contents (recursively) as the given tag.
 |  
 |  __getattr__(self, tag)
 |  
 |  __getitem__(self, key)
 |      tag[key] returns the value of the 'key' attribute for the tag,
 |      and throws an exception if it's not there.
 |  
 |  __hash__(self)
 |      Return hash(self).
 |  
 |  __iter__(self)
 |      Iterating over a tag iterates over its contents.
 |  
 |  __len__(self)
 |      The length of a tag is the length of its list of contents.
 |  
 |  __ne__(self, other)
 |      Returns true iff this tag is not identical to the other tag,
 |      as defined in __eq__.
 |  
 |  __repr__ = __unicode__(self)
 |  
 |  __setitem__(self, key, value)
 |      Setting tag[key] sets the value of the 'key' attribute for the
 |      tag.
 |  
 |  __str__ = __unicode__(self)
 |  
 |  __unicode__(self)
 |  
 |  childGenerator(self)
 |      # Old names for backwards compatibility
 |  
 |  clear(self, decompose=False)
 |      Extract all children. If decompose is True, decompose instead.
 |  
 |  decode_contents(self, indent_level=None, eventual_encoding='utf-8', formatter='minimal')
 |      Renders the contents of this tag as a Unicode string.
 |      
 |      :param indent_level: Each line of the rendering will be
 |         indented this many spaces.
 |      
 |      :param eventual_encoding: The tag is destined to be
 |         encoded into this encoding. decode_contents() is _not_
 |         responsible for performing that encoding. This information
 |         is passed in so that it can be substituted in if the
 |         document contains a <META> tag that mentions the document's
 |         encoding.
 |      
 |      :param formatter: A Formatter object, or a string naming one of
 |          the standard Formatters.
 |  
 |  decompose(self)
 |      Recursively destroys the contents of this tree.
 |  
 |  encode(self, encoding='utf-8', indent_level=None, formatter='minimal', errors='xmlcharrefreplace')
 |  
 |  encode_contents(self, indent_level=None, encoding='utf-8', formatter='minimal')
 |      Renders the contents of this tag as a bytestring.
 |      
 |      :param indent_level: Each line of the rendering will be
 |         indented this many spaces.
 |      
 |      :param eventual_encoding: The bytestring will be in this encoding.
 |      
 |      :param formatter: The output formatter responsible for converting
 |         entities to Unicode characters.
 |  
 |  find(self, name=None, attrs={}, recursive=True, text=None, **kwargs)
 |      Return only the first child of this Tag matching the given
 |      criteria.
 |  
 |  findAll = find_all(self, name=None, attrs={}, recursive=True, text=None, limit=None, **kwargs)
 |  
 |  findChild = find(self, name=None, attrs={}, recursive=True, text=None, **kwargs)
 |  
 |  findChildren = find_all(self, name=None, attrs={}, recursive=True, text=None, limit=None, **kwargs)
 |  
 |  find_all(self, name=None, attrs={}, recursive=True, text=None, limit=None, **kwargs)
 |      Extracts a list of Tag objects that match the given
 |      criteria.  You can specify the name of the Tag and any
 |      attributes you want the Tag to have.
 |      
 |      The value of a key-value pair in the 'attrs' map can be a
 |      string, a list of strings, a regular expression object, or a
 |      callable that takes a string and returns whether or not the
 |      string matches for some custom definition of 'matches'. The
 |      same is true of the tag name.
 |  
 |  get(self, key, default=None)
 |      Returns the value of the 'key' attribute for the tag, or
 |      the value given for 'default' if it doesn't have that
 |      attribute.
 |  
 |  getText = get_text(self, separator='', strip=False, types=(<class 'bs4.element.NavigableString'>, <class 'bs4.element.CData'>))
 |  
 |  get_attribute_list(self, key, default=None)
 |      The same as get(), but always returns a list.
 |  
 |  get_text(self, separator='', strip=False, types=(<class 'bs4.element.NavigableString'>, <class 'bs4.element.CData'>))
 |      Get all child strings, concatenated using the given separator.
 |  
 |  has_attr(self, key)
 |  
 |  has_key(self, key)
 |      This was kind of misleading because has_key() (attributes)
 |      was different from __in__ (contents). has_key() is gone in
 |      Python 3, anyway.
 |  
 |  index(self, element)
 |      Find the index of a child by identity, not value. Avoids issues with
 |      tag.contents.index(element) getting the index of equal elements.
 |  
 |  prettify(self, encoding=None, formatter='minimal')
 |  
 |  recursiveChildGenerator(self)
 |  
 |  renderContents(self, encoding='utf-8', prettyPrint=False, indentLevel=0)
 |      # Old method for BS3 compatibility
 |  
 |  select(self, selector, namespaces=None, limit=None, **kwargs)
 |      Perform a CSS selection operation on the current element.
 |      
 |      This uses the SoupSieve library.
 |      
 |      :param selector: A string containing a CSS selector.
 |      
 |      :param namespaces: A dictionary mapping namespace prefixes
 |      used in the CSS selector to namespace URIs. By default,
 |      Beautiful Soup will use the prefixes it encountered while
 |      parsing the document.
 |      
 |      :param limit: After finding this number of results, stop looking.
 |      
 |      :param kwargs: Any extra arguments you'd like to pass in to
 |      soupsieve.select().
 |  
 |  select_one(self, selector, namespaces=None, **kwargs)
 |      Perform a CSS selection operation on the current element.
 |  
 |  smooth(self)
 |      Smooth out this element's children by consolidating consecutive strings.
 |      
 |      This makes pretty-printed output look more natural following a
 |      lot of operations that modified the tree.
 |  
 |  ----------------------------------------------------------------------
 |  Data descriptors inherited from bs4.element.Tag:
 |  
 |  children
 |  
 |  descendants
 |  
 |  isSelfClosing
 |      Is this tag an empty-element tag? (aka a self-closing tag)
 |      
 |      A tag that has contents is never an empty-element tag.
 |      
 |      A tag that has no contents may or may not be an empty-element
 |      tag. It depends on the builder used to create the tag. If the
 |      builder has a designated list of empty-element tags, then only
 |      a tag whose name shows up in that list is considered an
 |      empty-element tag.
 |      
 |      If the builder has no designated list of empty-element tags,
 |      then any tag with no contents is an empty-element tag.
 |  
 |  is_empty_element
 |      Is this tag an empty-element tag? (aka a self-closing tag)
 |      
 |      A tag that has contents is never an empty-element tag.
 |      
 |      A tag that has no contents may or may not be an empty-element
 |      tag. It depends on the builder used to create the tag. If the
 |      builder has a designated list of empty-element tags, then only
 |      a tag whose name shows up in that list is considered an
 |      empty-element tag.
 |      
 |      If the builder has no designated list of empty-element tags,
 |      then any tag with no contents is an empty-element tag.
 |  
 |  parserClass
 |  
 |  string
 |      Convenience property to get the single string within this tag.
 |      
 |      :Return: If this tag has a single string child, return value
 |       is that string. If this tag has no children, or more than one
 |       child, return value is None. If this tag has one child tag,
 |       return value is the 'string' attribute of the child tag,
 |       recursively.
 |  
 |  strings
 |      Yield all strings of certain classes, possibly stripping them.
 |      
 |      By default, yields only NavigableString and CData objects. So
 |      no comments, processing instructions, etc.
 |  
 |  stripped_strings
 |  
 |  text
 |      Get all child strings, concatenated using the given separator.
 |  
 |  ----------------------------------------------------------------------
 |  Methods inherited from bs4.element.PageElement:
 |  
 |  append(self, tag)
 |      Appends the given tag to the contents of this tag.
 |  
 |  extend(self, tags)
 |      Appends the given tags to the contents of this tag.
 |  
 |  extract(self)
 |      Destructively rips this element out of the tree.
 |  
 |  fetchNextSiblings = find_next_siblings(self, name=None, attrs={}, text=None, limit=None, **kwargs)
 |  
 |  fetchParents = find_parents(self, name=None, attrs={}, limit=None, **kwargs)
 |  
 |  fetchPrevious = find_all_previous(self, name=None, attrs={}, text=None, limit=None, **kwargs)
 |  
 |  fetchPreviousSiblings = find_previous_siblings(self, name=None, attrs={}, text=None, limit=None, **kwargs)
 |  
 |  findAllNext = find_all_next(self, name=None, attrs={}, text=None, limit=None, **kwargs)
 |  
 |  findAllPrevious = find_all_previous(self, name=None, attrs={}, text=None, limit=None, **kwargs)
 |  
 |  findNext = find_next(self, name=None, attrs={}, text=None, **kwargs)
 |  
 |  findNextSibling = find_next_sibling(self, name=None, attrs={}, text=None, **kwargs)
 |  
 |  findNextSiblings = find_next_siblings(self, name=None, attrs={}, text=None, limit=None, **kwargs)
 |  
 |  findParent = find_parent(self, name=None, attrs={}, **kwargs)
 |  
 |  findParents = find_parents(self, name=None, attrs={}, limit=None, **kwargs)
 |  
 |  findPrevious = find_previous(self, name=None, attrs={}, text=None, **kwargs)
 |  
 |  findPreviousSibling = find_previous_sibling(self, name=None, attrs={}, text=None, **kwargs)
 |  
 |  findPreviousSiblings = find_previous_siblings(self, name=None, attrs={}, text=None, limit=None, **kwargs)
 |  
 |  find_all_next(self, name=None, attrs={}, text=None, limit=None, **kwargs)
 |      Returns all items that match the given criteria and appear
 |      after this Tag in the document.
 |  
 |  find_all_previous(self, name=None, attrs={}, text=None, limit=None, **kwargs)
 |      Returns all items that match the given criteria and appear
 |      before this Tag in the document.
 |  
 |  find_next(self, name=None, attrs={}, text=None, **kwargs)
 |      Returns the first item that matches the given criteria and
 |      appears after this Tag in the document.
 |  
 |  find_next_sibling(self, name=None, attrs={}, text=None, **kwargs)
 |      Returns the closest sibling to this Tag that matches the
 |      given criteria and appears after this Tag in the document.
 |  
 |  find_next_siblings(self, name=None, attrs={}, text=None, limit=None, **kwargs)
 |      Returns the siblings of this Tag that match the given
 |      criteria and appear after this Tag in the document.
 |  
 |  find_parent(self, name=None, attrs={}, **kwargs)
 |      Returns the closest parent of this Tag that matches the given
 |      criteria.
 |  
 |  find_parents(self, name=None, attrs={}, limit=None, **kwargs)
 |      Returns the parents of this Tag that match the given
 |      criteria.
 |  
 |  find_previous(self, name=None, attrs={}, text=None, **kwargs)
 |      Returns the first item that matches the given criteria and
 |      appears before this Tag in the document.
 |  
 |  find_previous_sibling(self, name=None, attrs={}, text=None, **kwargs)
 |      Returns the closest sibling to this Tag that matches the
 |      given criteria and appears before this Tag in the document.
 |  
 |  find_previous_siblings(self, name=None, attrs={}, text=None, limit=None, **kwargs)
 |      Returns the siblings of this Tag that match the given
 |      criteria and appear before this Tag in the document.
 |  
 |  format_string(self, s, formatter)
 |      Format the given string using the given formatter.
 |  
 |  formatter_for_name(self, formatter)
 |      Look up or create a Formatter for the given identifier,
 |      if necessary.
 |      
 |      :param formatter: Can be a Formatter object (used as-is), a
 |      function (used as the entity substitution hook for an
 |      XMLFormatter or HTMLFormatter), or a string (used to look up
 |      an XMLFormatter or HTMLFormatter in the appropriate registry.
 |  
 |  insert(self, position, new_child)
 |  
 |  nextGenerator(self)
 |      # Old non-property versions of the generators, for backwards
 |      # compatibility with BS3.
 |  
 |  nextSiblingGenerator(self)
 |  
 |  parentGenerator(self)
 |  
 |  previousGenerator(self)
 |  
 |  previousSiblingGenerator(self)
 |  
 |  replaceWith = replace_with(self, replace_with)
 |  
 |  replaceWithChildren = unwrap(self)
 |  
 |  replace_with(self, replace_with)
 |  
 |  replace_with_children = unwrap(self)
 |  
 |  setup(self, parent=None, previous_element=None, next_element=None, previous_sibling=None, next_sibling=None)
 |      Sets up the initial relations between this element and
 |      other elements.
 |  
 |  unwrap(self)
 |  
 |  wrap(self, wrap_inside)
 |  
 |  ----------------------------------------------------------------------
 |  Data descriptors inherited from bs4.element.PageElement:
 |  
 |  __dict__
 |      dictionary for instance variables (if defined)
 |  
 |  __weakref__
 |      list of weak references to the object (if defined)
 |  
 |  next
 |  
 |  nextSibling
 |  
 |  next_elements
 |  
 |  next_siblings
 |  
 |  parents
 |  
 |  previous
 |  
 |  previousSibling
 |  
 |  previous_elements
 |  
 |  previous_siblings

In [2]:
respuesta = requests.get('http://toscrape.com/')
print(respuesta.ok)
print(respuesta.status_code)
True
200
In [3]:
html_file = respuesta.text
#print(html_file)
print(type(html_file))
<class 'str'>

Primer paramétro, es el archivo que se quiere parsear, el segundo es el método de parseo.

In [8]:
soup = BeautifulSoup(html_file,'lxml')
#En el segundo parámetro también se puede usar 'html.parser'
In [9]:
print(soup)
<!DOCTYPE html>
<html lang="en">
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<title>Scraping Sandbox</title>
<link href="./css/bootstrap.min.css" rel="stylesheet"/>
<link href="./css/main.css" rel="stylesheet"/>
</head>
<body>
<div class="container">
<div class="row">
<div class="col-md-1"></div>
<div class="col-md-10 well">
<img class="logo" src="img/sh-logo.png" width="200px"/>
<h1 class="text-right">Web Scraping Sandbox</h1>
</div>
</div>
<div class="row">
<div class="col-md-1"></div>
<div class="col-md-10">
<h2>Books</h2>
<p>A <a href="http://books.toscrape.com">fictional bookstore</a> that desperately wants to be scraped. It's a safe place for beginners learning web scraping and for developers validating their scraping technologies as well. Available at: <a href="http://books.toscrape.com">books.toscrape.com</a></p>
<div class="col-md-6">
<a href="http://books.toscrape.com"><img class="img-thumbnail" src="./img/books.png"/></a>
</div>
<div class="col-md-6">
<table class="table table-hover">
<tr><th colspan="2">Details</th></tr>
<tr><td>Amount of items </td><td>1000</td></tr>
<tr><td>Pagination </td><td>✔</td></tr>
<tr><td>Items per page </td><td>max 20</td></tr>
<tr><td>Requires JavaScript </td><td>✘</td></tr>
</table>
</div>
</div>
</div>
<div class="row">
<div class="col-md-1"></div>
<div class="col-md-10">
<h2>Quotes</h2>
<p><a href="http://quotes.toscrape.com/">A website</a> that lists quotes from famous people. It has many endpoints showing the quotes in many different ways, each of them including new scraping challenges for you, as described below.</p>
<div class="col-md-6">
<a href="http://quotes.toscrape.com"><img class="img-thumbnail" src="./img/quotes.png"/></a>
</div>
<div class="col-md-6">
<table class="table table-hover">
<tr><th colspan="2">Endpoints</th></tr>
<tr><td><a href="http://quotes.toscrape.com/">Default</a></td><td>Microdata and pagination</td></tr>
<tr><td><a href="http://quotes.toscrape.com/scroll">Scroll</a> </td><td>infinite scrolling pagination</td></tr>
<tr><td><a href="http://quotes.toscrape.com/js">JavaScript</a> </td><td>JavaScript generated content</td></tr>
<tr><td><a href="http://quotes.toscrape.com/tableful">Tableful</a> </td><td>a table based messed-up layout</td></tr>
<tr><td><a href="http://quotes.toscrape.com/login">Login</a> </td><td>login with CSRF token (any user/passwd works)</td></tr>
<tr><td><a href="http://quotes.toscrape.com/search.aspx">ViewState</a> </td><td>an AJAX based filter form with ViewStates</td></tr>
<tr><td><a href="http://quotes.toscrape.com/random">Random</a> </td><td>a single random quote</td></tr>
</table>
</div>
</div>
</div>
</div>
</body>
</html>

Forma mucho más legible del documento solicitado

In [11]:
print(type(soup))
<class 'bs4.BeautifulSoup'>

Obtener el titulo del html solicitado

In [10]:
title = soup.title
print(title)
<title>Scraping Sandbox</title>
In [11]:
title_text = soup.title.text
print(title_text)
Scraping Sandbox

Buscando un tag en especifico, este método retornara el primer tag que halle, por ejemplo:

In [12]:
tag = soup.div
print(tag)
<div class="container">
<div class="row">
<div class="col-md-1"></div>
<div class="col-md-10 well">
<img class="logo" src="img/sh-logo.png" width="200px"/>
<h1 class="text-right">Web Scraping Sandbox</h1>
</div>
</div>
<div class="row">
<div class="col-md-1"></div>
<div class="col-md-10">
<h2>Books</h2>
<p>A <a href="http://books.toscrape.com">fictional bookstore</a> that desperately wants to be scraped. It's a safe place for beginners learning web scraping and for developers validating their scraping technologies as well. Available at: <a href="http://books.toscrape.com">books.toscrape.com</a></p>
<div class="col-md-6">
<a href="http://books.toscrape.com"><img class="img-thumbnail" src="./img/books.png"/></a>
</div>
<div class="col-md-6">
<table class="table table-hover">
<tr><th colspan="2">Details</th></tr>
<tr><td>Amount of items </td><td>1000</td></tr>
<tr><td>Pagination </td><td>✔</td></tr>
<tr><td>Items per page </td><td>max 20</td></tr>
<tr><td>Requires JavaScript </td><td>✘</td></tr>
</table>
</div>
</div>
</div>
<div class="row">
<div class="col-md-1"></div>
<div class="col-md-10">
<h2>Quotes</h2>
<p><a href="http://quotes.toscrape.com/">A website</a> that lists quotes from famous people. It has many endpoints showing the quotes in many different ways, each of them including new scraping challenges for you, as described below.</p>
<div class="col-md-6">
<a href="http://quotes.toscrape.com"><img class="img-thumbnail" src="./img/quotes.png"/></a>
</div>
<div class="col-md-6">
<table class="table table-hover">
<tr><th colspan="2">Endpoints</th></tr>
<tr><td><a href="http://quotes.toscrape.com/">Default</a></td><td>Microdata and pagination</td></tr>
<tr><td><a href="http://quotes.toscrape.com/scroll">Scroll</a> </td><td>infinite scrolling pagination</td></tr>
<tr><td><a href="http://quotes.toscrape.com/js">JavaScript</a> </td><td>JavaScript generated content</td></tr>
<tr><td><a href="http://quotes.toscrape.com/tableful">Tableful</a> </td><td>a table based messed-up layout</td></tr>
<tr><td><a href="http://quotes.toscrape.com/login">Login</a> </td><td>login with CSRF token (any user/passwd works)</td></tr>
<tr><td><a href="http://quotes.toscrape.com/search.aspx">ViewState</a> </td><td>an AJAX based filter form with ViewStates</td></tr>
<tr><td><a href="http://quotes.toscrape.com/random">Random</a> </td><td>a single random quote</td></tr>
</table>
</div>
</div>
</div>
</div>

Otro método posible es:

In [37]:
searching = soup.find('div', class_='row')
print(searching)
<div class="row">
<div class="col-md-1"></div>
<div class="col-md-10 well">
<img class="logo" src="img/sh-logo.png" width="200px"/>
<h1 class="text-right">Web Scraping Sandbox</h1>
</div>
</div>
In [35]:
help(soup.find)
Help on method find in module bs4.element:

find(name=None, attrs={}, recursive=True, text=None, **kwargs) method of bs4.BeautifulSoup instance
    Return only the first child of this Tag matching the given
    criteria.

In [40]:
tabla = soup.table
print(tabla)
<table class="table table-hover">
<tr><th colspan="2">Details</th></tr>
<tr><td>Amount of items </td><td>1000</td></tr>
<tr><td>Pagination </td><td>✔</td></tr>
<tr><td>Items per page </td><td>max 20</td></tr>
<tr><td>Requires JavaScript </td><td>✘</td></tr>
</table>
In [43]:
paragrafo = soup.p
print("The frist paragrafer is: ")
print(paragrafo.text)
The frist paragrafer is: 
A fictional bookstore that desperately wants to be scraped. It's a safe place for beginners learning web scraping and for developers validating their scraping technologies as well. Available at: books.toscrape.com

Como abrá notado estos métodos retornan el primer tag que hallan, para retornar todos los tag's que existan en el archivo html se deberá usar el método .findall(file, class='clase')

In [16]:
links = soup.find_all('a')
print(links)
[<a href="http://books.toscrape.com">fictional bookstore</a>, <a href="http://books.toscrape.com">books.toscrape.com</a>, <a href="http://books.toscrape.com"><img class="img-thumbnail" src="./img/books.png"/></a>, <a href="http://quotes.toscrape.com/">A website</a>, <a href="http://quotes.toscrape.com"><img class="img-thumbnail" src="./img/quotes.png"/></a>, <a href="http://quotes.toscrape.com/">Default</a>, <a href="http://quotes.toscrape.com/scroll">Scroll</a>, <a href="http://quotes.toscrape.com/js">JavaScript</a>, <a href="http://quotes.toscrape.com/tableful">Tableful</a>, <a href="http://quotes.toscrape.com/login">Login</a>, <a href="http://quotes.toscrape.com/search.aspx">ViewState</a>, <a href="http://quotes.toscrape.com/random">Random</a>]
In [25]:
for link in links:
    print(link)
<a href="http://books.toscrape.com">fictional bookstore</a>
<a href="http://books.toscrape.com">books.toscrape.com</a>
<a href="http://books.toscrape.com"><img class="img-thumbnail" src="./img/books.png"/></a>
<a href="http://quotes.toscrape.com/">A website</a>
<a href="http://quotes.toscrape.com"><img class="img-thumbnail" src="./img/quotes.png"/></a>
<a href="http://quotes.toscrape.com/">Default</a>
<a href="http://quotes.toscrape.com/scroll">Scroll</a>
<a href="http://quotes.toscrape.com/js">JavaScript</a>
<a href="http://quotes.toscrape.com/tableful">Tableful</a>
<a href="http://quotes.toscrape.com/login">Login</a>
<a href="http://quotes.toscrape.com/search.aspx">ViewState</a>
<a href="http://quotes.toscrape.com/random">Random</a>

otra forma sería:

In [31]:
for link in soup.find_all('a'):
    print(link)
<a href="http://books.toscrape.com">fictional bookstore</a>
<a href="http://books.toscrape.com">books.toscrape.com</a>
<a href="http://books.toscrape.com"><img class="img-thumbnail" src="./img/books.png"/></a>
<a href="http://quotes.toscrape.com/">A website</a>
<a href="http://quotes.toscrape.com"><img class="img-thumbnail" src="./img/quotes.png"/></a>
<a href="http://quotes.toscrape.com/">Default</a>
<a href="http://quotes.toscrape.com/scroll">Scroll</a>
<a href="http://quotes.toscrape.com/js">JavaScript</a>
<a href="http://quotes.toscrape.com/tableful">Tableful</a>
<a href="http://quotes.toscrape.com/login">Login</a>
<a href="http://quotes.toscrape.com/search.aspx">ViewState</a>
<a href="http://quotes.toscrape.com/random">Random</a>

Veamos cuantos parragrafos tiene nuestro html:

In [76]:
for p in soup.find_all('p'):
    print(p.text)
    print("\n")
A fictional bookstore that desperately wants to be scraped. It's a safe place for beginners learning web scraping and for developers validating their scraping technologies as well. Available at: books.toscrape.com


A website that lists quotes from famous people. It has many endpoints showing the quotes in many different ways, each of them including new scraping challenges for you, as described below.


Hagamos algo de Scraping a la siguiente paguina web

  1. Realizar la solicitud de la url
In [94]:
src = requests.get('https://coreyms.com/')
respuesta = src.text if(src.ok) else "Respuesta no recibida"
  1. Realizar el parseo:
In [95]:
soup = BeautifulSoup(respuesta,'lxml')
print(soup.prettify)
<bound method Tag.prettify of <!DOCTYPE html>
<html lang="en-US">
<head>
<meta charset="utf-8"/>
<meta content="width=device-width, initial-scale=1" name="viewport"/>
<title>CoreyMS - Development, Design, DIY, and more</title>
<!-- This site is optimized with the Yoast SEO plugin v12.4 - https://yoast.com/wordpress/plugins/seo/ -->
<meta content="Development, Design, DIY, and more" name="description"/>
<meta content="max-snippet:-1, max-image-preview:large, max-video-preview:-1" name="robots"/>
<link href="https://coreyms.com/" rel="canonical"/>
<link href="http://coreyms.com/page/2" rel="next"/>
<meta content="en_US" property="og:locale"/>
<meta content="website" property="og:type"/>
<meta content="CoreyMS - Development, Design, DIY, and more" property="og:title"/>
<meta content="Development, Design, DIY, and more" property="og:description"/>
<meta content="https://coreyms.com/" property="og:url"/>
<meta content="CoreyMS" property="og:site_name"/>
<meta content="https://coreyms.com/wp-content/uploads/2014/11/SocialIcon.png" property="og:image"/>
<meta content="https://coreyms.com/wp-content/uploads/2014/11/SocialIcon.png" property="og:image:secure_url"/>
<meta content="800" property="og:image:width"/>
<meta content="800" property="og:image:height"/>
<meta content="summary_large_image" name="twitter:card"/>
<meta content="Development, Design, DIY, and more" name="twitter:description"/>
<meta content="CoreyMS - Development, Design, DIY, and more" name="twitter:title"/>
<meta content="@CoreyMSchafer" name="twitter:site"/>
<meta content="http://coreyms.com/wp-content/uploads/2014/11/SocialIcon.png" name="twitter:image"/>
<meta content="69D01EB6520B2918B78685B21805C977" name="msvalidate.01"/>
<meta content="cWGcd5qKYyguo-9DC8wgwnOjN0_P9bBazUyRTtHohMU" name="google-site-verification"/>
<script class="yoast-schema-graph yoast-schema-graph--main" type="application/ld+json">{"@context":"https://schema.org","@graph":[{"@type":"WebSite","@id":"https://coreyms.com/#website","url":"https://coreyms.com/","name":"CoreyMS","potentialAction":{"@type":"SearchAction","target":"https://coreyms.com/?s={search_term_string}","query-input":"required name=search_term_string"}},{"@type":"CollectionPage","@id":"https://coreyms.com/#webpage","url":"https://coreyms.com/","inLanguage":"en-US","name":"CoreyMS - Development, Design, DIY, and more","isPartOf":{"@id":"https://coreyms.com/#website"},"description":"Development, Design, DIY, and more"}]}</script>
<!-- / Yoast SEO plugin. -->
<link href="//s0.wp.com" rel="dns-prefetch"/>
<link href="//fonts.googleapis.com" rel="dns-prefetch"/>
<link href="//s.w.org" rel="dns-prefetch"/>
<link href="https://coreyms.com/feed" rel="alternate" title="CoreyMS » Feed" type="application/rss+xml"/>
<link href="https://coreyms.com/comments/feed" rel="alternate" title="CoreyMS » Comments Feed" type="application/rss+xml"/>
<script type="text/javascript">
			window._wpemojiSettings = {"baseUrl":"https:\/\/s.w.org\/images\/core\/emoji\/11\/72x72\/","ext":".png","svgUrl":"https:\/\/s.w.org\/images\/core\/emoji\/11\/svg\/","svgExt":".svg","source":{"concatemoji":"https:\/\/coreyms.com\/wp-includes\/js\/wp-emoji-release.min.js?ver=5.0.7"}};
			!function(a,b,c){function d(a,b){var c=String.fromCharCode;l.clearRect(0,0,k.width,k.height),l.fillText(c.apply(this,a),0,0);var d=k.toDataURL();l.clearRect(0,0,k.width,k.height),l.fillText(c.apply(this,b),0,0);var e=k.toDataURL();return d===e}function e(a){var b;if(!l||!l.fillText)return!1;switch(l.textBaseline="top",l.font="600 32px Arial",a){case"flag":return!(b=d([55356,56826,55356,56819],[55356,56826,8203,55356,56819]))&&(b=d([55356,57332,56128,56423,56128,56418,56128,56421,56128,56430,56128,56423,56128,56447],[55356,57332,8203,56128,56423,8203,56128,56418,8203,56128,56421,8203,56128,56430,8203,56128,56423,8203,56128,56447]),!b);case"emoji":return b=d([55358,56760,9792,65039],[55358,56760,8203,9792,65039]),!b}return!1}function f(a){var c=b.createElement("script");c.src=a,c.defer=c.type="text/javascript",b.getElementsByTagName("head")[0].appendChild(c)}var g,h,i,j,k=b.createElement("canvas"),l=k.getContext&&k.getContext("2d");for(j=Array("flag","emoji"),c.supports={everything:!0,everythingExceptFlag:!0},i=0;i<j.length;i++)c.supports[j[i]]=e(j[i]),c.supports.everything=c.supports.everything&&c.supports[j[i]],"flag"!==j[i]&&(c.supports.everythingExceptFlag=c.supports.everythingExceptFlag&&c.supports[j[i]]);c.supports.everythingExceptFlag=c.supports.everythingExceptFlag&&!c.supports.flag,c.DOMReady=!1,c.readyCallback=function(){c.DOMReady=!0},c.supports.everything||(h=function(){c.readyCallback()},b.addEventListener?(b.addEventListener("DOMContentLoaded",h,!1),a.addEventListener("load",h,!1)):(a.attachEvent("onload",h),b.attachEvent("onreadystatechange",function(){"complete"===b.readyState&&c.readyCallback()})),g=c.source||{},g.concatemoji?f(g.concatemoji):g.wpemoji&&g.twemoji&&(f(g.twemoji),f(g.wpemoji)))}(window,document,window._wpemojiSettings);
		</script>
<style type="text/css">
img.wp-smiley,
img.emoji {
	display: inline !important;
	border: none !important;
	box-shadow: none !important;
	height: 1em !important;
	width: 1em !important;
	margin: 0 .07em !important;
	vertical-align: -0.1em !important;
	background: none !important;
	padding: 0 !important;
}
</style>
<link href="https://coreyms.com/wp-content/cache/minify/9d9d8.css" media="all" rel="stylesheet" type="text/css"/>
<link href="//fonts.googleapis.com/css?family=Lato%3A300%2C400%2C700%7CVarela+Round&amp;ver=2.1.2" id="google-fonts-css" media="all" rel="stylesheet" type="text/css"/>
<link href="https://coreyms.com/wp-content/cache/minify/95173.css" media="all" rel="stylesheet" type="text/css"/>
<script src="https://coreyms.com/wp-content/cache/minify/df983.js" type="text/javascript"></script>
<!--[if lt IE 9]>
<script type='text/javascript' src='https://coreyms.com/wp-content/themes/genesis/lib/js/html5shiv.min.js?ver=3.7.3'></script>
<![endif]-->
<link href="https://coreyms.com/wp-json/" rel="https://api.w.org/"/>
<link href="https://coreyms.com/xmlrpc.php?rsd" rel="EditURI" title="RSD" type="application/rsd+xml"/>
<link href="https://coreyms.com/wp-includes/wlwmanifest.xml" rel="wlwmanifest" type="application/wlwmanifest+xml"/>
<meta content="WordPress 5.0.7" name="generator"/>
<style type="text/css"> .enews .screenread {
	height: 1px;
    left: -1000em;
    overflow: hidden;
    position: absolute;
    top: -1000em;
    width: 1px; } </style>
<link href="//v0.wordpress.com" rel="dns-prefetch"/>
<link href="https://coreyms.com/xmlrpc.php" rel="pingback"/>
<link href="https://plus.google.com/+CoreySchafer44/posts" rel="author"/>
<link href="/apple-touch-icon-57x57.png" rel="apple-touch-icon" sizes="57x57"/>
<link href="/apple-touch-icon-114x114.png" rel="apple-touch-icon" sizes="114x114"/>
<link href="/apple-touch-icon-72x72.png" rel="apple-touch-icon" sizes="72x72"/>
<link href="/apple-touch-icon-144x144.png" rel="apple-touch-icon" sizes="144x144"/>
<link href="/apple-touch-icon-60x60.png" rel="apple-touch-icon" sizes="60x60"/>
<link href="/apple-touch-icon-120x120.png" rel="apple-touch-icon" sizes="120x120"/>
<link href="/apple-touch-icon-76x76.png" rel="apple-touch-icon" sizes="76x76"/>
<link href="/apple-touch-icon-152x152.png" rel="apple-touch-icon" sizes="152x152"/>
<link href="/apple-touch-icon-180x180.png" rel="apple-touch-icon" sizes="180x180"/>
<link href="/favicon-192x192.png" rel="icon" sizes="192x192" type="image/png"/>
<link href="/favicon-160x160.png" rel="icon" sizes="160x160" type="image/png"/>
<link href="/favicon-96x96.png" rel="icon" sizes="96x96" type="image/png"/>
<link href="/favicon-16x16.png" rel="icon" sizes="16x16" type="image/png"/>
<link href="/favicon-32x32.png" rel="icon" sizes="32x32" type="image/png"/>
<meta content="#56616b" name="msapplication-TileColor"/>
<meta content="/mstile-144x144.png" name="msapplication-TileImage"/>
<script>
  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
  ga('create', 'UA-53634311-1', 'auto');
  ga('send', 'pageview');
</script></head>
<body class="home blog content-sidebar" itemscope="" itemtype="https://schema.org/WebPage"><div class="site-container"><header class="site-header" itemscope="" itemtype="https://schema.org/WPHeader"><div class="wrap"><div class="title-area"> <div class="site-avatar">
<a href="https://coreyms.com/"><svg class="site-avatar-svg" enable-background="new 0 0 441.5 441.5" height="150px" id="Layer_1" version="1.1" viewbox="0 0 441.5 441.5" width="150px" x="0px" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" y="0px">
<g class="site-avatar-background">
<path d="M79.178 390.133C30.781 349.639 0 288.789 0 220.75C0 98.833 98.833 0 220.75 0S441.5 98.833 441.5 220.75 c0 63.558-26.86 120.842-69.848 161.12" fill="#56616B"></path>
</g>
<g class="site-avatar-foreground">
<path d="M254.602 182.291c0 1.992-0.097 4 0 6c0.057 0.88-0.093 1.952 0.194 2.78c0.22 0.631 0.69 1.12 1.704 1.273 c2.009 0.3 3.436-1.062 4.384-2.719c0.712-1.244 0.863-3.376 1.843-3.807c1.612-0.712 2.646-1.537 3.276-2.44 c1.903-2.732 0.09-6.185-0.723-9.42c-0.29-1.157-1.995-2.036-0.556-3.456c0.801-0.789 1.711-0.981 2.717-0.718 c0.164 0.043 0.33 0.095 0.5 0.162c0.262 0.104 0.505 0.185 0.732 0.249c3.521 0.99 3.182-2.499 3.459-4.337 c0.262-1.728 0.411-3.561-0.128-5.161c-0.413-1.229-1.231-2.321-2.721-3.124c-0.345-0.187-1.271 0.296-1.683 0.7 C260.971 165 252.55 170.8 254.65 182.291H254.602z" fill="#E3E0DD"></path>
<path d="M121.076 185.062c-0.633 2.075-1.555 4.107-1.326 6.3c1.215 11.7 4.9 22.7 10.4 32.958 c1.692 3.201 3.6 6.4 6.3 8.931c6.878 6.299 15.1 11.5 18.3 21.101c0.697 2.1 2.7 3.799 4.1 5.616c0.797 1.101 7.7 7.5 9.9 9.06 c5.75 4 12.2 2.399 18.3 2.701c3.969 0.19 7.635-0.422 10.23-2.799c1.496-1.371 2.638-3.322 3.271-6.056 c0.378-1.636 1.506-3.308 2.812-4.621c0.372-0.374 0.756-0.724 1.144-1.028c0.236-0.187 0.452-0.393 0.683-0.584 c2.745-2.268 5.197-4.824 7.772-7.193c0.196-0.182 0.395-0.361 0.593-0.541c0.263-0.235 0.516-0.484 0.783-0.715 c2.067-1.778 3.228-4.668 5.456-6.357c0.991-0.751 2.192-1.268 3.781-1.339c4.19-0.188 7.815-1.231 10.56-3.522 c2.112-1.764 3.703-4.267 4.627-7.693c0.437-1.615 2.252-2.815 3.221-4.342c1.367-2.154 1.631-5.814-0.541-5.996 c-5.594-0.462-3.601-4.181-3.784-6.851c-0.224-3.178 0.817-6.237 1.688-9.293c2.23-7.859 2.068-15.447-2.718-22.497 c-1.593-2.346-2.862-4.882-3.588-7.658c-0.304-1.159-0.571-2.27 0.562-2.565c0.258-0.067 0.584-0.093 1.002-0.067 c0.979 0.081 2.138 1.205 2.97 0.79c0.196-0.099 0.377-0.282 0.53-0.589c0.812-1.632-0.619-3.176-1.769-4.355 c-1.974-2.029-2.121-3.545 0.03-5.829c4.014-4.26 2.55-9.908-3.036-11.764c-3.315-1.103-5.812-2.844-8.128-5.404 c-3.221-3.559-7.302-6.113-12.188-4.117c-0.077 0.031-0.152 0.054-0.229 0.087c-4.316 1.881-8.25 4.641-12.839 7.3 c5.969 2.5 11.4 4 17.4 3.326c4.219-0.484 7.9 0.8 10.7 4.1c1.021 1.2 1.1 2.8 0.1 4.197c-0.256 0.386-0.549 0.657-0.873 0.774 c-0.367 0.132-0.774 0.069-1.225-0.274c-4.875-3.503-10.354-1.259-15.552-1.665c-1.768-0.138-4.002 0.686-5.052-1.229 c-0.998-1.819-2.014-2.475-3.065-2.466c-1.199 0.009-2.443 0.886-3.757 1.931c-0.647 0.515-1.219 1.372-2.061 1.577 c-0.304 0.074-0.642 0.067-1.033-0.077c-0.107-2.153 2.641-2.457 2.183-4.465c-2.788-0.657-5.483-0.628-8.281 0.466 c-0.928 0.363-1.869 0.849-2.827 1.464c-0.095 0.061-0.188 0.107-0.283 0.17c0.945-3.138 5.419-5.098 0.606-7.558 c-0.949-0.485 0.189-1.66 1.02-2.292c1.043-0.794 2.321-1.519 2.936-2.594c1.521-2.665 3.594-4.347 5.997-5.363 c1.868-0.791 3.936-1.18 6.098-1.316c4.041-0.255 7.759-1.711 11.647-2.479c0.852-0.168 1.606-0.458 2.265-0.854 c1.858-1.119 2.911-3.136 2.915-6.033c0.009-6.685-2.918-12.743-3.582-19.266c-0.12-1.184-1.234-3.36-3.023-2.574 c-3.523 1.548-5.289-0.921-6.55-2.962c-1.631-2.64-3.149-2.745-4.879-1.815c-0.514 0.276-1.045 0.64-1.605 1.06 c-1.044 0.784-1.544 2.183-2.749 2.872c-0.285 0.163-0.596 0.298-0.977 0.362c-0.388-1.862 1.36-2.985 1.44-4.602 c0.051-1.008-0.054-2.516-1.327-1.745c-0.018 0.011-0.031 0.012-0.05 0.024c-0.144 0.092-0.273 0.166-0.403 0.24 c-2.564 1.457-2.537-0.535-2.866-2.284c-0.325-1.727-1.001-3.345-2.837-3.741c-0.406-0.087-0.729-0.082-0.991-0.007 c-1.147 0.325-1.128 1.968-1.773 2.907c-1.611 2.263-3.115 4.664-6.599 7.237c-0.113 0.083-0.21 0.166-0.328 0.25 c2.371-4.847 3.656-8.487 0.458-12.642c-0.07-0.09-0.129-0.18-0.203-0.271c-0.833 4.386-1.515 8.2-4.973 10.605 c-0.093 0.064-0.18 0.133-0.277 0.195c-1.097-1.5 0.22-3.408-1.72-4.438c-0.012-0.006-0.021-0.014-0.032-0.02 c-0.35 0.452-0.84 0.881-1.076 1.4c-1.153 2.642-1.673 3.754-2.146 4.263c-0.381 0.41-0.731 0.431-1.355 0.537 c-3.99 0.632-4.702-1.837-5.834-4.938c-2.642-7.239-9.918-10.402-14.395-6.815c-0.378 0.303-0.743 0.637-1.077 1.039 c-2.435 2.929-4.771 6.612-5.835 10c-1.345 4.336-3.751 6.76-7.148 8.956c-5.305 3.428-8.463 7.855-7.026 14.6 c0.539 2.542-0.675 4.875-1.846 7.1c-1.875 3.597-0.992 5.7 3.3 5.997c1.991 0.1 4 0.5 6 0.553c4.777 0.2 8.7 1.7 12.6 5 c3.784 3.3 6.8 7.3 10.6 10.378c3.999 3.3 5.2 6.9 4.6 11.811c-0.675 6.117-1.21 12.273-1.305 18.4 c-0.06 3.896-0.854 6.795-4.75 8.389c-1.934 0.791-3.424 2.349-2.862 4.699c0.609 2.5 2.7 3.2 5 3.1 c0.5-0.016 1.015-0.126 1.496-0.042c2.554 0.4 5.5 0.6 2.8 4.468c-0.756 1.058-0.791 2.3 0.8 2.8c1.242 0.4 3 0.2 2.5 2.2 c-0.369 1.521-2.162 1.237-3.3 1.809c-0.792 0.397-1.632 0.577-2.505 0.667c-1.329 0.138-2.731 0.069-4.149 0.233 c-1.444 0.167-2.903 0.575-4.315 1.699c0.827 0.264 1.74 0.504 2.708 0.726c8.333 1.914 20.87 2.433 20.086 3.987 c-0.007 0.015-0.021 0.03-0.031 0.045c-0.02 0.031-0.033 0.061-0.063 0.092h0.009v0.051c-4.351 0.46-8.029 1.064-12.392 1.2 c-1.847 0.066-3.692-0.031-4.682 1.264c-0.246 0.323-0.441 0.728-0.568 1.247c-0.572 2.399 1.2 4.101 2.9 5.399 c1.688 1.302 3.7 2.302 5.3 3.7c2.363 1.9 1.9 4.699 0.9 6.913c-0.278 0.625-0.608 0.995-0.969 1.202 c-1.229 0.705-2.845-0.562-4.213-0.901c-3.906-1.047-5.531-4.397-7.769-7.324c-4.868-6.364-7.044-12.982-16.966-15.704 c-0.459-0.125-0.913-0.253-1.406-0.362c-1.632-0.36-1.601-0.026-1.583-2c0.017-1.846 4.917-0.833 6.5-1.333 c5.514-1.741 5.65-2.834 10.5-4.167c3.46-0.951 2.169-6.663 1.322-10.273c-0.003-0.014-0.007-0.029-0.01-0.043 c-0.104-0.441-0.179-0.878-0.232-1.312c-0.361-2.919 0.352-5.695 1.408-8.45c6.845-10.339 3.558-20.753 4.884-23.425 c0.777-1.565 1.148-2.989 1.094-4.267c-0.092-2.177-1.423-3.929-4.123-5.227c-7.634-3.67-15.45-6.876-23.707-8.9 c-1.792-0.439-3.357-0.107-4.359 1.482c-0.006 0.009-0.013 0.016-0.019 0.025c-1.01 1.628-1.361 3.475-0.355 5.2 c0.944 1.6 2.6 1 4 1c5.133-0.093 10.274-0.174 15.4 0.045c3.086 0.1 3.9 1.8 2.4 4.722c-0.343 0.664-0.82 1.233-1.384 1.709 c-2.594 2.19-7.13 2.328-10.065-0.209c-0.722-0.629-1.141-1.751-2.391-1.317c-0.15 0.052-0.262 0.125-0.365 0.204 c-0.378 0.292-0.477 0.754-0.492 1.357c-0.035 1.376-0.479 2.212-1.139 2.757c-1.51 1.246-4.167 0.963-5.775 2.043 c-1.373 0.908-3.125-1.413-3.536-3.282c-0.312-1.417-0.514-2.734-2.291-2.62c-0.586 0.038-1.049 0.236-1.412 0.534 c-0.625 0.514-0.948 1.329-1.06 2.166c-0.39 2.976-0.977 6.3 0.9 8.741C123.411 174.752 122.676 179.853 121.076 185.062z M211.68 211.557c0.16-0.005 0.319-0.011 0.479-0.017c0.196-0.006 0.401-0.005 0.61 0c1.39 0.026 2.971 0.134 3.738-1.328 c0.028-0.053 0.064-0.089 0.09-0.146c0.049-0.119 0.086-0.232 0.113-0.341c0.398-1.586-1.396-2.169-2.316-3.113 c-0.159-0.163-0.322-0.34-0.462-0.523c-0.389-0.508-0.595-1.069 0.001-1.558c0.515-0.422 1.704-0.564 2.294-0.258 c3.199 1.7 4.7 0.5 5.533-2.735c0.286-1.132 1.02-1.809 1.979-1.574c0.325 0.079 0.677 0.262 1.047 0.568 c2.446 2 4.8 4.2 5.601 7.437c0.483 2 0.5 4.07-1.045 5.7c-1.617 1.698-3.396 0.774-5.011-0.143 c-2.403-1.37-4.178-0.281-5.707 1.436c-3.979 4.466-8.223 8.75-11.737 13.601c-3.714 5.086-8.537 5.843-14.104 5.198 c-0.648-0.075-1.368-0.171-1.786-0.653c-0.114-0.131-0.209-0.285-0.27-0.482c-0.37-1.215 0.587-1.834 1.458-2.285 c2.948-1.527 5.975-2.908 8.896-4.486c1.887-1.021 3.851-2.061 5.402-3.496c1.875-1.738 5.248-3.51 4.134-6.221 c-0.141-0.343-0.323-0.6-0.535-0.794c-1.383-1.272-4.106 0.29-6.09 0.26c-4.13-0.028-8.242-0.928-12.342-0.218h-0.023v-0.073 c0.004-0.002 0.008-0.003 0.012-0.005c0.007-0.003 0.014-0.006 0.021-0.009c0.814-0.378 1.633-0.717 2.458-1.021 c2.471-0.91 4.987-1.504 7.531-1.902c0.032-0.005 0.064-0.011 0.096-0.016c0.033-0.005 0.065-0.009 0.098-0.014 C205.084 211.85 208.374 211.669 211.68 211.557z M194.177 187.948c3.15 2.3 4 6 2.9 6.258h-0.062 c-2.208-0.583-2.876-3.92-5.816-4.751c-0.006-0.001-0.012-0.005-0.018-0.007c-3.767-1.083-9.077-8.666-9.81-13.188 c-0.011-0.066-0.031-0.139-0.04-0.204c-0.012-0.087-0.008-0.164-0.016-0.249c-0.02-0.205-0.042-0.413-0.039-0.601 c0-0.001 0-0.001 0-0.002c0.001-0.067 0.017-0.102 0.025-0.152c0.146-0.854 1.329 0.547 2.516 2.208 c1.004 1.406 2.003 2.98 2.358 3.487c0.982 1.393 1.82 2.389 2.686 3.229C190.297 185.367 191.808 186.328 194.177 187.948z" fill="#E3E0DD"></path>
<path d="M397.368 309.241c-0.261-0.421-0.515-0.851-0.789-1.251c-0.119-0.172-0.252-0.329-0.374-0.498 c-0.355-0.493-0.713-0.985-1.097-1.449c-1.061-1.284-2.228-2.461-3.529-3.541c-9.653-8.013-20.562-14.354-29.925-22.777 c-5.18-4.66-11.315-8.287-16.289-13.133c-3.436-3.346-6.821-6.178-11.363-7.746c-12.746-4.402-25.297-9.318-37.806-14.363 c-5.212-2.104-8.992-6.655-14.148-8.286c-5.011-1.585-9.368-3.845-13.188-7.062c-1.195-1.008-2.342-2.103-3.436-3.309 c-0.236-0.263-0.504-0.511-0.797-0.736c-1.041-0.805-2.462-1.286-4.507-0.657c2.625 3 6.2 4.898 6.2 8.75 c0.029 10.375-1.518 20.563-4.211 30.575c-0.283 1.058-0.617 2.509-2.144 2.399c-0.126-0.014-0.231-0.047-0.34-0.078 c-1.058-0.322-1.254-1.564-1.737-2.489c-1.168-2.226 0.229-5.108-1.879-7.075c-4.517-4.214-4.992-10.279-7.05-15.604 c-0.729-1.892 0.104-4.437-2.731-5.277c-0.006-0.003-0.013-0.006-0.021-0.008c-2.953-0.86-3.546 1.873-5.052 3.187 c-8.374 7.295-12.026 18.521-21.318 25.2c-8.297 5.931-16.328 12.183-26.8 13.716c-2.79 0.407-5.649 0.323-8.459 0.627 c-1.733 0.188-3.997-0.093-4.459 2.299c-0.365 1.899 1.1 3.102 2.5 3.949c1.73 1 3.1 2.899 4.7 3.578 c3.386 1.398 2.6 2.698 0.7 4.5c-2.543 2.476-3.724 4.93-0.872 8.198c1.765 2.021-0.304 4.5-1.314 5.711 c-0.307 0.367-0.615 0.511-0.923 0.513c-1.023 0.006-2.039-1.625-2.944-2.394c-0.887-0.75-1.582-1.731-2.484-2.459 c-1.267-1.021-2.576-2.888-4.149-2.603c-0.405 0.072-0.826 0.281-1.27 0.691c-2.076 1.9 0 3.9 1.4 5.602 c4.511 5.563 8.05 11.524 8.194 19.838c0 0.056 0.005 0.106 0.006 0.162c-3.156-2.711-6.338-4.35-8.485-7.479 c-1.777-2.588-3.426-5.543-6.256-7.043c-7.64-4.051-12.329-9.996-14.186-18.574c-1.413-6.529-1.927-13.146-3.01-19.693 c-1.136-6.866-2.037-13.854-5.661-20.014c-2.048-3.479-4.663-4.494-8.15-1.59c-3.831 3.191-7.883 6.066-11.413 9.674 c-8.022 8.195-15.606 17.19-26.436 21.801c-11.449 4.848-17.431 13.926-21.416 24.898c-4.198 11.539-5.315 23.633-6.518 35.768 c-1.136 11.451-1.973 22.699 1.5 34c0.259 0.869 0.56 1.72 0.86 2.569c1.22 3.454 2.781 6.741 4.682 9.873 c0.035 0.03 0.07 0.062 0.105 0.09c0.259 0.216 0.513 0.438 0.773 0.653c38.203 31.621 87.228 50.627 140.694 50.627 c53.438 0 102.44-18.985 140.635-50.577c3.521-2.911 6.94-5.938 10.272-9.06c-2.618-3.158-5.301-6.254-8.485-8.67 c-7.959-6.028-17.794-8.264-27.218-11.09c-0.239-0.071-0.48-0.144-0.719-0.215c-0.01-0.004-0.019-0.006-0.026-0.009 c-0.019-0.006-0.035-0.012-0.054-0.019c-0.25-0.076-0.492-0.154-0.724-0.235c-0.029-0.011-0.058-0.021-0.087-0.032 c-0.207-0.074-0.405-0.148-0.598-0.228c-0.136-0.056-0.261-0.113-0.389-0.171c-0.07-0.031-0.144-0.062-0.21-0.094 c-2.793-1.33-3.677-3.312-2.927-7.151c0.733-3.767 2.284-6.832 4.471-9.828c5.71-7.841 12.521-14.705 19.023-21.845 c7.076-7.768 15.928-13.119 25.398-17.319c7.65-3.396 10.099-2.508 15.7 3.799c0.678 0.8 1.1 2.196 3.093 1.354 c0.002-0.002 0.004-0.002 0.007-0.002C397.742 309.809 397.549 309.533 397.368 309.241z" fill="#E3E0DD"></path>
</g>
</svg></a> </div>
<h1 class="site-title" itemprop="headline"><a href="https://coreyms.com/">CoreyMS</a></h1><p class="site-description" itemprop="description">Development, Design, DIY, and more</p> <div class="social-links-div">
<ul>
<li class="social-links-li">
<a class="social-link social-youtube" href="https://www.youtube.com/user/schafer5">
<svg style="height: 40px; width: 40px;" version="1.1" viewbox="0 0 100 100" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<circle class="outer-shape" cx="50" cy="50" r="48"></circle>
<path class="inner-shape" d="M97.284,26.359c-1-5.352-5.456-9.346-10.574-9.839c-12.221-0.784-24.488-1.42-36.731-1.428 c-12.244-0.007-24.464,0.616-36.687,1.388c-5.137,0.497-9.592,4.47-10.589,9.842C1.567,34.058,1,41.869,1,49.678 s0.568,15.619,1.703,23.355c0.996,5.372,5.451,9.822,10.589,10.314c12.226,0.773,24.439,1.561,36.687,1.561 c12.239,0,24.515-0.688,36.731-1.479c5.118-0.497,9.574-5.079,10.574-10.428C98.43,65.278,99,57.477,99,49.676 C99,41.88,98.428,34.083,97.284,26.359z M38.89,63.747V35.272l26.52,14.238L38.89,63.747z" style="opacity: 1; fill: rgb(255, 255, 255);" transform="translate(25,25) scale(0.5)"></path>
</svg>
</a>
</li>
<li class="social-links-li">
<a class="social-link social-github" href="https://github.com/CoreyMSchafer">
<svg style="height: 40px; width: 40px;" version="1.1" viewbox="0 0 100 100" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<circle class="outer-shape" cx="50" cy="50" r="48"></circle>
<path class="inner-shape" d="M50,1C22.938,1,1,22.938,1,50s21.938,49,49,49s49-21.938,49-49S77.062,1,50,1z M79.099,79.099 c-3.782,3.782-8.184,6.75-13.083,8.823c-1.245,0.526-2.509,0.989-3.79,1.387v-7.344c0-3.86-1.324-6.699-3.972-8.517 c1.659-0.16,3.182-0.383,4.57-0.67c1.388-0.287,2.855-0.702,4.402-1.245c1.547-0.543,2.935-1.189,4.163-1.938 c1.228-0.75,2.409-1.723,3.541-2.919s2.082-2.552,2.847-4.067s1.372-3.334,1.818-5.455c0.446-2.121,0.67-4.458,0.67-7.01 c0-4.945-1.611-9.155-4.833-12.633c1.467-3.828,1.308-7.991-0.478-12.489l-1.197-0.143c-0.829-0.096-2.321,0.255-4.474,1.053 c-2.153,0.798-4.57,2.105-7.249,3.924c-3.797-1.053-7.736-1.579-11.82-1.579c-4.115,0-8.039,0.526-11.772,1.579 c-1.69-1.149-3.294-2.097-4.809-2.847c-1.515-0.75-2.727-1.26-3.637-1.532c-0.909-0.271-1.754-0.439-2.536-0.503 c-0.782-0.064-1.284-0.079-1.507-0.048c-0.223,0.031-0.383,0.064-0.478,0.096c-1.787,4.53-1.946,8.694-0.478,12.489 c-3.222,3.477-4.833,7.688-4.833,12.633c0,2.552,0.223,4.889,0.67,7.01c0.447,2.121,1.053,3.94,1.818,5.455 c0.765,1.515,1.715,2.871,2.847,4.067s2.313,2.169,3.541,2.919c1.228,0.751,2.616,1.396,4.163,1.938 c1.547,0.543,3.014,0.957,4.402,1.245c1.388,0.287,2.911,0.511,4.57,0.67c-2.616,1.787-3.924,4.626-3.924,8.517v7.487 c-1.445-0.43-2.869-0.938-4.268-1.53c-4.899-2.073-9.301-5.041-13.083-8.823c-3.782-3.782-6.75-8.184-8.823-13.083 C9.934,60.948,8.847,55.56,8.847,50s1.087-10.948,3.231-16.016c2.073-4.899,5.041-9.301,8.823-13.083s8.184-6.75,13.083-8.823 C39.052,9.934,44.44,8.847,50,8.847s10.948,1.087,16.016,3.231c4.9,2.073,9.301,5.041,13.083,8.823 c3.782,3.782,6.75,8.184,8.823,13.083c2.143,5.069,3.23,10.457,3.23,16.016s-1.087,10.948-3.231,16.016 C85.848,70.915,82.88,75.317,79.099,79.099L79.099,79.099z" style="opacity: 1; fill: rgb(255, 255, 255);" transform="translate(25,25) scale(0.5)"></path>
</svg>
</a>
</li>
<li class="social-links-li">
<a class="social-link social-gplus" href="https://plus.google.com/+CoreySchafer44/posts" title="YouTube">
<svg style="height: 40px; width: 40px;" version="1.1" viewbox="0 0 100 100" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<circle class="outer-shape" cx="50" cy="50" r="48"></circle>
<path class="inner-shape" d="M1.079,84.227c-0.024-0.242-0.043-0.485-0.056-0.73C1.036,83.742,1.055,83.985,1.079,84.227z M23.578,55.086 c8.805,0.262,14.712-8.871,13.193-20.402c-1.521-11.53-9.895-20.783-18.701-21.046C9.264,13.376,3.357,22.2,4.878,33.734 C6.398,45.262,14.769,54.823,23.578,55.086z M98.999,25.501v-8.164c0-8.984-7.348-16.335-16.332-16.335H17.336 c-8.831,0-16.078,7.104-16.323,15.879c5.585-4.917,13.333-9.026,21.329-9.026c8.546,0,34.188,0,34.188,0l-7.651,6.471H38.039 c7.19,2.757,11.021,11.113,11.021,19.687c0,7.201-4.001,13.393-9.655,17.797c-5.516,4.297-6.562,6.096-6.562,9.749 c0,3.117,5.909,8.422,8.999,10.602c9.032,6.368,11.955,12.279,11.955,22.15c0,1.572-0.195,3.142-0.58,4.685h29.451 C91.652,98.996,99,91.651,99,82.661V31.625H80.626v18.374h-6.125V31.625H56.127V25.5h18.374V7.127h6.125V25.5H99L98.999,25.501z M18.791,74.301c2.069,0,3.964-0.057,5.927-0.057c-2.598-2.52-4.654-5.608-4.654-9.414c0-2.259,0.724-4.434,1.736-6.366 c-1.032,0.073-2.085,0.095-3.17,0.095c-7.116,0-13.159-2.304-17.629-6.111v6.435l0.001,19.305 C6.116,75.76,12.188,74.301,18.791,74.301L18.791,74.301z M1.329,85.911c-0.107-0.522-0.188-1.053-0.243-1.591 C1.141,84.858,1.223,85.389,1.329,85.911z M44.589,92.187c-1.442-5.628-6.551-8.418-13.675-13.357 c-2.591-0.836-5.445-1.328-8.507-1.36c-8.577-0.092-16.566,3.344-21.074,8.457c1.524,7.436,8.138,13.068,16.004,13.068h27.413 c0.173-1.065,0.258-2.166,0.258-3.295C45.007,94.502,44.86,93.329,44.589,92.187z" style="opacity: 1; fill: rgb(255, 255, 255);" transform="translate(25,25) scale(0.5)"></path>
</svg>
</a>
</li>
<li class="social-links-li">
<a class="social-link social-twitter" href="https://twitter.com/CoreyMSchafer">
<svg style="height: 40px; width: 40px;" version="1.1" viewbox="0 0 100 100" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<circle class="outer-shape" cx="50" cy="50" r="48"></circle>
<path class="inner-shape" d="M99.001,19.428c-3.606,1.608-7.48,2.695-11.547,3.184c4.15-2.503,7.338-6.466,8.841-11.189 c-3.885,2.318-8.187,4-12.768,4.908c-3.667-3.931-8.893-6.387-14.676-6.387c-11.104,0-20.107,9.054-20.107,20.223 c0,1.585,0.177,3.128,0.52,4.609c-16.71-0.845-31.525-8.895-41.442-21.131C6.092,16.633,5.1,20.107,5.1,23.813 c0,7.017,3.55,13.208,8.945,16.834c-3.296-0.104-6.397-1.014-9.106-2.529c-0.002,0.085-0.002,0.17-0.002,0.255 c0,9.799,6.931,17.972,16.129,19.831c-1.688,0.463-3.463,0.71-5.297,0.71c-1.296,0-2.555-0.127-3.783-0.363 c2.559,8.034,9.984,13.882,18.782,14.045c-6.881,5.424-15.551,8.657-24.971,8.657c-1.623,0-3.223-0.096-4.796-0.282 c8.898,5.738,19.467,9.087,30.82,9.087c36.982,0,57.206-30.817,57.206-57.543c0-0.877-0.02-1.748-0.059-2.617 C92.896,27.045,96.305,23.482,99.001,19.428z" style="opacity: 1; fill: rgb(255, 255, 255);" transform="translate(25,25) scale(0.5)"></path>
</svg>
</a>
</li>
<li class="social-links-li">
<a class="social-link social-linkedin" href="https://www.instagram.com/coreymschafer/">
<svg style="height: 40px; width: 40px;" version="1.1" viewbox="0 0 100 100" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<circle class="outer-shape" cx="50" cy="50" r="48"></circle>
<path class="inner-shape" d="M88.2,1H11.8C5.85,1,1.026,5.827,1.026,11.781V88.22C1.026,94.174,5.85,99,11.8,99H88.2c5.95,0,10.774-4.826,10.774-10.78 V11.781C98.973,5.827,94.149,1,88.2,1z M49.946,31.184c10.356,0,18.752,8.4,18.752,18.762c0,10.361-8.396,18.761-18.752,18.761 s-18.752-8.4-18.752-18.761S39.589,31.184,49.946,31.184z M87.513,83.615c0,2.165-1.753,3.919-3.917,3.919H16.341 c-2.164,0-3.917-1.755-3.917-3.919v-41.06h8.508c-0.589,2.35-0.904,4.807-0.904,7.34c0,16.612,13.459,30.079,30.063,30.079 s30.063-13.466,30.063-30.079c0-2.533-0.315-4.99-0.904-7.34h8.263L87.513,83.615L87.513,83.615z M87.764,27.124 c0,2.165-1.754,3.919-3.918,3.919H72.723c-2.164,0-3.917-1.755-3.917-3.919v-11.13c0-2.165,1.754-3.919,3.917-3.919h11.123 c2.165,0,3.918,1.755,3.918,3.919V27.124z" style="opacity: 1; fill: rgb(255, 255, 255);" transform="translate(25,25) scale(0.5)"></path>
</svg>
</a>
</li>
<li class="social-links-li">
<a class="social-link social-rss" href="http://coreyms.com/feed/">
<svg style="height: 40px; width: 40px;" version="1.1" viewbox="0 0 100 100" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<circle class="outer-shape" cx="50" cy="50" r="48"></circle>
<path class="inner-shape" d="M14.044,72.866C6.848,72.866,1,78.736,1,85.889c0,7.192,5.848,12.997,13.044,12.997c7.223,0,13.062-5.804,13.062-12.997 C27.106,78.736,21.267,72.866,14.044,72.866z M1.015,34.299v18.782c12.229,0,23.73,4.782,32.392,13.447 C42.057,75.172,46.832,86.725,46.832,99h18.865C65.697,63.321,36.672,34.3,1.015,34.299L1.015,34.299z M1.038,1v18.791 C44.657,19.792,80.16,55.329,80.16,99H99C99,44.979,55.048,1,1.038,1z" style="opacity: 1; fill: rgb(255, 255, 255);" transform="translate(25,25) scale(0.5)"></path>
</svg>
</a>
</li>
</ul>
</div>
</div><div class="widget-area header-widget-area"><section class="widget widget_nav_menu" id="nav_menu-2"><div class="widget-wrap"><nav class="nav-header" itemscope="" itemtype="https://schema.org/SiteNavigationElement"><ul class="menu genesis-nav-menu js-superfish" id="menu-contact-menu"><li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-984" id="menu-item-984"><a href="https://coreyms.com/contact" itemprop="url"><span itemprop="name">Contact</span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-153" id="menu-item-153"><a href="http://coreyms.com/portfolio" itemprop="url" title="Portfolio"><span itemprop="name">Portfolio</span></a></li>
</ul></nav></div></section>
</div></div></header><nav aria-label="Main" class="nav-primary" itemscope="" itemtype="https://schema.org/SiteNavigationElement"><div class="wrap"><ul class="menu genesis-nav-menu menu-primary js-superfish" id="menu-primary-navigation"><li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-has-children menu-item-124" id="menu-item-124"><a href="https://coreyms.com/category/development" itemprop="url" title="Development"><span itemprop="name">Development</span></a>
<ul class="sub-menu">
<li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-1070" id="menu-item-1070"><a href="https://coreyms.com/category/development/python" itemprop="url"><span itemprop="name">Python</span></a></li>
<li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-1105" id="menu-item-1105"><a href="https://coreyms.com/category/development/git" itemprop="url"><span itemprop="name">Git</span></a></li>
<li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-1106" id="menu-item-1106"><a href="https://coreyms.com/category/development/terminal" itemprop="url"><span itemprop="name">Terminal</span></a></li>
<li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-803" id="menu-item-803"><a href="https://coreyms.com/category/development/javascript" itemprop="url" title="JavaScript"><span itemprop="name">JavaScript</span></a></li>
<li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-1072" id="menu-item-1072"><a href="https://coreyms.com/category/development/wordpress" itemprop="url"><span itemprop="name">WordPress</span></a></li>
</ul>
</li>
<li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-has-children menu-item-125" id="menu-item-125"><a href="https://coreyms.com/category/web-design" itemprop="url" title="Design"><span itemprop="name">Design</span></a>
<ul class="sub-menu">
<li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-801" id="menu-item-801"><a href="https://coreyms.com/category/web-design/css" itemprop="url" title="CSS"><span itemprop="name">CSS</span></a></li>
</ul>
</li>
<li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-has-children menu-item-804" id="menu-item-804"><a href="https://coreyms.com/category/diy" itemprop="url" title="DIY"><span itemprop="name">DIY</span></a>
<ul class="sub-menu">
<li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-805" id="menu-item-805"><a href="https://coreyms.com/category/diy/woodworking" itemprop="url" title="Woodworking"><span itemprop="name">Woodworking</span></a></li>
<li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-806" id="menu-item-806"><a href="https://coreyms.com/category/diy/home-improvement" itemprop="url" title="Home Improvement"><span itemprop="name">Home Improvement</span></a></li>
</ul>
</li>
<li class="right menu-item menu-item-type-post_type menu-item-object-page menu-item-1154" id="menu-item-1154"><a href="https://coreyms.com/contributors" itemprop="url" title="Contributors"><span itemprop="name">Contributors</span></a></li>
<li class="right menu-item menu-item-type-post_type menu-item-object-page menu-item-898" id="menu-item-898"><a href="https://coreyms.com/support" itemprop="url" title="Support"><span itemprop="name">Support</span></a></li>
<li class="right menu-item menu-item-type-post_type menu-item-object-page menu-item-1260" id="menu-item-1260"><a href="https://coreyms.com/giveaway" itemprop="url"><span itemprop="name">Giveaway</span></a></li>
</ul></div></nav><div class="site-inner"><div class="content-sidebar-wrap"><main class="content"><article class="post-1665 post type-post status-publish format-standard has-post-thumbnail category-development category-python tag-data-analysis tag-data-science tag-stack-overflow entry" itemscope="" itemtype="https://schema.org/CreativeWork"><header class="entry-header"><h2 class="entry-title" itemprop="headline"><a class="entry-title-link" href="https://coreyms.com/development/python/python-data-science-tutorial-analyzing-the-2019-stack-overflow-developer-survey" rel="bookmark">Python Data Science Tutorial: Analyzing the 2019 Stack Overflow Developer Survey</a></h2>
<p class="entry-meta"><time class="entry-time" datetime="2019-10-17T12:35:51+00:00" itemprop="datePublished">October 17, 2019</time> by <span class="entry-author" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><a class="entry-author-link" href="https://coreyms.com/author/coreymschafer" itemprop="url" rel="author"><span class="entry-author-name" itemprop="name">Corey Schafer</span></a></span> <span class="entry-comments-link"><a href="https://coreyms.com/development/python/python-data-science-tutorial-analyzing-the-2019-stack-overflow-developer-survey#respond"><span class="dsq-postid" data-dsqidentifier="1665 http://coreyms.com/?p=1665">Leave a Comment</span></a></span> </p></header><div class="entry-content" itemprop="text">
<p>In this Python Programming video, we will be learning how to download and analyze real-world data from the 2019 Stack Overflow Developer Survey. This is terrific practice for anyone getting into the data science field. We will learn different ways to analyze this data and also some best practices. Let’s get started…</p>
<figure class="wp-block-embed-youtube wp-block-embed is-type-video is-provider-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<span class="embed-youtube" style="text-align:center; display: block;"><iframe allowfullscreen="true" class="youtube-player" height="360" src="https://www.youtube.com/embed/_P7X8tMplsw?version=3&amp;rel=1&amp;fs=1&amp;autohide=2&amp;showsearch=0&amp;showinfo=1&amp;iv_load_policy=1&amp;wmode=transparent" style="border:0;" type="text/html" width="640"></iframe></span>
</div></figure>
</div><footer class="entry-footer"><p class="entry-meta"><span class="entry-categories">Filed Under: <a href="https://coreyms.com/category/development" rel="category tag">Development</a>, <a href="https://coreyms.com/category/development/python" rel="category tag">Python</a></span> <span class="entry-tags">Tagged With: <a href="https://coreyms.com/tag/data-analysis" rel="tag">data analysis</a>, <a href="https://coreyms.com/tag/data-science" rel="tag">Data Science</a>, <a href="https://coreyms.com/tag/stack-overflow" rel="tag">stack overflow</a></span></p></footer></article><article class="post-1661 post type-post status-publish format-standard has-post-thumbnail category-development category-python tag-asynchronous tag-concurrent-futures tag-multiprocessing tag-parallel tag-threading entry" itemscope="" itemtype="https://schema.org/CreativeWork"><header class="entry-header"><h2 class="entry-title" itemprop="headline"><a class="entry-title-link" href="https://coreyms.com/development/python/python-multiprocessing-tutorial-run-code-in-parallel-using-the-multiprocessing-module" rel="bookmark">Python Multiprocessing Tutorial: Run Code in Parallel Using the Multiprocessing Module</a></h2>
<p class="entry-meta"><time class="entry-time" datetime="2019-09-21T10:59:18+00:00" itemprop="datePublished">September 21, 2019</time> by <span class="entry-author" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><a class="entry-author-link" href="https://coreyms.com/author/coreymschafer" itemprop="url" rel="author"><span class="entry-author-name" itemprop="name">Corey Schafer</span></a></span> <span class="entry-comments-link"><a href="https://coreyms.com/development/python/python-multiprocessing-tutorial-run-code-in-parallel-using-the-multiprocessing-module#respond"><span class="dsq-postid" data-dsqidentifier="1661 http://coreyms.com/?p=1661">Leave a Comment</span></a></span> </p></header><div class="entry-content" itemprop="text">
<p>In this Python Programming video, we will be learning how to run code in parallel using the multiprocessing module. We will also look at how to process multiple high-resolution images at the same time using a ProcessPoolExecutor from the concurrent.futures module. Let’s get started…</p>
<figure class="wp-block-embed-youtube wp-block-embed is-type-video is-provider-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<span class="embed-youtube" style="text-align:center; display: block;"><iframe allowfullscreen="true" class="youtube-player" height="360" src="https://www.youtube.com/embed/fKl2JW_qrso?version=3&amp;rel=1&amp;fs=1&amp;autohide=2&amp;showsearch=0&amp;showinfo=1&amp;iv_load_policy=1&amp;wmode=transparent" style="border:0;" type="text/html" width="640"></iframe></span>
</div></figure>
</div><footer class="entry-footer"><p class="entry-meta"><span class="entry-categories">Filed Under: <a href="https://coreyms.com/category/development" rel="category tag">Development</a>, <a href="https://coreyms.com/category/development/python" rel="category tag">Python</a></span> <span class="entry-tags">Tagged With: <a href="https://coreyms.com/tag/asynchronous" rel="tag">asynchronous</a>, <a href="https://coreyms.com/tag/concurrent-futures" rel="tag">concurrent.futures</a>, <a href="https://coreyms.com/tag/multiprocessing" rel="tag">multiprocessing</a>, <a href="https://coreyms.com/tag/parallel" rel="tag">parallel</a>, <a href="https://coreyms.com/tag/threading" rel="tag">threading</a></span></p></footer></article><article class="post-1658 post type-post status-publish format-standard has-post-thumbnail category-development category-python tag-asynchronous tag-concurrency tag-multiprocessing tag-threading entry" itemscope="" itemtype="https://schema.org/CreativeWork"><header class="entry-header"><h2 class="entry-title" itemprop="headline"><a class="entry-title-link" href="https://coreyms.com/development/python/python-threading-tutorial-run-code-concurrently-using-the-threading-module" rel="bookmark">Python Threading Tutorial: Run Code Concurrently Using the Threading Module</a></h2>
<p class="entry-meta"><time class="entry-time" datetime="2019-09-12T10:49:54+00:00" itemprop="datePublished">September 12, 2019</time> by <span class="entry-author" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><a class="entry-author-link" href="https://coreyms.com/author/coreymschafer" itemprop="url" rel="author"><span class="entry-author-name" itemprop="name">Corey Schafer</span></a></span> <span class="entry-comments-link"><a href="https://coreyms.com/development/python/python-threading-tutorial-run-code-concurrently-using-the-threading-module#respond"><span class="dsq-postid" data-dsqidentifier="1658 http://coreyms.com/?p=1658">Leave a Comment</span></a></span> </p></header><div class="entry-content" itemprop="text">
<p>In this Python Programming video, we will be learning how to run threads concurrently using the threading module. We will also look at how to download multiple high-resolution images online using a ThreadPoolExecutor from the concurrent.futures module. Let’s get started…</p>
<figure class="wp-block-embed-youtube wp-block-embed is-type-video is-provider-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<span class="embed-youtube" style="text-align:center; display: block;"><iframe allowfullscreen="true" class="youtube-player" height="360" src="https://www.youtube.com/embed/IEEhzQoKtQU?version=3&amp;rel=1&amp;fs=1&amp;autohide=2&amp;showsearch=0&amp;showinfo=1&amp;iv_load_policy=1&amp;wmode=transparent" style="border:0;" type="text/html" width="640"></iframe></span>
</div></figure>
</div><footer class="entry-footer"><p class="entry-meta"><span class="entry-categories">Filed Under: <a href="https://coreyms.com/category/development" rel="category tag">Development</a>, <a href="https://coreyms.com/category/development/python" rel="category tag">Python</a></span> <span class="entry-tags">Tagged With: <a href="https://coreyms.com/tag/asynchronous" rel="tag">asynchronous</a>, <a href="https://coreyms.com/tag/concurrency" rel="tag">concurrency</a>, <a href="https://coreyms.com/tag/multiprocessing" rel="tag">multiprocessing</a>, <a href="https://coreyms.com/tag/threading" rel="tag">threading</a></span></p></footer></article><article class="post-1655 post type-post status-publish format-standard category-general entry" itemscope="" itemtype="https://schema.org/CreativeWork"><header class="entry-header"><h2 class="entry-title" itemprop="headline"><a class="entry-title-link" href="https://coreyms.com/general/update-2019-09-03" rel="bookmark">Update (2019-09-03)</a></h2>
<p class="entry-meta"><time class="entry-time" datetime="2019-09-03T16:42:01+00:00" itemprop="datePublished">September 3, 2019</time> by <span class="entry-author" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><a class="entry-author-link" href="https://coreyms.com/author/coreymschafer" itemprop="url" rel="author"><span class="entry-author-name" itemprop="name">Corey Schafer</span></a></span> <span class="entry-comments-link"><a href="https://coreyms.com/general/update-2019-09-03#respond"><span class="dsq-postid" data-dsqidentifier="1655 http://coreyms.com/?p=1655">Leave a Comment</span></a></span> </p></header><div class="entry-content" itemprop="text">
<p>Hey everyone. I wanted to give you an update on my videos. I will be releasing videos on threading and multiprocessing within the next week. Thanks so much for your patience. I currently have a temporary recording studio setup at my Airbnb that will allow me to record and edit the threading/multiprocessing videos. I am going to be moving into my new house in 10 days and once I have my recording studio setup then you can expect much faster video releases. I really appreciate how patient everyone has been while I go through this move, especially those of you who are contributing monthly through YouTube </p>
</div><footer class="entry-footer"><p class="entry-meta"><span class="entry-categories">Filed Under: <a href="https://coreyms.com/category/general" rel="category tag">General</a></span> </p></footer></article><article class="post-1651 post type-post status-publish format-standard has-post-thumbnail category-development category-python tag-vs-is tag-equality tag-identity entry" itemscope="" itemtype="https://schema.org/CreativeWork"><header class="entry-header"><h2 class="entry-title" itemprop="headline"><a class="entry-title-link" href="https://coreyms.com/development/python/python-quick-tip-the-difference-between-and-is-equality-vs-identity" rel="bookmark">Python Quick Tip: The Difference Between “==” and “is” (Equality vs Identity)</a></h2>
<p class="entry-meta"><time class="entry-time" datetime="2019-08-06T12:17:28+00:00" itemprop="datePublished">August 6, 2019</time> by <span class="entry-author" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><a class="entry-author-link" href="https://coreyms.com/author/coreymschafer" itemprop="url" rel="author"><span class="entry-author-name" itemprop="name">Corey Schafer</span></a></span> <span class="entry-comments-link"><a href="https://coreyms.com/development/python/python-quick-tip-the-difference-between-and-is-equality-vs-identity#respond"><span class="dsq-postid" data-dsqidentifier="1651 http://coreyms.com/?p=1651">Leave a Comment</span></a></span> </p></header><div class="entry-content" itemprop="text">
<p>In this Python Programming Tutorial, we will be learning the difference between using “==” and the “is” keyword when doing comparisons. The difference between these is that “==” checks to see if values are equal, and the “is” keyword checks their identity, which means it’s going to check if the values are identical in terms of being the same object in memory. We’ll learn more in the video. Let’s get started…</p>
<figure class="wp-block-embed-youtube wp-block-embed is-type-video is-provider-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<span class="embed-youtube" style="text-align:center; display: block;"><iframe allowfullscreen="true" class="youtube-player" height="360" src="https://www.youtube.com/embed/mO_dS3rXDIs?version=3&amp;rel=1&amp;fs=1&amp;autohide=2&amp;showsearch=0&amp;showinfo=1&amp;iv_load_policy=1&amp;wmode=transparent" style="border:0;" type="text/html" width="640"></iframe></span>
</div></figure>
</div><footer class="entry-footer"><p class="entry-meta"><span class="entry-categories">Filed Under: <a href="https://coreyms.com/category/development" rel="category tag">Development</a>, <a href="https://coreyms.com/category/development/python" rel="category tag">Python</a></span> <span class="entry-tags">Tagged With: <a href="https://coreyms.com/tag/vs-is" rel="tag">== vs is</a>, <a href="https://coreyms.com/tag/equality" rel="tag">equality</a>, <a href="https://coreyms.com/tag/identity" rel="tag">identity</a></span></p></footer></article><article class="post-1647 post type-post status-publish format-standard has-post-thumbnail category-development category-python tag-standard-library tag-subprocess entry" itemscope="" itemtype="https://schema.org/CreativeWork"><header class="entry-header"><h2 class="entry-title" itemprop="headline"><a class="entry-title-link" href="https://coreyms.com/development/python/python-tutorial-calling-external-commands-using-the-subprocess-module" rel="bookmark">Python Tutorial: Calling External Commands Using the Subprocess Module</a></h2>
<p class="entry-meta"><time class="entry-time" datetime="2019-07-24T15:26:19+00:00" itemprop="datePublished">July 24, 2019</time> by <span class="entry-author" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><a class="entry-author-link" href="https://coreyms.com/author/coreymschafer" itemprop="url" rel="author"><span class="entry-author-name" itemprop="name">Corey Schafer</span></a></span> <span class="entry-comments-link"><a href="https://coreyms.com/development/python/python-tutorial-calling-external-commands-using-the-subprocess-module#respond"><span class="dsq-postid" data-dsqidentifier="1647 http://coreyms.com/?p=1647">Leave a Comment</span></a></span> </p></header><div class="entry-content" itemprop="text">
<p>In this Python Programming Tutorial, we will be learning how to run external commands using the subprocess module from the standard library. We will learn how to run commands, capture the output, handle errors, and also how to pipe output into other commands. Let’s get started…</p>
<figure class="wp-block-embed-youtube wp-block-embed is-type-video is-provider-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<span class="embed-youtube" style="text-align:center; display: block;"><iframe allowfullscreen="true" class="youtube-player" height="360" src="https://www.youtube.com/embed/2Fp1N6dof0Y?version=3&amp;rel=1&amp;fs=1&amp;autohide=2&amp;showsearch=0&amp;showinfo=1&amp;iv_load_policy=1&amp;wmode=transparent" style="border:0;" type="text/html" width="640"></iframe></span>
</div></figure>
</div><footer class="entry-footer"><p class="entry-meta"><span class="entry-categories">Filed Under: <a href="https://coreyms.com/category/development" rel="category tag">Development</a>, <a href="https://coreyms.com/category/development/python" rel="category tag">Python</a></span> <span class="entry-tags">Tagged With: <a href="https://coreyms.com/tag/standard-library" rel="tag">standard library</a>, <a href="https://coreyms.com/tag/subprocess" rel="tag">subprocess</a></span></p></footer></article><article class="post-1642 post type-post status-publish format-standard has-post-thumbnail category-development category-python tag-development-environment tag-visual-studio-code tag-visual-studios tag-vs-code tag-vscode entry" itemscope="" itemtype="https://schema.org/CreativeWork"><header class="entry-header"><h2 class="entry-title" itemprop="headline"><a class="entry-title-link" href="https://coreyms.com/development/python/visual-studio-code-windows-setting-up-a-python-development-environment-and-complete-overview" rel="bookmark">Visual Studio Code (Windows) – Setting up a Python Development Environment and Complete Overview</a></h2>
<p class="entry-meta"><time class="entry-time" datetime="2019-05-01T14:03:24+00:00" itemprop="datePublished">May 1, 2019</time> by <span class="entry-author" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><a class="entry-author-link" href="https://coreyms.com/author/coreymschafer" itemprop="url" rel="author"><span class="entry-author-name" itemprop="name">Corey Schafer</span></a></span> <span class="entry-comments-link"><a href="https://coreyms.com/development/python/visual-studio-code-windows-setting-up-a-python-development-environment-and-complete-overview#respond"><span class="dsq-postid" data-dsqidentifier="1642 http://coreyms.com/?p=1642">Leave a Comment</span></a></span> </p></header><div class="entry-content" itemprop="text">
<p>In this Python Programming Tutorial, we will be learning how to set up a Python development environment in VSCode on Windows. VSCode is a very nice free editor for writing Python applications and many developers are now switching over to this editor. In this video, we will learn how to install VSCode, get the Python extension installed, how to change Python interpreters, create virtual environments, format/lint our code, how to use Git within VSCode, how to debug our programs, how unit testing works, and more. We have a lot to cover, so let’s go ahead and get started…</p>
<p>VSCode on MacOS – https://youtu.be/06I63_p-2A4</p>
<p>Timestamps for topics in this tutorial:<br/> Installation – 1:13<br/> Python Extension – 5:48<br/> Switching Interpreters – 10:04<br/> Changing Color Themes – 12:35<br/> VSCode Settings – 16:16<br/> Set Default Python – 21:33<br/> Using Virtual Environments – 25:10<br/> IntelliSense – 29:45<br/> Code Formatting – 32:13<br/> Code Linting – 37:06<br/> Code Runner Extension – 39:42<br/> Git Integration – 47:44<br/> Use Different Terminal – 51:07<br/> Debugging – 58:45<br/> Unit Testing – 1:03:25<br/> Zen Mode – 1:09:55</p>
<figure class="wp-block-embed-youtube wp-block-embed is-type-video is-provider-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<span class="embed-youtube" style="text-align:center; display: block;"><iframe allowfullscreen="true" class="youtube-player" height="360" src="https://www.youtube.com/embed/-nh9rCzPJ20?version=3&amp;rel=1&amp;fs=1&amp;autohide=2&amp;showsearch=0&amp;showinfo=1&amp;iv_load_policy=1&amp;wmode=transparent" style="border:0;" type="text/html" width="640"></iframe></span>
</div></figure>
</div><footer class="entry-footer"><p class="entry-meta"><span class="entry-categories">Filed Under: <a href="https://coreyms.com/category/development" rel="category tag">Development</a>, <a href="https://coreyms.com/category/development/python" rel="category tag">Python</a></span> <span class="entry-tags">Tagged With: <a href="https://coreyms.com/tag/development-environment" rel="tag">Development Environment</a>, <a href="https://coreyms.com/tag/visual-studio-code" rel="tag">visual studio code</a>, <a href="https://coreyms.com/tag/visual-studios" rel="tag">visual studios</a>, <a href="https://coreyms.com/tag/vs-code" rel="tag">vs code</a>, <a href="https://coreyms.com/tag/vscode" rel="tag">vscode</a></span></p></footer></article><article class="post-1639 post type-post status-publish format-standard has-post-thumbnail category-development category-python tag-development-environment tag-visual-studio-code tag-visual-studios tag-vs-code tag-vscode entry" itemscope="" itemtype="https://schema.org/CreativeWork"><header class="entry-header"><h2 class="entry-title" itemprop="headline"><a class="entry-title-link" href="https://coreyms.com/development/python/visual-studio-code-mac-setting-up-a-python-development-environment-and-complete-overview" rel="bookmark">Visual Studio Code (Mac) – Setting up a Python Development Environment and Complete Overview</a></h2>
<p class="entry-meta"><time class="entry-time" datetime="2019-05-01T14:01:45+00:00" itemprop="datePublished">May 1, 2019</time> by <span class="entry-author" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><a class="entry-author-link" href="https://coreyms.com/author/coreymschafer" itemprop="url" rel="author"><span class="entry-author-name" itemprop="name">Corey Schafer</span></a></span> <span class="entry-comments-link"><a href="https://coreyms.com/development/python/visual-studio-code-mac-setting-up-a-python-development-environment-and-complete-overview#respond"><span class="dsq-postid" data-dsqidentifier="1639 http://coreyms.com/?p=1639">Leave a Comment</span></a></span> </p></header><div class="entry-content" itemprop="text">
<p>In this Python Programming Tutorial, we will be learning how to set up a Python development environment in VSCode on MacOS. VSCode is a very nice free editor for writing Python applications and many developers are now switching over to this editor. In this video, we will learn how to install VSCode, get the Python extension installed, how to change Python interpreters, create virtual environments, format/lint our code, how to use Git within VSCode, how to debug our programs, how unit testing works, and more. We have a lot to cover, so let’s go ahead and get started…</p>
<p>VSCode on Windows – https://youtu.be/-nh9rCzPJ20</p>
<p>Timestamps for topics in this tutorial:<br/> Installation – 1:11<br/> Python Extension – 6:21<br/> Switching Interpreters – 10:16<br/> Changing Color Themes – 13:08<br/> VSCode Settings – 17:12<br/> Set Default Python – 22:24<br/> Using Virtual Environments – 25:52<br/> IntelliSense – 30:28<br/> Code Formatting – 33:08<br/> Code Linting – 38:01<br/> Code Runner Extension – 40:45<br/> Git Integration – 49:05<br/> Debugging – 58:15<br/> Unit Testing – 1:02:38<br/> Zen Mode – 1:10:42 </p>
<figure class="wp-block-embed-youtube wp-block-embed is-type-video is-provider-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<span class="embed-youtube" style="text-align:center; display: block;"><iframe allowfullscreen="true" class="youtube-player" height="360" src="https://www.youtube.com/embed/06I63_p-2A4?version=3&amp;rel=1&amp;fs=1&amp;autohide=2&amp;showsearch=0&amp;showinfo=1&amp;iv_load_policy=1&amp;wmode=transparent" style="border:0;" type="text/html" width="640"></iframe></span>
</div></figure>
</div><footer class="entry-footer"><p class="entry-meta"><span class="entry-categories">Filed Under: <a href="https://coreyms.com/category/development" rel="category tag">Development</a>, <a href="https://coreyms.com/category/development/python" rel="category tag">Python</a></span> <span class="entry-tags">Tagged With: <a href="https://coreyms.com/tag/development-environment" rel="tag">Development Environment</a>, <a href="https://coreyms.com/tag/visual-studio-code" rel="tag">visual studio code</a>, <a href="https://coreyms.com/tag/visual-studios" rel="tag">visual studios</a>, <a href="https://coreyms.com/tag/vs-code" rel="tag">vs code</a>, <a href="https://coreyms.com/tag/vscode" rel="tag">vscode</a></span></p></footer></article><article class="post-1634 post type-post status-publish format-standard has-post-thumbnail category-development category-python tag-common-errors tag-common-mistakes tag-functions tag-mutable-default-arguments entry" itemscope="" itemtype="https://schema.org/CreativeWork"><header class="entry-header"><h2 class="entry-title" itemprop="headline"><a class="entry-title-link" href="https://coreyms.com/development/python/clarifying-the-issues-with-mutable-default-arguments" rel="bookmark">Clarifying the Issues with Mutable Default Arguments</a></h2>
<p class="entry-meta"><time class="entry-time" datetime="2019-04-24T11:46:42+00:00" itemprop="datePublished">April 24, 2019</time> by <span class="entry-author" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><a class="entry-author-link" href="https://coreyms.com/author/coreymschafer" itemprop="url" rel="author"><span class="entry-author-name" itemprop="name">Corey Schafer</span></a></span> <span class="entry-comments-link"><a href="https://coreyms.com/development/python/clarifying-the-issues-with-mutable-default-arguments#respond"><span class="dsq-postid" data-dsqidentifier="1634 http://coreyms.com/?p=1634">Leave a Comment</span></a></span> </p></header><div class="entry-content" itemprop="text">
<p>In this Python Programming Tutorial, we will be clarifying the issues with mutable default arguments. We discussed this in my last video titled “5 Common Python Mistakes and How to Fix Them”, but I received many comments from people who were still confused. So we will be doing a deeper dive to explain exactly what is going on here. Let’s get started…</p>
<figure class="wp-block-embed-youtube wp-block-embed is-type-video is-provider-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<span class="embed-youtube" style="text-align:center; display: block;"><iframe allowfullscreen="true" class="youtube-player" height="360" src="https://www.youtube.com/embed/_JGmemuINww?version=3&amp;rel=1&amp;fs=1&amp;autohide=2&amp;showsearch=0&amp;showinfo=1&amp;iv_load_policy=1&amp;wmode=transparent" style="border:0;" type="text/html" width="640"></iframe></span>
</div></figure>
</div><footer class="entry-footer"><p class="entry-meta"><span class="entry-categories">Filed Under: <a href="https://coreyms.com/category/development" rel="category tag">Development</a>, <a href="https://coreyms.com/category/development/python" rel="category tag">Python</a></span> <span class="entry-tags">Tagged With: <a href="https://coreyms.com/tag/common-errors" rel="tag">common errors</a>, <a href="https://coreyms.com/tag/common-mistakes" rel="tag">common mistakes</a>, <a href="https://coreyms.com/tag/functions" rel="tag">functions</a>, <a href="https://coreyms.com/tag/mutable-default-arguments" rel="tag">mutable default arguments</a></span></p></footer></article><article class="post-1629 post type-post status-publish format-standard has-post-thumbnail category-development category-python tag-common-errors tag-common-mistakes tag-indentationerror tag-python-gotchas entry" itemscope="" itemtype="https://schema.org/CreativeWork"><header class="entry-header"><h2 class="entry-title" itemprop="headline"><a class="entry-title-link" href="https://coreyms.com/development/python/5-common-python-mistakes-and-how-to-fix-them-2" rel="bookmark">5 Common Python Mistakes and How to Fix Them</a></h2>
<p class="entry-meta"><time class="entry-time" datetime="2019-04-22T13:56:21+00:00" itemprop="datePublished">April 22, 2019</time> by <span class="entry-author" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><a class="entry-author-link" href="https://coreyms.com/author/coreymschafer" itemprop="url" rel="author"><span class="entry-author-name" itemprop="name">Corey Schafer</span></a></span> <span class="entry-comments-link"><a href="https://coreyms.com/development/python/5-common-python-mistakes-and-how-to-fix-them-2#respond"><span class="dsq-postid" data-dsqidentifier="1629 http://coreyms.com/?p=1629">Leave a Comment</span></a></span> </p></header><div class="entry-content" itemprop="text">
<p>In this Python Programming Tutorial, we will be going over some of the most common mistakes. I get a lot of questions from people every day, and I have seen a lot of people making these same mistakes in their code. So we will investigate each of these common mistakes and also look at the fixes for each other these as well. Here are the timestamps for each topic we will cover…<br/> 1) Indentation and Spaces – 0:45<br/> 2) Naming Conflicts – 4:12<br/> 3) Mutable Default Args – 10:05<br/> 4) Exhausting Iterators – 16:35<br/> 5) Importing with * – 22:13</p>
<figure class="wp-block-embed-youtube wp-block-embed is-type-video is-provider-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<span class="embed-youtube" style="text-align:center; display: block;"><iframe allowfullscreen="true" class="youtube-player" height="360" src="https://www.youtube.com/embed/zdJEYhA2AZQ?version=3&amp;rel=1&amp;fs=1&amp;autohide=2&amp;showsearch=0&amp;showinfo=1&amp;iv_load_policy=1&amp;wmode=transparent" style="border:0;" type="text/html" width="640"></iframe></span>
</div></figure>
</div><footer class="entry-footer"><p class="entry-meta"><span class="entry-categories">Filed Under: <a href="https://coreyms.com/category/development" rel="category tag">Development</a>, <a href="https://coreyms.com/category/development/python" rel="category tag">Python</a></span> <span class="entry-tags">Tagged With: <a href="https://coreyms.com/tag/common-errors" rel="tag">common errors</a>, <a href="https://coreyms.com/tag/common-mistakes" rel="tag">common mistakes</a>, <a href="https://coreyms.com/tag/indentationerror" rel="tag">indentationerror</a>, <a href="https://coreyms.com/tag/python-gotchas" rel="tag">python gotchas</a></span></p></footer></article><div class="archive-pagination pagination"><ul><li class="active"><a aria-current="page" aria-label="Current page" href="https://coreyms.com/">1</a></li>
<li><a href="https://coreyms.com/page/2">2</a></li>
<li><a href="https://coreyms.com/page/3">3</a></li>
<li class="pagination-omission">…</li>
<li><a href="https://coreyms.com/page/17">17</a></li>
<li class="pagination-next"><a href="https://coreyms.com/page/2">Next Page »</a></li>
</ul></div>
</main><aside aria-label="Primary Sidebar" class="sidebar sidebar-primary widget-area" itemscope="" itemtype="https://schema.org/WPSideBar" role="complementary"><section class="widget widget_text" id="text-5"><div class="widget-wrap"><h4 class="widget-title widgettitle">Top Contributors (15)</h4>
<div class="textwidget"><p><!--


<ul>
 	

<li><b>Bsdfan</b></li>


</ul>




<h4 style="margin-top: 25px; font-size: 17px;">Top Contributors (15)</h4>


--></p>
<ul>
<li>Justin Presley</li>
<li>Phillip C Dean</li>
<li>Sirake</li>
<li>drew hannah</li>
<li>Greg Herrera</li>
<li>chris</li>
<li>Jerome Massey</li>
<li>leovdpauw</li>
<li>Robert Butler</li>
<li>Mark Fingerhuth</li>
<li>Wales Mack</li>
<li>Jonathan Llovet</li>
<li>David Myers</li>
<li>Karthik</li>
<li>Michael Zoitas</li>
</ul>
<hr style="border: 0; border-bottom: 1px dotted #ddd;"/>
<p><b>Thank You!</b> If you would like to have your name listed as a contributor and support the website, you can do so through <a href="https://www.patreon.com/coreyms" rel="noopener noreferrer" target="_blank">my Patreon Page</a>. I am extremely grateful for any support.</p>
</div>
</div></section>
<section class="widget widget_search" id="search-3"><div class="widget-wrap"><h4 class="widget-title widgettitle">Search CoreyMS.com</h4>
<form action="https://coreyms.com/" class="search-form" itemprop="potentialAction" itemscope="" itemtype="https://schema.org/SearchAction" method="get" role="search"><input class="search-form-input" id="searchform-5dc42e3cc04f82.38756873" itemprop="query-input" name="s" placeholder="Search this website" type="search"/><input class="search-form-submit" type="submit" value="Search"/><meta content="https://coreyms.com/?s={s}" itemprop="target"/></form></div></section>
<section class="widget enews-widget" id="enews-ext-4"><div class="widget-wrap"><div class="enews"><h4 class="widget-title widgettitle">Subscribe to Future Posts</h4>
<form action="//coreyms.us9.list-manage.com/subscribe/post?u=f4df8a0f0be5d3754ed52b1ef&amp;id=5b06358625" id="subscribeenews-ext-4" method="post" name="enews-ext-4" onsubmit="if ( subbox1.value == 'First Name') { subbox1.value = ''; } if ( subbox2.value == 'Last Name') { subbox2.value = ''; }" target="_blank">
<label class="screenread" for="subbox1">First Name</label><input class="enews-subbox" id="subbox1" name="FNAME" placeholder="First Name" type="text" value=""/> <label class="screenread" for="subbox">E-Mail Address</label><input id="subbox" name="EMAIL" placeholder="E-Mail Address" required="required" type="email" value=""/>
<input id="subbutton" type="submit" value="Subscribe"/>
</form>
</div></div></section>
<section class="widget widget_text" id="text-2"><div class="widget-wrap"><h4 class="widget-title widgettitle">Recommended Books</h4>
<div class="textwidget"><a href="https://www.amazon.com/gp/product/1449355730/ref=as_li_tl?ie=UTF8&amp;camp=1789&amp;creative=9325&amp;creativeASIN=1449355730&amp;linkCode=as2&amp;tag=coreyms-20&amp;linkId=2f9ceaf471d7d35f2c2657051780fc6f" target="_blank"><img border="0" class="widget_book" src="//ws-na.amazon-adsystem.com/widgets/q?_encoding=UTF8&amp;MarketPlace=US&amp;ASIN=1449355730&amp;ServiceVersion=20070822&amp;ID=AsinImage&amp;WS=1&amp;Format=_SL250_&amp;tag=coreyms-20"/></a><img alt="" border="0" height="1" src="//ir-na.amazon-adsystem.com/e/ir?t=coreyms-20&amp;l=am2&amp;o=1&amp;a=1449355730" style="border:none !important; margin:0px !important;" width="1"/>
<a href="https://www.amazon.com/gp/product/1491946008/ref=as_li_tl?ie=UTF8&amp;camp=1789&amp;creative=9325&amp;creativeASIN=1491946008&amp;linkCode=as2&amp;tag=coreyms-20&amp;linkId=39335cdc340fb7ce5bd51d59c57e7e54" target="_blank"><img border="0" class="widget_book" src="//ws-na.amazon-adsystem.com/widgets/q?_encoding=UTF8&amp;MarketPlace=US&amp;ASIN=1491946008&amp;ServiceVersion=20070822&amp;ID=AsinImage&amp;WS=1&amp;Format=_SL250_&amp;tag=coreyms-20"/></a><img alt="" border="0" height="1" src="//ir-na.amazon-adsystem.com/e/ir?t=coreyms-20&amp;l=am2&amp;o=1&amp;a=1491946008" style="border:none !important; margin:0px !important;" width="1"/>
<a href="https://www.amazon.com/gp/product/1593276036/ref=as_li_tl?ie=UTF8&amp;camp=1789&amp;creative=9325&amp;creativeASIN=1593276036&amp;linkCode=as2&amp;tag=coreyms-20&amp;linkId=75ff844a147bc8cb5fb325608b286158" target="_blank"><img border="0" class="widget_book" src="//ws-na.amazon-adsystem.com/widgets/q?_encoding=UTF8&amp;MarketPlace=US&amp;ASIN=1593276036&amp;ServiceVersion=20070822&amp;ID=AsinImage&amp;WS=1&amp;Format=_SL250_&amp;tag=coreyms-20"/></a><img alt="" border="0" height="1" src="//ir-na.amazon-adsystem.com/e/ir?t=coreyms-20&amp;l=am2&amp;o=1&amp;a=1593276036" style="border:none !important; margin:0px !important;" width="1"/>
<a href="https://www.amazon.com/gp/product/0984782850/ref=as_li_tl?ie=UTF8&amp;camp=1789&amp;creative=9325&amp;creativeASIN=0984782850&amp;linkCode=as2&amp;tag=coreyms-20&amp;linkId=e2f7c21906426f17958a1d04718e7d02" target="_blank"><img border="0" class="widget_book" src="//ws-na.amazon-adsystem.com/widgets/q?_encoding=UTF8&amp;MarketPlace=US&amp;ASIN=0984782850&amp;ServiceVersion=20070822&amp;ID=AsinImage&amp;WS=1&amp;Format=_SL250_&amp;tag=coreyms-20"/></a><img alt="" border="0" height="1" src="//ir-na.amazon-adsystem.com/e/ir?t=coreyms-20&amp;l=am2&amp;o=1&amp;a=0984782850" style="border:none !important; margin:0px !important;" width="1"/>
<a href="https://www.amazon.com/gp/product/020161622X/ref=as_li_tl?ie=UTF8&amp;camp=1789&amp;creative=9325&amp;creativeASIN=020161622X&amp;linkCode=as2&amp;tag=coreyms-20&amp;linkId=a2699f6b6cb5814da54f71140c52f2ca" target="_blank"><img border="0" class="widget_book" src="//ws-na.amazon-adsystem.com/widgets/q?_encoding=UTF8&amp;MarketPlace=US&amp;ASIN=020161622X&amp;ServiceVersion=20070822&amp;ID=AsinImage&amp;WS=1&amp;Format=_SL250_&amp;tag=coreyms-20"/></a><img alt="" border="0" height="1" src="//ir-na.amazon-adsystem.com/e/ir?t=coreyms-20&amp;l=am2&amp;o=1&amp;a=020161622X" style="border:none !important; margin:0px !important;" width="1"/>
<a href="https://www.amazon.com/gp/product/0201835959/ref=as_li_tl?ie=UTF8&amp;camp=1789&amp;creative=9325&amp;creativeASIN=0201835959&amp;linkCode=as2&amp;tag=coreyms-20&amp;linkId=c3de80ab4a4761f7634751cf323af13f" target="_blank"><img border="0" class="widget_book" src="//ws-na.amazon-adsystem.com/widgets/q?_encoding=UTF8&amp;MarketPlace=US&amp;ASIN=0201835959&amp;ServiceVersion=20070822&amp;ID=AsinImage&amp;WS=1&amp;Format=_SL250_&amp;tag=coreyms-20"/></a><img alt="" border="0" height="1" src="//ir-na.amazon-adsystem.com/e/ir?t=coreyms-20&amp;l=am2&amp;o=1&amp;a=0201835959" style="border:none !important; margin:0px !important;" width="1"/>
</div>
</div></section>
<section class="widget widget_text" id="text-3"><div class="widget-wrap"><h4 class="widget-title widgettitle">Podcasts I Listen To</h4>
<div class="textwidget"><u>Tech Related</u>:<br/>
<a href="http://talkpython.fm/">Talk Python To Me</a>
<br/>
<a href="http://shoptalkshow.com/">Shoptalk Show</a>
<br/>
<a href="http://www.se-radio.net/">Software Engineering Radio</a>
<br/>
<a href="http://hanselminutes.com/">HanselMinutes</a>
<br/>
<a href="https://blog.codepen.io/radio/">CodePen Radio</a>
<br/><br/>
<u>Non-Tech Related</u>:
<br/>
<a href="http://www.dancarlin.com/hardcore-history-series/">Dan Carlin's Hardcore History</a>
<br/>
<a href="http://www.billburr.com/podcast">Bill Burr's Monday Morning Podcast</a>
<br/>
<a href="http://www.samharris.org/podcast">Waking Up with Sam Harris</a>
<br/>
<a href="http://www.startalkradio.net/shows-archive/">StarTalk Radio</a>
<br/>
<a href="http://carasantamaria.com/podcast/">Talk Nerdy with Cara Santa Maria</a>
</div>
</div></section>
</aside></div></div><footer class="site-footer" itemscope="" itemtype="https://schema.org/WPFooter"><div class="wrap"><p>© 2019 · <a href="http://coreyms.com">CoreyMS</a> · Corey Schafer</p></div></footer></div><link href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/8.4/styles/zenburn.min.css" rel="stylesheet"/>
<script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/8.4/highlight.min.js"></script>
<script>hljs.initHighlightingOnLoad();</script><script type="text/javascript">
/* <![CDATA[ */
var wpcf7 = {"apiSettings":{"root":"https:\/\/coreyms.com\/wp-json\/contact-form-7\/v1","namespace":"contact-form-7\/v1"},"cached":"1"};
/* ]]> */
</script>
<script src="https://coreyms.com/wp-content/cache/minify/0fef6.js" type="text/javascript"></script>
<script type="text/javascript">
/* <![CDATA[ */
var countVars = {"disqusShortname":"coreyms"};
/* ]]> */
</script>
<script src="https://coreyms.com/wp-content/cache/minify/f8767.js" type="text/javascript"></script>
<script src="https://s0.wp.com/wp-content/js/devicepx-jetpack.js?ver=201945" type="text/javascript"></script>
<script src="https://coreyms.com/wp-content/cache/minify/34c40.js" type="text/javascript"></script>
<script async="async" defer="defer" src="https://stats.wp.com/e-201945.js" type="text/javascript"></script>
<script type="text/javascript">
	_stq = window._stq || [];
	_stq.push([ 'view', {v:'ext',j:'1:7.3.1',blog:'70676981',post:'0',tz:'-5',srv:'coreyms.com'} ]);
	_stq.push([ 'clickTrackerInit', '70676981', '0' ]);
</script>
</body></html>
<!--
Performance optimized by W3 Total Cache. Learn more: https://www.w3-edge.com/products/

Page Caching using disk: enhanced (SSL caching disabled) 
Minified using disk

Served from: coreyms.com @ 2019-11-07 09:46:20 by W3 Total Cache
-->>
  1. Miremos el primer articulo existente en esta página web:
In [96]:
article = soup.find('article')
print(article)
<article class="post-1665 post type-post status-publish format-standard has-post-thumbnail category-development category-python tag-data-analysis tag-data-science tag-stack-overflow entry" itemscope="" itemtype="https://schema.org/CreativeWork"><header class="entry-header"><h2 class="entry-title" itemprop="headline"><a class="entry-title-link" href="https://coreyms.com/development/python/python-data-science-tutorial-analyzing-the-2019-stack-overflow-developer-survey" rel="bookmark">Python Data Science Tutorial: Analyzing the 2019 Stack Overflow Developer Survey</a></h2>
<p class="entry-meta"><time class="entry-time" datetime="2019-10-17T12:35:51+00:00" itemprop="datePublished">October 17, 2019</time> by <span class="entry-author" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><a class="entry-author-link" href="https://coreyms.com/author/coreymschafer" itemprop="url" rel="author"><span class="entry-author-name" itemprop="name">Corey Schafer</span></a></span> <span class="entry-comments-link"><a href="https://coreyms.com/development/python/python-data-science-tutorial-analyzing-the-2019-stack-overflow-developer-survey#respond"><span class="dsq-postid" data-dsqidentifier="1665 http://coreyms.com/?p=1665">Leave a Comment</span></a></span> </p></header><div class="entry-content" itemprop="text">
<p>In this Python Programming video, we will be learning how to download and analyze real-world data from the 2019 Stack Overflow Developer Survey. This is terrific practice for anyone getting into the data science field. We will learn different ways to analyze this data and also some best practices. Let’s get started…</p>
<figure class="wp-block-embed-youtube wp-block-embed is-type-video is-provider-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<span class="embed-youtube" style="text-align:center; display: block;"><iframe allowfullscreen="true" class="youtube-player" height="360" src="https://www.youtube.com/embed/_P7X8tMplsw?version=3&amp;rel=1&amp;fs=1&amp;autohide=2&amp;showsearch=0&amp;showinfo=1&amp;iv_load_policy=1&amp;wmode=transparent" style="border:0;" type="text/html" width="640"></iframe></span>
</div></figure>
</div><footer class="entry-footer"><p class="entry-meta"><span class="entry-categories">Filed Under: <a href="https://coreyms.com/category/development" rel="category tag">Development</a>, <a href="https://coreyms.com/category/development/python" rel="category tag">Python</a></span> <span class="entry-tags">Tagged With: <a href="https://coreyms.com/tag/data-analysis" rel="tag">data analysis</a>, <a href="https://coreyms.com/tag/data-science" rel="tag">Data Science</a>, <a href="https://coreyms.com/tag/stack-overflow" rel="tag">stack overflow</a></span></p></footer></article>
  1. Obtengamos el titulo de este primer articulo:
In [97]:
headline = article.h2.text
print(headline)
Python Data Science Tutorial: Analyzing the 2019 Stack Overflow Developer Survey
  1. Obtengamos el resumen de este primer articulo:
In [98]:
resumen = article.find('div', class_='entry-content')
print(resumen.p.text)
In this Python Programming video, we will be learning how to download and analyze real-world data from the 2019 Stack Overflow Developer Survey. This is terrific practice for anyone getting into the data science field. We will learn different ways to analyze this data and also some best practices. Let’s get started…
  1. Obtengamos el link al video de este articulo:
In [99]:
link_video = article.find('iframe',class_="youtube-player")
#Recuerde que los objetos html son retornados como diccionarios,
#Así pues, podemos acceder a un valor con la clave especifica.
print(link_video)
print("\n")
print("Y el link del video es: ")
src_link = link_video['src']
print(src_link)
<iframe allowfullscreen="true" class="youtube-player" height="360" src="https://www.youtube.com/embed/_P7X8tMplsw?version=3&amp;rel=1&amp;fs=1&amp;autohide=2&amp;showsearch=0&amp;showinfo=1&amp;iv_load_policy=1&amp;wmode=transparent" style="border:0;" type="text/html" width="640"></iframe>


Y el link del video es: 
https://www.youtube.com/embed/_P7X8tMplsw?version=3&rel=1&fs=1&autohide=2&showsearch=0&showinfo=1&iv_load_policy=1&wmode=transparent

Como vemos ya obtuvimos el link del video, pero este se encuentra en formato embebido, veamos como obtener el id del video:

In [100]:
video_split = src_link.split("/")
print(video_split)
['https:', '', 'www.youtube.com', 'embed', '_P7X8tMplsw?version=3&rel=1&fs=1&autohide=2&showsearch=0&showinfo=1&iv_load_policy=1&wmode=transparent']

Vemos que el id del video se encuentra después del string embed, entonces se itera sobre la lista para obtener el valor de la misma en el index embed+1:

In [101]:
aux = video_split[video_split.index("embed")+1]
print(aux)
_P7X8tMplsw?version=3&rel=1&fs=1&autohide=2&showsearch=0&showinfo=1&iv_load_policy=1&wmode=transparent

Como vemos ya obtuvimos el id del video, sin embargo falta filtrar los parámetros no deseados, veamos:

In [102]:
video_id = aux.split("?")[0]
print(video_id)
_P7X8tMplsw

Ahora haremos una solicitud a youtube para que abra nuestro id de video:

In [103]:
yt_link = (f'https://youtube.com/watch?v={video_id}')
print(yt_link)
https://youtube.com/watch?v=_P7X8tMplsw

Ahora si queremos obtener todos los videos embebidos en la página solicitada sólo tendríamos que iterar este código sobre todos los articulos:

In [104]:
src_link = []
for article in soup.find_all('article'):
    headline = article.h2.text
    link_video = article.find('iframe', class_='youtube-player')    
    #print(link_video)
    #------------------------------------------------------------
    try:
        src_link.append(link_video['src'])        
    except:
        pass
    #---------------------------------------------------------------

Como vemos se utilizo un bloque try:except dado que cabe la posibilidad que nos encontremos con un tag que no contenga información y esto retornará un objeto vacío el cual nos creará problemas si no encapsulamos el error. Por ultimo se tiene una lista con todos los links encontrados:

In [105]:
print(src_link)
['https://www.youtube.com/embed/_P7X8tMplsw?version=3&rel=1&fs=1&autohide=2&showsearch=0&showinfo=1&iv_load_policy=1&wmode=transparent', 'https://www.youtube.com/embed/fKl2JW_qrso?version=3&rel=1&fs=1&autohide=2&showsearch=0&showinfo=1&iv_load_policy=1&wmode=transparent', 'https://www.youtube.com/embed/IEEhzQoKtQU?version=3&rel=1&fs=1&autohide=2&showsearch=0&showinfo=1&iv_load_policy=1&wmode=transparent', 'https://www.youtube.com/embed/mO_dS3rXDIs?version=3&rel=1&fs=1&autohide=2&showsearch=0&showinfo=1&iv_load_policy=1&wmode=transparent', 'https://www.youtube.com/embed/2Fp1N6dof0Y?version=3&rel=1&fs=1&autohide=2&showsearch=0&showinfo=1&iv_load_policy=1&wmode=transparent', 'https://www.youtube.com/embed/-nh9rCzPJ20?version=3&rel=1&fs=1&autohide=2&showsearch=0&showinfo=1&iv_load_policy=1&wmode=transparent', 'https://www.youtube.com/embed/06I63_p-2A4?version=3&rel=1&fs=1&autohide=2&showsearch=0&showinfo=1&iv_load_policy=1&wmode=transparent', 'https://www.youtube.com/embed/_JGmemuINww?version=3&rel=1&fs=1&autohide=2&showsearch=0&showinfo=1&iv_load_policy=1&wmode=transparent', 'https://www.youtube.com/embed/zdJEYhA2AZQ?version=3&rel=1&fs=1&autohide=2&showsearch=0&showinfo=1&iv_load_policy=1&wmode=transparent']

Ahora filtremos estos links para obtener la id del video de cada uno de los videos:

In [106]:
video_id = []
for link in src_link:
    video_split = link.split("/")
    aux = video_split[video_split.index("embed")+1]
    video_id.append(aux.split("?")[0])
print(video_id)
['_P7X8tMplsw', 'fKl2JW_qrso', 'IEEhzQoKtQU', 'mO_dS3rXDIs', '2Fp1N6dof0Y', '-nh9rCzPJ20', '06I63_p-2A4', '_JGmemuINww', 'zdJEYhA2AZQ']

PERFECTO! ya tenemos una lista que contiene los id's de los videos, ahora armemos los link's completo:

In [107]:
yt_links = []
for id_video in video_id:
    yt_links.append(f'https://youtube.com/watch?v={id_video}')
In [108]:
for yt_link in yt_links:
    print(yt_link)
https://youtube.com/watch?v=_P7X8tMplsw
https://youtube.com/watch?v=fKl2JW_qrso
https://youtube.com/watch?v=IEEhzQoKtQU
https://youtube.com/watch?v=mO_dS3rXDIs
https://youtube.com/watch?v=2Fp1N6dof0Y
https://youtube.com/watch?v=-nh9rCzPJ20
https://youtube.com/watch?v=06I63_p-2A4
https://youtube.com/watch?v=_JGmemuINww
https://youtube.com/watch?v=zdJEYhA2AZQ

Ahora guardemos todos estos links en un archovo .csv:

In [49]:
import csv
In [111]:
csv_file = open('links_youtube_coreySchafer.csv', 'w')
csv_writer = csv.writer(csv_file)
csv_writer.writerow(['item','Video youtube'])
cont = 1
for yt_link in yt_links:    
    csv_writer.writerow([cont,yt_link])
    cont = cont + 1
csv_file.close()

Y se obtiene:

respuesta_csv

separador_dos

logomintic

Parte Platzi:

Este jupyter notebook es para repasar los conceptos del curso "ingeniería en ciencia de datos" entre mintic y platzi:

  1. Primero realizamos la solicitud de html a la url de platzi:
In [18]:
respuesta_platzi = requests.get('https://platzi.com/')
  1. Verificamos que nos hayan contestado:
In [19]:
print(respuesta_platzi.status_code)
print(respuesta_platzi.ok)
200
True

Vemos que platzi nos contesto y ya obtuvimos la respuesta a la url solicitada, veamos que nos dijieron:

  1. Primero los headers:
In [20]:
print(respuesta_platzi.headers)
{'Date': 'Sat, 09 Nov 2019 21:41:18 GMT', 'Content-Type': 'text/html; charset=utf-8', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'Set-Cookie': '__cfduid=d6c075e6500d13a3b01d94d0ace6f7a8b1573335677; expires=Sun, 08-Nov-20 21:41:17 GMT; path=/; domain=.platzi.com; HttpOnly', 'Access-Control-Allow-Credentials': 'true', 'Access-Control-Allow-Headers': 'X-Requested-With,content-type,X-CSRFToken', 'Access-Control-Allow-Methods': 'GET, POST', 'Access-Control-Allow-Origin': '*', 'Strict-Transport-Security': 'max-age=86400; includeSubDomains', 'Vary': 'Accept-Encoding', 'X-Content-Type-Options': 'nosniff', 'X-DNS-Prefetch-Control': 'off', 'X-Download-Options': 'noopen', 'X-Frame-Options': 'SAMEORIGIN', 'X-Permitted-Cross-Domain-Policies': 'none', 'X-XSS-Protection': '1; mode=block', 'CF-Cache-Status': 'DYNAMIC', 'Expect-CT': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', 'Server': 'cloudflare', 'CF-RAY': '5332f3336aecc89f-MIA', 'Content-Encoding': 'gzip'}
In [21]:
print(respuesta_platzi.headers['date'])
Sat, 09 Nov 2019 21:41:18 GMT
In [22]:
print(respuesta_platzi.headers['CF-RAY'])
5332f3336aecc89f-MIA
  1. La respuesta completa en html:
In [23]:
print(respuesta_platzi.text)
    <!doctype html>
      <html lang="es">
        <head>
          
          <meta name="viewport" content="width=device-width, initial-scale=1" />
          <title>Cursos Online Profesionales de Tecnología | ‎🚀 Platzi</title>
          <link rel="stylesheet" href="https://static.platzi.com/bff/assets/home.fd4b74f529f2f824400f.css" type="text/css" />
          <link rel="shortcut icon" href="//static.platzi.com/media/favicons/platzi_favicon.png" />
          <link rel="icon" sizes="192x192" href="//static.platzi.com/media/favicons/platzi_favicon.png">
          <link rel="alternate" type="application/rss+xml" title="RSS 2.0" href="" />
          <meta name="description" content="Aprende desde cero a crear el futuro web con nuestros Cursos Online Profesionales de Tecnología. ¡Cursos Únicos de Desarrollo, Diseño, Marketing y Negocios!">
          <meta name = "theme-color" content = "#15210B" />

          <meta property="fb:app_id" content="263680607075199" />
          <meta property="fb:admins" content="1030603473" />
          <meta property="og:description" content="Aprende desde cero a crear el futuro web con nuestros Cursos Online Profesionales de Tecnología. ¡Cursos Únicos de Desarrollo, Diseño, Marketing y Negocios!"/>
          <meta property="og:title" content="Cursos Online Profesionales de Tecnología | ‎🚀 Platzi" />
          <meta property="og:type" content="website" />
          <meta property="og:url" content="https://platzi.com" />
          <meta property="og:image" content="https://static.platzi.com/media/meta_tags/og/social.0e9a162f1dba.jpg" />
          <meta property="og:site_name" content="https://platzi.com" />

          <meta property="twitter:account_id" content="4503599630205252" />
          <meta name="twitter:card" content="summary_large_image" />
          <meta name="twitter:site" content="@Platzi" />
          <meta name="twitter:title" content="Cursos Online Profesionales de Tecnología | ‎🚀 Platzi" />
          <meta name="twitter:description" content="Aprende desde cero a crear el futuro web con nuestros Cursos Online Profesionales de Tecnología. ¡Cursos Únicos de Desarrollo, Diseño, Marketing y Negocios!" />
          <meta name="twitter:creator" content="@Platzi" />
          <meta name="twitter:image:src" content="https://static.platzi.com/media/meta_tags/og/social.0e9a162f1dba.jpg" />
          <meta name="twitter:domain" content="https://platzi.com" />

          <script rel="preconnect" async>
            (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
                (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
                m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
            })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

            window.ga=window.ga||function(){(ga.q=ga.q||[]).push(arguments)};ga.l=+new Date;
            null

            // Create Trackers
            ga('create', 'UA-76863-18', 'auto', 'platziPublicES');
            ga('create', 'UA-76863-27', 'auto', 'platziFull');

            // Require Plugins for platziPublicES
            ga('platziPublicES.require', 'ecommerce');
            ga('platziPublicES.require', 'outboundLinkTracker');
            ga('platziPublicES.require', 'socialWidgetTracker');

            // If userId, update userId
            null

            //Send Pageview
            ga('platziPublicES.send', 'pageview');
            ga('platziFull.send', 'pageview');

            null
          </script>

          <script rel="preconnect" async src="https://www.googletagmanager.com/gtag/js?id=AW-759649979"></script>
          <script async>
            window.dataLayer = window.dataLayer || [];
            function gtag(){dataLayer.push(arguments);}
            gtag('js', new Date());

            gtag('config', 'AW-759649979');
          </script>

          <!-- Autotrack plugin for Google Analytics -->
          <script rel="preconnect" async src="https://cdnjs.cloudflare.com/ajax/libs/autotrack/2.4.1/autotrack.js"></script>
          
          <!-- Facebook Pixel Code -->
          <script rel="preconnect" async>
            !function(f,b,e,v,n,t,s)
            {if(f.fbq)return;n=f.fbq=function(){n.callMethod?
              n.callMethod.apply(n,arguments):n.queue.push(arguments)};
              if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';
              n.queue=[];t=b.createElement(e);t.async=!0;
              t.src=v;s=b.getElementsByTagName(e)[0];
              s.parentNode.insertBefore(t,s)}(window, document,'script',
              'https://connect.facebook.net/en_US/fbevents.js');
            fbq('init', '1545967215651797');
            fbq('track', 'PageView');

            null
          </script>
          <noscript>
            <img
              height="1"
              width="1"
              style="display:none"
              src="https://www.facebook.com/tr?id=1545967215651797&ev=PageView&noscript=1"
            />
          </noscript>

          <script rel="preconnect" async type="text/javascript">
            _linkedin_data_partner_id = "274754";
            </script><script type="text/javascript" async>
            (function(){var s = document.getElementsByTagName("script")[0];
            var b = document.createElement("script");
            b.type = "text/javascript";b.async = true;
            b.src = "https://snap.licdn.com/li.lms-analytics/insight.min.js";
            s.parentNode.insertBefore(b, s);})();
          </script>
          <noscript>
            <img height="1" width="1" style="display:none;" alt="" src="https://dc.ads.linkedin.com/collect/?pid=274754&fmt=gif" />
          </noscript>
          <!-- End Analytics and FB Pixel Code -->

          <!-- Reddit Conversion Pixel -->
          <script rel="preconnect" async>
            !function(w,d){if(!w.rdt){var p=w.rdt=function(){p.sendEvent?p.sendEvent.apply(p,arguments):p.callQueue.push(arguments)};p.callQueue=[];var t=d.createElement("script");t.src="https://www.redditstatic.com/ads/pixel.js",t.async=!0;var s=d.getElementsByTagName("script")[0];s.parentNode.insertBefore(t,s)}}(window,document);rdt('init','t2_3b2gfq1n');rdt('track', 'PageVisit');
          </script>
          <!-- DO NOT MODIFY -->
          <!-- End Reddit Conversion Pixel -->
          <!-- Twitter universal website tag code -->
          <script rel="preconnect" async>
            !function(e,t,n,s,u,a){e.twq||(s=e.twq=function(){s.exe?s.exe.apply(s,arguments):s.queue.push(arguments);
            },s.version='1.1',s.queue=[],u=t.createElement(n),u.async=!0,u.src='//static.ads-twitter.com/uwt.js',
                a=t.getElementsByTagName(n)[0],a.parentNode.insertBefore(u,a))}(window,document,'script');
            // Insert Twitter Pixel ID and Standard Event data below
            twq('init','nyfpx');
            twq('track','PageView');
          </script>
          <!-- End Twitter universal website tag code -->

          <!-- Hotjar Tracking Code for www.platzi.com -->
          <script rel="preconnect" async>
            (function(h,o,t,j,a,r){
                h.hj=h.hj||function(){(h.hj.q=h.hj.q||[]).push(arguments)};
                h._hjSettings={hjid:430680,hjsv:5};
                a=o.getElementsByTagName('head')[0];
                r=o.createElement('script');r.async=1;
                r.src=t+h._hjSettings.hjid+j+h._hjSettings.hjsv;
                a.appendChild(r);
            })(window,document,'//static.hotjar.com/c/hotjar-','.js?sv=');
          </script>
          <style>
            .Modal-wrapper {
            -webkit-transition: all 0.5s;
            -moz-transition: all 0.5s;
            -o-transition: all 0.5s;
            -ms-transition: all 0.5s;
            transition: all 0.5s;
            position: absolute;
            z-index: 8;
            display: -webkit-box;
            display: -moz-box;
            display: -webkit-flex;
            display: -ms-flexbox;
            display: box;
            display: flex;
            -webkit-box-pack: center;
            -moz-box-pack: center;
            -o-box-pack: center;
            -ms-flex-pack: center;
            -webkit-justify-content: center;
            justify-content: center;
            -webkit-box-align: center;
            -moz-box-align: center;
            -o-box-align: center;
            -ms-flex-align: center;
            -webkit-align-items: center;
            align-items: center;
            top: 0;
            bottom: 0;
            left: 0;
            right: 0;
            -webkit-transform: translateY(-100vh);
            -moz-transform: translateY(-100vh);
            -o-transform: translateY(-100vh);
            -ms-transform: translateY(-100vh);
            transform: translateY(-100vh);
            opacity: 0;
            -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";
            -webkit-filter: alpha(opacity=0);
            -moz-filter: alpha(opacity=0);
            -ms-filter: alpha(opacity=0);
            -o-filter: alpha(opacity=0);
            filter: alpha(opacity=0);
            }
            .Modal-wrapper.showModal {
            -webkit-transform: translateY(0vh);
            -moz-transform: translateY(0vh);
            -o-transform: translateY(0vh);
            -ms-transform: translateY(0vh);
            transform: translateY(0vh);
            opacity: 1;
            -ms-filter: none;
            -webkit-filter: none;
            -moz-filter: none;
            -ms-filter: none;
            -o-filter: none;
            filter: none;
            }
            .Modal-overlay {
            background-color: rgba(0,0,0,0.7);
            position: fixed;
            width: 100%;
            height: 100%;
            top: 0;
            left: 0;
            right: 0;
            bottom: 0;
            z-index: 8;
            cursor: pointer;
            }
          </style>
        </head >
        <body>
          <div id=home><div class="Home"><div class="BaseLayout"><div><div class="Modal"><div class="Modal-wrapper"><div class="ModalContact-content"><div class="ModalContact-close"><span class="icon-delete"></span></div><div class="ModalContact-logo"><span class="icon-cloud-smile"></span></div><div class="row"><div class="col-xs-12"><h3 class="ModalContact-title"><span>¿Tienes dudas o quieres comunicarte con nosotros? </span></h3><p class="ModalContact-subtitle"><span>Elige el medio que más te convenga, te sugerimos </span><strong>Email</strong></p></div><div class="col-xs-6 col-sm-4"><div class="ModalContact-item"><figure><img loading="lazy" src="https://static.platzi.com/bff/image/canal_mail-874601788dcde8cc0fd0d5948f870f04.png" width="40" alt="Email"/></figure><div class="ModalContact-checkbox"><div class="ModalContact-name">Email</div></div><div class="ModalContact-label"><span class="is-link"><a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="710514101c31011d10050b185f121e1c">[email&#160;protected]</a></span></div><div class="ModalContact-link"><a href="/cdn-cgi/l/email-protection#0c78696d614c7c606d787665226f6361" target="_top"></a></div></div></div><div class="col-xs-6 col-sm-4"><div class="ModalContact-item"><figure><img loading="lazy" src="https://static.platzi.com/bff/image/canal_whatsapp-204801dac07a3d0b320ef3ed6db59a98.png" width="40" alt="Whatsapp"/></figure><div class="ModalContact-checkbox"><div class="ModalContact-name">Whatsapp</div></div><div class="ModalContact-label"><span class="is-link">Escríbenos</span></div><div class="ModalContact-link"><a href="https://platzi.com/whatsapp" target="_blank" rel="noreferrer"></a></div></div></div><div class="col-xs-6 col-sm-4"><div class="ModalContact-item"><figure><img loading="lazy" src="https://static.platzi.com/bff/image/canal_messenger-116bde29e29e905dad91d956db999f98.png" width="40" alt="FB Messenger"/></figure><div class="ModalContact-checkbox"><div class="ModalContact-name">FB Messenger</div></div><div class="ModalContact-label"><span class="is-link">Escríbenos</span></div><div class="ModalContact-link"><a href="https://www.messenger.com/t/platzi" target="_blank" rel="noreferrer"></a></div></div></div></div></div></div></div><div class="Header-v2 Header-v2-content"><div class="Logo"><div class="LogoHeader"><div class="LogoHeader-container"><figure><img loading="lazy" src="https://static.platzi.com/bff/image/isotipoPlatzi-442ccc1186a9806e18c9889cc301ffe1.png" alt="Platzi isotipo" height="25"/></figure><figure class="LogoHeader-name"><img loading="lazy" src="https://static.platzi.com/bff/image/logotipo-platzi-768799552e5f26369e21a807b8a533f7.png" alt="Platzi Logo" height="25"/></figure></div><a href="/" class="LogoHeader-link"></a></div></div><div class="Nav-header"><div class="Actionsv2"><div><div class="Actionsv2-menu"><div class="isDesktop"><span>Iniciar mi plan</span></div><div class="isMobile"><span>Planes</span></div><i class="icon-arrow-down toggle-down"></i></div></div></div><div class="Menu"><div class="Menu-dropdown"><div class="Menu-title"><span>Menú</span></div></div><div class="Menu-content"><div><ul class="Menu-list"><li class="Menu-list-item"><a href="/cursos/"><div>Cursos</div></a></li><li class="Menu-list-item"><a href="/blog/"><div>Blog</div></a></li><li class="Menu-list-item"><a href="/foro/"><div>Foro</div></a></li><li class="Menu-list-item"><a href="/agenda/"><div>Agenda</div></a></li><li class="Menu-list-item"><a href="/live/"><div>TV</div></a></li><li class="Menu-list-item"><div><div>Contáctanos</div></div></li></ul></div></div></div><div class="ButtonLogin showButton"><div><a href="/login/" class="btn btn-green btn--small"><span>Iniciar sesión</span></a></div></div><div class="MiniSearch is-tablet"><div class="MiniSearch-button MiniSearch-show"><span class="icon-search"></span></div></div><div class="MiniSearch is-desktop"><div class="Searchv"><div class="Searchv-content"><form action="/search/" class=""><input type="text" placeholder="Buscar en Platzi" name="search" autoComplete="off"/><button class="Searchv-icon"><span class="icon-search"></span></button></form></div><div class="Searchv-results"></div></div></div></div></div></div><div class="LayoutContainer"><div class="HeroContent"><div class="HeroContent-container"><div class="HeroContent-content"><div class="HeroContent-title"><h1><span>La escuela online de formación profesional en tecnología</span></h1></div><div class="HeroContent-stats"><div class="HeroContent-elements"><div class="HeroContent-stats-item"><span>70<i>%</i></span><span>de los graduados de Platzi <br/> duplican sus ingresos</span></div><div class="HeroContent-stats-item"><span>20<i>%</i></span><span>crean su propia empresa <br/> de tecnología o startup</span></div><div class="HeroContent-image"></div></div></div><div class="HeroContent-action"><a href="/precios/" class="btn btn-green"><span>Regístrate a un curso nuevo</span></a><div class="HeroContent-firstClass"><button class="btn btn-sky firstClass"><span>Toma tu primera clase</span></button></div></div><div class="Modal"><div class="Modal-wrapper"><div class="FirstClass"><div class="FirstClass-title"><h2><span>Toma tu primera clase</span></h2><i class="icon-delete"></i></div><div class="FirstClass-image"></div><div class="FirstClass-list"><div class="FirstClass-item"><div class="SearchResults-badge"><figure><img loading="lazy" src="https://static.platzi.com/media/achievements/badge-diseno-interfaces-ux-f4591d4c-0fda-4e3b-bbbb-38bb0a61e724.png" alt="Curso de Diseño de Interfaces y UX 2017"/></figure></div><div class="FirstClass-content"><h3>Curso de Diseño de Interfaces y UX 2017</h3><div class="FirstClass-arrow"></div></div><a href="/clases/1140-diseno-interfaces-ux-2017/7411-introduccion-a-ux/"></a></div><div class="FirstClass-item"><div class="SearchResults-badge"><figure><img loading="lazy" src="https://static.platzi.com/media/achievements/1328-bdfaf9ae-05e1-44c3-9c14-fccbb491a7d3.png" alt="Curso de Introducción al Marketing Digital"/></figure></div><div class="FirstClass-content"><h3>Curso de Introducción al Marketing Digital</h3><div class="FirstClass-arrow"></div></div><a href="/clases/1328-introduccion-marketing/12361-bienvenida-e-introduccion/"></a></div><div class="FirstClass-item"><div class="SearchResults-badge"><figure><img loading="lazy" src="https://static.platzi.com/media/achievements/1050-bfb74f83-8e2e-4ff7-a66d-77d2c0067908.png" alt="Curso Gratis de Programación Básica"/></figure></div><div class="FirstClass-content"><h3>Curso Gratis de Programación Básica</h3><div class="FirstClass-arrow"></div></div><a href="/clases/1050-programacion-basica/5103-mi-primera-linea-de-codigo/"></a></div><div class="FirstClass-item"><div class="SearchResults-badge"><figure><img loading="lazy" src="https://static.platzi.com/media/achievements/badge-ing-software-2017-18f503fd-36bd-42d8-b1a1-492865659687.png" alt="Fundamentos de Ingeniería de Software"/></figure></div><div class="FirstClass-content"><h3>Fundamentos de Ingeniería de Software</h3><div class="FirstClass-arrow"></div></div><a href="/clases/1098-ingenieria/6552-que-es-un-system-on-a-chip/"></a></div></div></div></div></div></div><div class="HeroContent-bottom"><figure><img loading="lazy" src="https://static.platzi.com/bff/image/hero_bottom-6697ce26d6a643d83306e07e93b170d9.png" alt="/"/></figure></div></div></div><div class="Diagonal"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 10" preserveAspectRatio="none" fill="white"><polygon points="100 0 100 10 0 10"></polygon></svg></div><div class="Business"><div class="Business-wave"></div><div class="Business-container"><span>Capacitamos a tu empresa en transformación digital y las tecnologías más competitivas del mercado.</span></div></div><div class="HomeSearch"><div class="HomeSearch-container"><div class="HomeSearch-title"><h2><span>¿En qué quieres especializarte?</span></h2></div><div class="HomeSearch-content"><span class="icon-search_B"></span><input type="search" placeholder="Busca entre los más de 300 cursos" name="search" autoComplete="off"/></div></div></div><div class="HomeCategories"><div class="HomeCategories-container"><div class="HomeCategories-items"><div class="HomeCategories-item HomeCategories-desarrollo"><div class="HomeCategories-badge" style="background-color:#33b13a"><img loading="lazy" src="https://static.platzi.com/bff/image/ico-desarrollo-fa207491a4cb7b6be3e3ab41b1fecced.png" alt="Desarrollo e ingeniería"/></div><div class="HomeCategories-category"><h2>Desarrollo e ingeniería</h2><span>212<!-- --> <!-- -->cursos</span></div><a href="/categorias/desarrollo/"></a></div><div class="HomeCategories-item HomeCategories-crecimiento-profesional"><div class="HomeCategories-badge" style="background-color:#cb161d"><img loading="lazy" src="https://static.platzi.com/bff/image/ico-crecimiento-ef17081ac63f53c197ec0f78653389f3.png" alt="Crecimiento Profesional"/></div><div class="HomeCategories-category"><h2>Crecimiento Profesional</h2><span>31<!-- --> <!-- -->cursos</span></div><a href="/categorias/crecimiento-profesional/"></a></div><div class="HomeCategories-item HomeCategories-negocios"><div class="HomeCategories-badge" style="background-color:#f5c443"><img loading="lazy" src="https://static.platzi.com/bff/image/ico-negocios-dc4144d0713e6155b9b955fbccf91a29.png" alt="Negocios y emprendimiento"/></div><div class="HomeCategories-category"><h2>Negocios y emprendimiento</h2><span>38<!-- --> <!-- -->cursos</span></div><a href="/categorias/negocios/"></a></div><div class="HomeCategories-item HomeCategories-diseno"><div class="HomeCategories-badge" style="background-color:#6b407e"><img loading="lazy" src="https://static.platzi.com/bff/image/ico-diseno-1aeccde1b13a43e07474c34d0f261c66.png" alt="Diseño y UX"/></div><div class="HomeCategories-category"><h2>Diseño y UX</h2><span>50<!-- --> <!-- -->cursos</span></div><a href="/categorias/diseno/"></a></div><div class="HomeCategories-item HomeCategories-produccion-audiovisual"><div class="HomeCategories-badge" style="background-color:#fa7800"><img loading="lazy" src="https://static.platzi.com/bff/image/ico-audiovisual-c1b62eacf0b272116d683243cd490685.png" alt="Producción Audiovisual"/></div><div class="HomeCategories-category"><h2>Producción Audiovisual</h2><span>18<!-- --> <!-- -->cursos</span></div><a href="/categorias/produccion-audiovisual/"></a></div><div class="HomeCategories-item HomeCategories-marketing"><div class="HomeCategories-badge" style="background-color:#29b8e8"><img loading="lazy" src="https://static.platzi.com/bff/image/ico-marketing-e06e714b6435502c9c1d2ddc573ba258.png" alt="Marketing"/></div><div class="HomeCategories-category"><h2>Marketing</h2><span>29<!-- --> <!-- -->cursos</span></div><a href="/categorias/marketing/"></a></div></div></div></div><div class="RecentCourses"><div class="RecentCourses-container"><div class="RecentCourses-title"><h2><span>Nuevos cursos lanzados</span></h2></div><div class="RecentCourses-list"><div class="RecentCourses-element"><div class="RecentCourseVideo"><div class="RecentCourseVideo-iframe"><iframe title="Course video" src="//youtube.com/embed/vMFAtGtN2eU?mode=opaque&amp;amp;rel=0&amp;amp;autohide=0&amp;amp;showinfo=0&amp;amp;wmode=transparent" frameBorder="0"></iframe></div><div class="RecentCourseVideo-item"><div class="RecentCourseVideo-badge"><figure><img loading="lazy" src="https://static.platzi.com/media/achievements/bagde-algebra-lineal-machine-learning-dc3c7317-aaca-4320-b327-2986e965715f.png" alt="Curso de Álgebra Lineal Aplicada para Machine Learning"/></figure></div><div class="RecentCourseVideo-content"><h3>Curso de Álgebra Lineal Aplicada para Machine Learning</h3><span>Desarrollo e ingeniería</span></div><a href="/cursos/algebra-ml"></a></div></div><div class="RecentCourses-item"><div class="RecentCourses-badge"><figure><img loading="lazy" src="https://static.platzi.com/media/achievements/bagde-algebra-lineal-machine-learning-dc3c7317-aaca-4320-b327-2986e965715f.png" alt="Curso de Álgebra Lineal Aplicada para Machine Learning"/></figure></div><div class="RecentCourses-content"><h3>Curso de Álgebra Lineal Aplicada para Machine Learning</h3><div class="RecentCourses-arrow"></div></div><a href="/cursos/algebra-ml"></a></div><div class="RecentCourses-item"><div class="RecentCourses-badge"><figure><img loading="lazy" src="https://static.platzi.com/media/achievements/badge-algebra-python-5ea49736-48b6-48b4-906f-cedc4ee10b61.png" alt="Curso de Fundamentos de Álgebra Lineal con Python"/></figure></div><div class="RecentCourses-content"><h3>Curso de Fundamentos de Álgebra Lineal con Python</h3><div class="RecentCourses-arrow"></div></div><a href="/cursos/algebra-lineal"></a></div><div class="RecentCourses-item"><div class="RecentCourses-badge"><figure><img loading="lazy" src="https://static.platzi.com/media/achievements/badge-fundamento-gestion-proyectos-2f8ccca7-8f51-4a7b-abe2-dadf9d27dab4.png" alt="Curso de Fundamentos de Gestión de Proyectos"/></figure></div><div class="RecentCourses-content"><h3>Curso de Fundamentos de Gestión de Proyectos</h3><div class="RecentCourses-arrow"></div></div><a href="/cursos/gestion"></a></div><div class="RecentCourses-item"><div class="RecentCourses-badge"><figure><img loading="lazy" src="https://static.platzi.com/media/achievements/badge-computacion-basica-7bbb6f8a-04e3-4af2-82f2-8b8f2932ba04.png" alt="Curso de Computación Básica"/></figure></div><div class="RecentCourses-content"><h3>Curso de Computación Básica</h3><div class="RecentCourses-arrow"></div></div><a href="/cursos/computacion-basica"></a></div><div class="RecentCourses-item"><div class="RecentCourses-badge"><figure><img loading="lazy" src="https://static.platzi.com/media/achievements/badge-deep-learning-pytorch-ee3f9279-1b24-4cc8-a1b6-9311d3f28de4.png" alt="Curso de Deep Learning con Pytorch"/></figure></div><div class="RecentCourses-content"><h3>Curso de Deep Learning con Pytorch</h3><div class="RecentCourses-arrow"></div></div><a href="/cursos/deep-learning"></a></div></div><div class="RecentCourses-element"><div class="RecentCourses-item"><div class="RecentCourses-badge"><figure><img loading="lazy" src="https://static.platzi.com/media/achievements/badge-ar-spark-4e2e0f56-da23-49a3-9ef1-ad6fcc3d75e1.png" alt="Curso de Realidad Aumentada con Spark AR"/></figure></div><div class="RecentCourses-content"><h3>Curso de Realidad Aumentada con Spark AR</h3><div class="RecentCourses-arrow"></div></div><a href="/cursos/spark-ar"></a></div><div class="RecentCourses-item"><div class="RecentCourses-badge"><figure><img loading="lazy" src="https://static.platzi.com/media/achievements/badge-matematicasai-dfba66db-91ab-4ec1-a4a4-9677b072fe24.png" alt="Curso de Fundamentos Matemáticos para Inteligencia Artificial"/></figure></div><div class="RecentCourses-content"><h3>Curso de Fundamentos Matemáticos para Inteligencia Artificial</h3><div class="RecentCourses-arrow"></div></div><a href="/cursos/matematicas-ai"></a></div><div class="RecentCourses-item"><div class="RecentCourses-badge"><figure><img loading="lazy" src="https://static.platzi.com/media/achievements/badge-arte-personajes-2d-c2171119-e268-46a3-a512-93c13f9f5313.png" alt="Curso de Arte para Personajes 2D"/></figure></div><div class="RecentCourses-content"><h3>Curso de Arte para Personajes 2D</h3><div class="RecentCourses-arrow"></div></div><a href="/cursos/personajes-2d"></a></div><div class="RecentCourses-item"><div class="RecentCourses-badge"><figure><img loading="lazy" src="https://static.platzi.com/media/achievements/mesa-de-trabajo-287-8d2fcee3-34ca-47a3-8fd4-cf23bb93fe85.png" alt="Curso de Introducción  a la Creación de Personajes"/></figure></div><div class="RecentCourses-content"><h3>Curso de Introducción  a la Creación de Personajes</h3><div class="RecentCourses-arrow"></div></div><a href="/cursos/creacion-personajes"></a></div><div class="RecentCourses-item"><div class="RecentCourses-badge"><figure><img loading="lazy" src="https://static.platzi.com/media/achievements/badge-infraestructura-codigo-aws-523f9344-e19f-4d04-bd06-8b6c159e95e7.png" alt="Curso de Infraestructura Como Código en AWS"/></figure></div><div class="RecentCourses-content"><h3>Curso de Infraestructura Como Código en AWS</h3><div class="RecentCourses-arrow"></div></div><a href="/cursos/iaac-aws"></a></div><div class="RecentCourses-item"><div class="RecentCourses-badge"><figure><img loading="lazy" src="https://static.platzi.com/media/achievements/badge-powerpoint-064ac3a0-17b9-420c-9fc3-740689e6374d.png" alt="Gestión de Documentos Digitales con PowerPoint"/></figure></div><div class="RecentCourses-content"><h3>Gestión de Documentos Digitales con PowerPoint</h3><div class="RecentCourses-arrow"></div></div><a href="/cursos/microsoft-powerpoint"></a></div><div class="RecentCourses-item"><div class="RecentCourses-badge"><figure><img loading="lazy" src="https://static.platzi.com/media/achievements/badge-eng-management-8aa3f5cb-e16d-4ef6-8ef0-ff244a6ab746.png" alt="Curso de Engineering Management"/></figure></div><div class="RecentCourses-content"><h3>Curso de Engineering Management</h3><div class="RecentCourses-arrow"></div></div><a href="/cursos/eng-management"></a></div><div class="RecentCourses-item"><div class="RecentCourses-badge"><figure><img loading="lazy" src="https://static.platzi.com/media/achievements/badge-word-6afaf389-824d-4b60-a0b8-91f1663a5c90.png" alt="Curso de Gestión de Documentos Digitales con Microsoft Word"/></figure></div><div class="RecentCourses-content"><h3>Curso de Gestión de Documentos Digitales con Microsoft Word</h3><div class="RecentCourses-arrow"></div></div><a href="/cursos/microsoft-word"></a></div><div class="RecentCourses-item"><div class="RecentCourses-badge"><figure><img loading="lazy" src="https://static.platzi.com/media/achievements/badge-finanzas-personales-futuro-66c11bf0-4d51-4570-9967-6dd543da4f7c.png" alt="Curso de Finanzas Personales para el Futuro"/></figure></div><div class="RecentCourses-content"><h3>Curso de Finanzas Personales para el Futuro</h3><div class="RecentCourses-arrow"></div></div><a href="/cursos/finanzas-futuro"></a></div><div class="RecentCourses-item"><div class="RecentCourses-badge"><figure><img loading="lazy" src="https://static.platzi.com/media/achievements/mesa-de-trabajo-38-33c261c4-28ea-4541-8ed9-3a7376ea0f6f.png" alt="Curso para Desbloquear tu Creatividad"/></figure></div><div class="RecentCourses-content"><h3>Curso para Desbloquear tu Creatividad</h3><div class="RecentCourses-arrow"></div></div><a href="/cursos/desbloquea-creatividad"></a></div></div></div></div></div><div class="NextReleases"><div class="NextReleases-container"><div class="NextReleases-box"><h2><span>Próximos lanzamientos</span></h2><div class="NextReleases-list"><div class="NextReleases-card" style="border-left:4px solid"><div class="NextReleases-card-course"><img loading="lazy" src="https://static.platzi.com/media/achievements/badge-pentesting-redes-802c682a-caf8-4dff-a2f2-c97ab409a313.png" alt="Curso de Pentesting a Redes"/><h4>Curso de Pentesting a Redes</h4></div><div class="NextReleases-card-launch"><i class="icon-clock" style="color:"></i><span><span>Lanzamiento: </span>12 de nov. de 2019</span></div><a href="/cursos/pentesting-redes"></a></div><div class="NextReleases-card" style="border-left:4px solid #21bdee"><div class="NextReleases-card-course"><img loading="lazy" src="https://static.platzi.com/media/achievements/badgewom-78dace1e-c5e8-4f74-86dc-f3add5653769.png" alt="Curso de Marketing de Boca a Boca"/><h4>Curso de Marketing de Boca a Boca</h4></div><div class="NextReleases-card-launch"><i class="icon-clock" style="color:#21bdee"></i><span><span>Lanzamiento: </span>13 de nov. de 2019</span></div><a href="/cursos/marketing-voz"></a></div><div class="NextReleases-card" style="border-left:4px solid #436b0e"><div class="NextReleases-card-course"><img loading="lazy" src="https://static.platzi.com/media/achievements/badge-introduccion-marketing-videojuegos-4de9dfc3-b723-4fc4-a282-666b533e8451.png" alt="Curso de Introducción al Marketing para Videojuegos"/><h4>Curso de Introducción al Marketing para Videojuegos</h4></div><div class="NextReleases-card-launch"><i class="icon-clock" style="color:#436b0e"></i><span><span>Lanzamiento: </span>14 de nov. de 2019</span></div><a href="/cursos/marketing-vg"></a></div></div></div></div></div><div class="Pricing"><h2>Elige un plan y empieza a estudiar</h2><div class="Plans u-wrapper is-xs"><div class="StickyPlan"><div class="PlanTabs"><div class="PlanTab"><div class="PlanTab-container is-active"><div class="PlanTab-title"><span>Platzi Expert</span></div></div></div><div class="PlanTab"><div class="PlanTab-container"><div class="PlanTab-title"><span>Platzi Basic</span></div></div></div><div class="PlanTab"><div class="PlanTab-container"><div class="PlanTab-title"><span>Un solo curso</span></div></div></div></div><div class="CurrentPlanCTA"><div class="CurrentPlanCTA-info"><div class="CurrentPlanCTA-price"><figure><img loading="lazy" src="https://static.platzi.com/media/flags/CO.png" width="14" height="14" alt="pesos"/></figure><p>$<!-- -->83.325<!-- --> / mes</p></div><div class="CurrentPlanCTA-subtitle">En un solo pago de<span> $999.900</span></div></div><div class="CurrentPlanCTA-cta"><a href="/comprar/anual/?course=todos" class="btn-green btn--medium">Elegir Expert</a></div></div></div><div class="PlanBody" id="plan-annual_plan"><ul><li><div class="PlanBody-description">Accedes a <strong><span class="underline">más</span> de 150 cursos y 24 carreras</strong></div><div class="PlanBody-check"><span class="icon icon-check"></span></div></li><li><div class="PlanBody-description"><span class="is-exclusive">9<!-- --> cursos</span> exclusivos</div><div class="PlanBody-check"><span class="icon icon-check"></span></div></li><li><div class="PlanBody-description">Clases en vivo o a tu ritmo con profesores y mentores</div><div class="PlanBody-check"><span class="icon icon-check"></span></div></li><li><div class="PlanBody-description">Estudia donde quieras en la web o en tu teléfono</div><div class="PlanBody-check"><span class="icon-check icon"></span></div></li><li><div class="PlanBody-description">Certificados digitales de los cursos que apruebas</div><div class="PlanBody-check"><span class="icon-check icon"></span></div></li><li><div class="PlanBody-description">Recibe los certificados de tus carreras, vivas donde vivas</div><div class="PlanBody-check"><span class="icon icon-check"></span></div></li><li><div class="PlanBody-description">Acceso a las actualizaciones de todos los cursos</div><div class="PlanBody-check"><span class="icon-check icon"></span></div></li><li><div class="PlanBody-description">Pago con tarjetas de crédito o débito</div><div class="PlanBody-check"><span class="icon-check icon"></span></div></li><li><div class="PlanBody-description">Pago en depósito, Paypal y otros métodos</div><div class="PlanBody-check"><span class="icon icon-check"></span></div></li><li><div class="PlanBody-description">Entrada exclusiva al Taller de Creación de Startups</div><div class="PlanBody-check"><span class="icon icon-check"></span></div></li><li><div class="PlanBody-description">Entrada preferencial a PlatziConf en todo el mundo</div><div class="PlanBody-check"><span class="icon icon-check"></span></div></li><li><div class="PlanBody-description">Descarga los cursos offline con la app de iOS o Android</div><div class="PlanBody-check"><span class="icon icon-check"></span></div></li></ul></div></div><div class="Plans u-wrapper is-lg"><div class="PlansContainer"><div class="PlansBenefits"><h5>Qué obtienes</h5><ul><li><p>Accedes a <strong><span>más</span> de 150 cursos y 24 carreras</strong></p></li><li><p><span class="is-exclusive">9<!-- --> cursos</span> exclusivos</p></li><li><p>Clases en vivo o a tu ritmo con profesores y mentores</p></li><li><p>Estudia donde quieras en la web o en tu teléfono</p></li><li><p>Certificados digitales de los cursos que apruebas</p></li><li><p>Recibe los certificados de tus carreras, vivas donde vivas</p></li><li><p>Acceso a las actualizaciones de todos los cursos</p></li><li class="PlansBenefits-deposit"><p>Pago con tarjetas de crédito o débito</p><div class="PlansBenefits-methods"><figure><img loading="lazy" src="https://static.platzi.com/bff/image/visa-23255aeaf4525bc512d481c290b4e9f0.png" height="14" alt="Visa"/></figure><figure><img loading="lazy" src="https://static.platzi.com/bff/image/mastercard-bb9b8fdc8dc8bc33e39e5ac8022c0c30.png" height="14" alt="Mastercard"/></figure><figure><img loading="lazy" src="https://static.platzi.com/bff/image/american-6f27dfa00c19eca2cf6981ca5cc02db7.png" height="14" alt="American Express"/></figure></div></li><li class="PlansBenefits-deposit"><p>Pago con depósito, PayPal y otros métodos</p><div class="PlansBenefits-methods"><figure><img loading="lazy" src="https://static.platzi.com/bff/image/paypal-c85fc91d48a27de8e25d4cdcc169bd2c.png" height="14" alt="PayPal"/></figure><figure><img loading="lazy" src="https://static.platzi.com/bff/image/efectivo-e4a899f62d2d3d2120affda1a513623b.png" height="14" alt="Depósito"/></figure></div></li><li><p>Entrada exclusiva al Taller de Creación de Startups</p></li><li><p>Entrada preferencial a PlatziConf en todo el mundo</p></li><li><p>Descarga los cursos offline con la app de iOS o Android</p></li></ul></div><div class="PlanColumn is-annual"><p class="PlanColumn-promo"><span>Recomendado</span></p><div class="PlanColumn-content"><div class="PlanColumn-title"><h6>Platzi Expert</h6></div><div class="PlanColumn-header"><div class="PlanColumn-details"><div class="PlanColumn-cost"><p><strong>$<!-- -->83.325</strong></p><img loading="lazy" src="https://static.platzi.com/media/flags/CO.png" width="16" height="16" alt="Bandera de tu país"/></div><p class="PlanColumn-currency"><small>pesos<!-- --> al mes</small></p><p class="PlanColumn-subtitle">En un solo pago de<span> $999.900</span></p></div></div><div class="PlanColumn-row"><span class="icon icon-check"></span></div><div class="PlanColumn-row"><span class="icon icon-check"></span></div><div class="PlanColumn-row"><span class="icon icon-check"></span></div><div class="PlanColumn-row"><span class="icon-check"></span></div><div class="PlanColumn-row"><span class="icon-check"></span></div><div class="PlanColumn-row"><span class="icon icon-check"></span></div><div class="PlanColumn-row"><span class="icon icon-check"></span></div><div class="PlanColumn-row"><span class="icon-check"></span></div><div class="PlanColumn-row"><span class="icon icon-check"></span></div><div class="PlanColumn-row"><span class="icon icon-check"></span></div><div class="PlanColumn-row"><span class="icon icon-check"></span></div><div class="PlanColumn-row"><span class="icon icon-check"></span></div><div class="PlanColumn-footer"><div><a href="/comprar/anual/?course=todos" class="btn-green btn--medium">Comprar Plan</a></div></div></div></div><div class="PlanColumn"><div class="PlanColumn-content"><div class="PlanColumn-title"><h6>Platzi Basic</h6></div><div class="PlanColumn-header"><div class="PlanColumn-details"><div class="PlanColumn-cost"><p><strong>$<!-- -->129.900</strong></p><img loading="lazy" src="https://static.platzi.com/media/flags/CO.png" width="16" height="16" alt="Bandera de tu país"/></div><p class="PlanColumn-currency"><small>pesos</small></p><p class="PlanColumn-subtitle">Pagas mes a mes</p></div></div><div class="PlanColumn-row"><span class="icon icon-check"></span></div><div class="PlanColumn-row"><span class="icon icon-delete"></span></div><div class="PlanColumn-row"><span class="icon icon-check"></span></div><div class="PlanColumn-row"><span class="icon-check"></span></div><div class="PlanColumn-row"><span class="icon-check"></span></div><div class="PlanColumn-row"><span class="icon icon-delete"></span></div><div class="PlanColumn-row"><span class="icon icon-check"></span></div><div class="PlanColumn-row"><span class="icon-check"></span></div><div class="PlanColumn-row"><span class="icon icon-delete"></span></div><div class="PlanColumn-row"><span class="icon icon-delete"></span></div><div class="PlanColumn-row"><span class="icon icon-delete"></span></div><div class="PlanColumn-row"><span class="icon icon-delete"></span></div><div class="PlanColumn-footer"><div><a href="/comprar/mensual/?course=todos" class="btn-green btn--medium">Comprar Plan</a></div></div></div></div><div class="PlanColumn"><div class="PlanColumn-content"><div class="PlanColumn-title"><h6>Un solo curso</h6></div><div class="PlanColumn-header"><div class="PlanColumn-details"><div class="PlanColumn-cost"><p><strong>$<!-- -->142.900</strong></p><img loading="lazy" src="https://static.platzi.com/media/flags/CO.png" width="16" height="16" alt="Bandera de tu país"/></div><p class="PlanColumn-currency"><small>pesos</small></p><p class="PlanColumn-subtitle">1 solo curso, 1 solo pago</p></div></div><div class="PlanColumn-row"><span class="icon icon-delete"></span></div><div class="PlanColumn-row"><span class="icon icon-delete"></span></div><div class="PlanColumn-row"><span class="icon icon-delete"></span></div><div class="PlanColumn-row"><span class="icon-check"></span></div><div class="PlanColumn-row"><span class="icon-check"></span></div><div class="PlanColumn-row"><span class="icon icon-delete"></span></div><div class="PlanColumn-row"><span class="icon icon-delete"></span></div><div class="PlanColumn-row"><span class="icon-check"></span></div><div class="PlanColumn-row"><span class="icon icon-check"></span></div><div class="PlanColumn-row"><span class="icon icon-delete"></span></div><div class="PlanColumn-row"><span class="icon icon-delete"></span></div><div class="PlanColumn-row"><span class="icon icon-delete"></span></div><div class="PlanColumn-footer"><a href="/cursos/" class="PlanColumn-course">Elige tu curso</a></div></div></div></div></div><div class="row u-row-wrapper center-xs"><div class="col-xs-12 col-sm-11 col-md-9"><div class="Companies">¿Necesitas capacitación para tu empresa? Tenemos planes especiales. Conócelos en <a href="https://platzi.com/empresas/" target="_blank" rel="noreferrer">platzi.com/empresas</a></div></div></div><div class="ExclusiveCourses"><div class="ExclusiveCourses-container"><div class="ExclusiveCourses-content"><h4>Cursos exclusivos de Platzi Expert</h4><div class="ExclusiveCourses-items"><div class="CareerCourseItem"><div style="border-bottom-color:#fdc001" class="CareerCourseItem-wrapper"><a class="CareerCourseItem-link" href="/cursos/taller-startups/" target="_blank" rel="noreferrer"></a><div class="CareerCourseItem-content"><figure class="CareerCourseItem-badge"><img loading="lazy" alt="Taller de creación de Startups" src="https://static.platzi.com/media/achievements/badge-taller-creacion-startups-f72974de-ce1e-4767-bd47-988ed8f3369a.png" height="50" width="50"/></figure><h5 class="CareerCourseItem-title">Taller de creación de Startups</h5></div></div></div><div class="CareerCourseItem"><div style="border-bottom-color:#fdc001" class="CareerCourseItem-wrapper"><a class="CareerCourseItem-link" href="/cursos/creacion-de-empresas/" target="_blank" rel="noreferrer"></a><div class="CareerCourseItem-content"><figure class="CareerCourseItem-badge"><img loading="lazy" alt="Introducción a la Creación de Empresas y Startups" src="https://static.platzi.com/media/achievements/1186-0cbf6899-eeb8-4b9e-9bf9-a55a004e4307.png" height="50" width="50"/></figure><h5 class="CareerCourseItem-title">Introducción a la Creación de Empresas y Startups</h5></div></div></div><div class="CareerCourseItem"><div style="border-bottom-color:#fd7d7a" class="CareerCourseItem-wrapper"><a class="CareerCourseItem-link" href="/cursos/ingles/" target="_blank" rel="noreferrer"></a><div class="CareerCourseItem-content"><figure class="CareerCourseItem-badge"><img loading="lazy" alt="Curso de Inglés Técnico para Profesionales" src="https://static.platzi.com/media/achievements/1188-ea5968c2-aedf-436c-bd94-9141a594770f.png" height="50" width="50"/></figure><h5 class="CareerCourseItem-title">Curso de Inglés Técnico para Profesionales</h5></div></div></div><div class="CareerCourseItem"><div style="border-bottom-color:#fdc001" class="CareerCourseItem-wrapper"><a class="CareerCourseItem-link" href="/cursos/financiera-startups-2017/" target="_blank" rel="noreferrer"></a><div class="CareerCourseItem-content"><figure class="CareerCourseItem-badge"><img loading="lazy" alt="Curso de Gestión Financiera para Startups-2017" src="https://static.platzi.com/media/achievements/badge-financiera-bac2ce86-e4f5-41fe-83da-708ecb16e79a.png" height="50" width="50"/></figure><h5 class="CareerCourseItem-title">Curso de Gestión Financiera para Startups-2017</h5></div></div></div><div class="CareerCourseItem"><div style="border-bottom-color:#fdc001" class="CareerCourseItem-wrapper"><a class="CareerCourseItem-link" href="/cursos/developer/" target="_blank" rel="noreferrer"></a><div class="CareerCourseItem-content"><figure class="CareerCourseItem-badge"><img loading="lazy" alt="Cómo conseguir trabajo en Programación" src="https://static.platzi.com/media/achievements/1227-863956bd-65fd-4ca3-b2de-51d8e67786ca.png" height="50" width="50"/></figure><h5 class="CareerCourseItem-title">Cómo conseguir trabajo en Programación</h5></div></div></div><div class="CareerCourseItem"><div style="border-bottom-color:#fdc001" class="CareerCourseItem-wrapper"><a class="CareerCourseItem-link" href="/cursos/internacionalizacion-startups/" target="_blank" rel="noreferrer"></a><div class="CareerCourseItem-content"><figure class="CareerCourseItem-badge"><img loading="lazy" alt="Curso de Internacionalización para Startups" src="https://static.platzi.com/media/achievements/1266-0dbaeb6d-379d-4e62-add3-902e718bc95e.png" height="50" width="50"/></figure><h5 class="CareerCourseItem-title">Curso de Internacionalización para Startups</h5></div></div></div><div class="CareerCourseItem"><div style="border-bottom-color:#fd7d7a" class="CareerCourseItem-wrapper"><a class="CareerCourseItem-link" href="/cursos/ingles-basico/" target="_blank" rel="noreferrer"></a><div class="CareerCourseItem-content"><figure class="CareerCourseItem-badge"><img loading="lazy" alt="Curso de Inglés Básico para Principiantes" src="https://static.platzi.com/media/achievements/badge-basico-ingles-e073f711-763d-4129-badc-5e4baa78b225.png" height="50" width="50"/></figure><h5 class="CareerCourseItem-title">Curso de Inglés Básico para Principiantes</h5></div></div></div><div class="CareerCourseItem"><div style="border-bottom-color:#fd7d7a" class="CareerCourseItem-wrapper"><a class="CareerCourseItem-link" href="/cursos/ingles-gramatica/" target="_blank" rel="noreferrer"></a><div class="CareerCourseItem-content"><figure class="CareerCourseItem-badge"><img loading="lazy" alt="Curso de Inglés Básico: Gramática" src="https://static.platzi.com/media/achievements/1370-836f01ea-6748-4c9f-a8e0-ce51c7c28d0b.png" height="50" width="50"/></figure><h5 class="CareerCourseItem-title">Curso de Inglés Básico: Gramática</h5></div></div></div><div class="CareerCourseItem"><div style="border-bottom-color:#fd7d7a" class="CareerCourseItem-wrapper"><a class="CareerCourseItem-link" href="/cursos/ingles-conversacion/" target="_blank" rel="noreferrer"></a><div class="CareerCourseItem-content"><figure class="CareerCourseItem-badge"><img loading="lazy" alt="Curso de Inglés Básico: Conversación" src="https://static.platzi.com/media/achievements/1371-db5ea3c7-4ac9-4b61-b786-9346ebb3fc7f.png" height="50" width="50"/></figure><h5 class="CareerCourseItem-title">Curso de Inglés Básico: Conversación</h5></div></div></div></div></div></div></div></div><div class="Platform"><div class="Platform-container"><div class="Platform-title"><h2><span>Platzi funciona</span></h2></div><div class="Platform-item"><div class="Platform-step"><h3>Logra tus metas:</h3><span>No sólo videos: Clases concretas, descargables, prácticas y desde cualquier dispositivo.</span></div><div class="Platform-figure"><figure><img loading="lazy" src="https://static.platzi.com/static/images/home-v4/platform_goals.d9939806abe9.png" alt="No sólo videos: Clases concretas, descargables, prácticas y desde cualquier dispositivo."/></figure></div></div><div class="Platform-item-reverse"><div class="Platform-step"><h3>Examen de Certificación</h3><span>Un diploma de certificación por curso y carrera. Tendrás proyectos reales para tu portafolio.</span></div><div class="Platform-figure"><figure><img loading="lazy" src="https://static.platzi.com/static/images/home-v4/platform_certificate.d105cf39346c.png" alt="Un diploma de certificación por curso y carrera. Tendrás proyectos reales para tu portafolio."/></figure></div></div><div class="Platform-item"><div class="Platform-step"><h3>La mejor comunidad</h3><span>Crearemos una ruta de aprendizaje personalizada y toda nuestra comunidad te acompañará.</span></div><div class="Platform-figure"><figure><img loading="lazy" src="https://static.platzi.com/static/images/home-v4/platform_community.239657e18408.png" alt="Crearemos una ruta de aprendizaje personalizada y toda nuestra comunidad te acompañará."/></figure></div></div></div></div><div class="HomeTestimonials"><div class="HomeTestimonials-container"><div class="HomeTestimonials-title"><h2><span>Historias y testimonios</span></h2></div><div class="HomeTestimonials-list"><div class="HomeTestimonials-card"><div class="HomeTestimonials-bubble"><span>Si eres estudiante de Platzi y estudias sin dejar de practicar puedes conseguir el trabajo de tus sueños.</span></div><div class="HomeTestimonials-profile"><div class="HomeTestimonials-avatar"><img loading="lazy" src="https://static.platzi.com/media/testimony/gollum.jpg" alt="Diego Forero" class="avatar"/><img loading="lazy" src="https://static.platzi.com/media/flags/CO.png" alt="Colombia" class="userBadge"/></div><div class="HomeTestimonials-userName"><a href="/@gollum23/"><h4>Diego Forero</h4>@<!-- -->gollum23</a></div></div></div><div class="HomeTestimonials-card"><div class="HomeTestimonials-bubble"><span>Como founder de una StartUp, Platzi para mí me mostró un vacío que yo necesitaba llenar en mi día a día para crear un mejor producto. </span></div><div class="HomeTestimonials-profile"><div class="HomeTestimonials-avatar"><img loading="lazy" src="https://static.platzi.com/media/testimony/victoria-avatar.38668af96859.jpg" alt="Vicky O&#x27;Shee" class="avatar"/><img loading="lazy" src="https://static.platzi.com/media/flags/CO.png" alt="Colombia" class="userBadge"/></div><div class="HomeTestimonials-userName"><a href="/@victoriaoshee/"><h4>Vicky O&#x27;Shee</h4>@<!-- -->victoriaoshee</a></div></div></div><div class="HomeTestimonials-card"><div class="HomeTestimonials-bubble"><span>Con Platzi entendí que la programación se convierte en parte de tu vida y con ella eres capaz de hacer cualquier cosa que te propongas. </span></div><div class="HomeTestimonials-profile"><div class="HomeTestimonials-avatar"><img loading="lazy" src="https://static.platzi.com/media/testimony/juandc1x1.jpg" alt="Juan David Castro" class="avatar"/><img loading="lazy" src="https://static.platzi.com/media/flags/CO.png" alt="Colombia" class="userBadge"/></div><div class="HomeTestimonials-userName"><a href="/@juandc/"><h4>Juan David Castro</h4>@<!-- -->juandc</a></div></div></div></div><div class="HomeTestimonials-all"><h3><span>Platzi es la estrategia de formación de miles de personas para conseguir un mejor empleo o crear una empresa de tecnología</span></h3></div></div><div class="HomeTestimonials-wave"></div></div><div class="HomeCta"><div class="HomeCta-container"><div class="HomeCta-content"><div class="HomeCta-title"><h2><span>La escuela online de formación profesional en tecnología</span></h2></div><div class="HomeCta-actions"><a href="/precios/" class="btn btn-green"><span>Comienza ahora</span></a></div></div></div></div></div><div class=""><div class="FooterContainer-up"><div class="u-wrapper FooterGrid-up"><div class="SloganSection"><figure><img loading="lazy" src="https://static.platzi.com/static/images/footer/logo.a76b2a87162b.png" alt="Platzi"/></figure><p><span>Educación online de calidad</span></p></div><div class="SocialLayout"><span>Ver todas</span><a href="https://twitter.com/platzi" class="SocialItem" target="_blank" rel="noreferrer"><span class="icon-twt"></span></a><a href="https://www.youtube.com/channel/UC55-mxUj5Nj3niXFReG44OQ" class="SocialItem" target="_blank" rel="noreferrer"><span class="icon-youtube-play"></span></a><a href="https://facebook.com/platzi" class="SocialItem" target="_blank" rel="noreferrer"><span class="icon-fcbk"></span></a><a href="https://www.instagram.com/platzi/" class="SocialItem" target="_blank" rel="noreferrer"><span class="icon-instagram"></span></a></div><div class="CategoriesSection"><div href="/categorias/desarrollo/" class="Category" style="border-left:solid 3px #33b13a"><a href="/categorias/desarrollo/">Desarrollo e ingeniería</a><div class="Arrow"></div></div><div href="/categorias/diseno/" class="Category" style="border-left:solid 3px #6b407e"><a href="/categorias/diseno/">Diseño y UX</a><div class="Arrow"></div></div><div href="/categorias/marketing/" class="Category" style="border-left:solid 3px #29b8e8"><a href="/categorias/marketing/">Marketing</a><div class="Arrow"></div></div><div href="/categorias/negocios/" class="Category" style="border-left:solid 3px #f5c443"><a href="/categorias/negocios/">Negocios y emprendimiento</a><div class="Arrow"></div></div><div href="/categorias/comunidad/" class="Category" style="border-left:solid 3px #98ca3f"><a href="/categorias/comunidad/">Comunidad</a><div class="Arrow"></div></div><div href="/categorias/produccion-audiovisual/" class="Category" style="border-left:solid 3px #fa7800"><a href="/categorias/produccion-audiovisual/">Producción Audiovisual</a><div class="Arrow"></div></div><div href="/categorias/crecimiento-profesional/" class="Category" style="border-left:solid 3px #cb161d"><a href="/categorias/crecimiento-profesional/">Crecimiento Profesional</a><div class="Arrow"></div></div></div><div class="CertifiersLayout"><span>Certificadores oficiales en tecnologías</span><div class="Certifier"><figure><img loading="lazy" src="https://static.platzi.com/static/images/footer/logo-ibm.a5ea724e8e90.png" alt="IBM"/></figure><a href="" target="_blank" rel="noreferrer" class="Certifier-link"></a></div><div class="Certifier"><figure><img loading="lazy" src="https://static.platzi.com/static/images/footer/logo-unity.5a9d7d021565.png" alt="Unity"/></figure><a href="" target="_blank" rel="noreferrer" class="Certifier-link"></a></div></div><div class="AwardsLayout"><span>Reconocidos y premiados por</span><div class="Award"><figure><img loading="lazy" src="https://static.platzi.com/static/images/footer/yc.886de721d220.png" alt="Y Combinator"/></figure><a href="https://platzi.com/blog/platzi-y-combinator/" target="_blank" rel="noreferrer" class="Award-link"></a></div><div class="Award"><figure><img loading="lazy" src="https://static.platzi.com/static/images/footer/asugsv.8d8dcbc1fa78.png" alt="ASU + GSV Summit"/></figure><a href="https://platzi.com/blog/platzi-gana-premio-educacion/" target="_blank" rel="noreferrer" class="Award-link"></a></div></div></div></div><div class="FooterContainer-mid"><div class="SubscribeSectionV2 u-wrapper"><div class="SubscribeSectionV2-copy"><span>Entérate de todas las novedades en educación, negocios y tecnología</span></div><form method="post" class="SubscribeSectionV2-form"><input type="hidden" name="origin" value="footer_subscription"/><div class="FormInput SubscribeInput"><input type="email" name="subscribe" required="" autoComplete="off" placeholder="Tu Correo electrónico" class="FormInput-field" value=""/><label class="FormInput-label"><span>Tu Correo electrónico</span></label><p class="FormInput-error"></p></div><button class="btn btn-sky btn--medium"><span>Suscríbete</span></button></form></div></div><div class="FooterContainer-bottom"><div class="u-wrapper FooterGrid-bottom"><div class="MenuLayout"><a href="/faq/" class="MenuItem">Preguntas frecuentes</a><a href="/contacto/" class="MenuItem">Contáctanos</a><a href="/prensa/" class="MenuItem">Prensa</a><a href="/conf/todas/" class="MenuItem">Conferencias</a><a href="/tos/" class="MenuItem">Términos y Condiciones</a><a href="/privacidad/" class="MenuItem">Privacidad</a><a href="/historias/" class="MenuItem">Estudiantes</a><a href="/hola/" class="MenuItem">Hola</a></div><div class="LanguageLayout"><a class="LangButton" href="https://platzi.com.br"><span>pt</span><img loading="lazy" class="FlagCircle" src="https://static.platzi.com/static/images/flags/brazil.5301e426d99b.jpg" alt="Country Flag" width="16px" height="16px"/></a><a class="LangButton" href="https://courses.platzi.com"><span>en</span><img loading="lazy" class="FlagCircle" src="https://static.platzi.com/static/images/flags/united-states.336e5b9b3848.jpg" alt="Country Flag" width="16px" height="16px"/></a></div><div class="LoveLayout"><p><span>De LATAM con </span><span class="icon-heart"></span><span>para el mundo</span></p></div></div></div></div></div></div></div>
          <script data-cfasync="false" src="/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js"></script><script id="preloadedState">window.__PRELOADED_STATE__ = {"contactInfo":{"hasSubscription":false,"isAuthenticated":false,"country":"colombia","flag":"Colombia","isOrganizer":false,"lang":"es","i18n":{"i18n_menu":{"planExpertText":"Desarrolla tus habilidades en programación, diseño, producción audiovisual, marketing y muchas más. Mide tu progreso y recibe certificados con tu nombre a finalizar cada curso.","telephone":"Teléfono","terms":"Términos de Uso","accept":"Términos de Uso","privacy":"políticas de privacidad","dm":"Mensaje Directo","agree":"Aquí puedes ver nuestros {terms} y actualizaciones de nuestras {privacy}","planExpert":"Plan Expert","contactus_title":"¿Tienes dudas o quieres comunicarte con nosotros?","contactus_subtitle":"Elige el medio que más te convenga, te sugerimos ","acceptTerms":"Nunca pares de aprender sobre la seguridad de tus datos","write":"Escríbenos"}},"enabled":true},"header":{"enableSubscription":true,"menuItems":[{"name":"Cursos","url":"/cursos/"},{"name":"Blog","url":"/blog/"},{"name":"Foro","url":"/foro/"},{"name":"Agenda","url":"/agenda/"},{"name":"TV","url":"/live/"},{"name":"Contáctanos","url":"","type":"contact"}],"loggedMenu":[{"name":"Empleos","icon":"icon-suitecase_B","url":"/empleos/"},{"name":"Mensajes Directos","type":"direct_messages","icon":"icon-cloud","url":"/direct-messages/"},{"name":"Obtén 1 mes gratis","icon":"icon-gift_A","type":"referal","url":"/mi-suscripcion/referidos/"},{"name":"Mi Suscripción","icon":"icon-platzi","type":"my_subscription","url":"/mi-suscripcion/"}],"socials":[{"icon":"icon-twt","url":"https://twitter.com/platzi"},{"icon":"icon-youtube-play","url":"https://www.youtube.com/channel/UC55-mxUj5Nj3niXFReG44OQ"},{"icon":"icon-fcbk","url":"https://facebook.com/platzi"},{"icon":"icon-instagram","url":"https://www.instagram.com/platzi/"}],"official_companies":[{"logo":"https://static.platzi.com/static/images/footer/logo-ibm.a5ea724e8e90.png","name":"IBM","url":""},{"logo":"https://static.platzi.com/static/images/footer/logo-unity.5a9d7d021565.png","name":"Unity","url":""}],"organization_id":1,"enableSearch":true,"logo":"https://static.platzi.com/static/images/footer/logo.a76b2a87162b.png","live":{"active":false,"time":"","url":"","title":""},"messages":{"planExpertText":"Desarrolla tus habilidades en programación, diseño, producción audiovisual, marketing y muchas más. Mide tu progreso y recibe certificados con tu nombre a finalizar cada curso.","fromLatam":"De LATAM con ","nextPage":"Siguiente","hide":"Ocultar","notification_not_available_title":"¡Lo sentimos!","awardsText":"Reconocidos y premiados por","switch_language":"Do you want to switch to Platzi in English?","telephone":"Teléfono","undo":"Deshacer","notifications_disabled_subtitle":"Para recibir nuevamente tus notificaciones debes activarlas en \u003cspan class=\"icon-cog\">\u003c/span>","AccountFooter-login":"Inicia tu sesión","RegisterButton-email":"Regístrate con tu Email","switch_english":"Yes, switch to English","login_email":"Tu email","avanced_search":"Presiona ENTER para una busqueda avanzada","AccountFooter-register":"Regístrate","dm":"Mensaje Directo","qualityEducation":"Transformamos la economía de nuestros países entrenando a la próxima generación de profesionales en tecnología.","LoginWithEmail-login":"Inicia sesión","YourEmail":"Correo electrónico","login":"Iniciar sesión","FooterfollowUs":"Aprende en nuestras redes:","logout":"Cerrar sesión","subscriptionTime":"Tienes {subscription_time} días de tu Plan","login_courses_text":"Accede a más de 120 cursos","login_live_text":"Participa en sesiones en vivo y foros de Platzi","FooterCopyLink":"ingrese un link","CertifiersText":"Certificadores oficiales en tecnologías","continue_watching":"Continua viendo","searchPlaceholder":"Buscar en Platzi","live":"live","more_results":"Más resultados","notifications_disabled_title":"¡Tus notificaciones están desactivadas!","view_profile":"Ver mi Perfil","view_plans":"Quiero saber más","mark_as_read":"Marcar todas como leídas","AccountFooter-title-login ":"¿Ya tienes una cuenta?","login_password":"Tu contraseña","notifications_not_available_subtitle":"El contenido al que intentas acceder no se encuentra disponible.","EnterYourEmail":"Ingresa tu correo electrónico","notification_empty_title":"¡Aún no tienes notificaciones!","planExpert":"Plan Expert","LoginSocial-facebook-register":" Regístrate con Facebook","LoginSocial-twitter-register":"Regístrate con Twitter","careers":"Carreras","SubscribeSectionCTA":"Suscríbete","user_login":"Inicia sesión o crea tu cuenta","see_all":"Ver todas","username":"¡Hola, {user_name}!","notification_emtpy_subtitle":"Participa, comparte y discute para empezar a recibir notificaciones","contactus_title":"¿Tienes dudas o quieres comunicarte con nosotros?","init_plan":"Iniciar mi plan","live_in":"En Vivo","LoginSocial-twitter-login":"Inicia sesión con Twitter","title":"Tus notificaciones","required_courses":"Cursos Obrigatórios","no_results":"No tenemos resultados destacados","courses":"Cursos","LoginSocial-facebook-login":"Inicia sesión con Facebook","contactus_subtitle":"Elige el medio que más te convenga, te sugerimos ","FooterChangeLang":"Cambiar idioma","init_plan2":"Planes","all_courses":"Ver todos mis cursos","login_opportunities":"Accede a mejores oportunidades laborales","toTheWorld":"para el mundo","SubscribeSectionTitle":"Entérate de todas las novedades en educación, negocios y tecnología","AccountFooter-title-register":"¿Aún no tienes cuenta en Platzi?","FooterShareLink":"Comparte este link y por cada registro con esta URL te damos un mes","notification_hidden":"Se ocultó la notificatión.","hide_description":"Ocultar esta notificación del historial","menu":"Menú","LoginWithEmail-lostpassword":"¿Olvidaste tu contraseña?","write":"Escríbenos"},"isLogged":false,"isHispanic":true,"country_name":"Colombia","awards":[{"logo":"https://static.platzi.com/static/images/footer/yc.886de721d220.png","name":"Y Combinator","url":"https://platzi.com/blog/platzi-y-combinator/"},{"logo":"https://static.platzi.com/static/images/footer/asugsv.8d8dcbc1fa78.png","name":"ASU + GSV Summit","url":"https://platzi.com/blog/platzi-gana-premio-educacion/"}],"userInfo":{"points":0,"referalUrl":"","userType":"","isAuthenticated":false,"userId":0,"profileUrl":"","plan":"","name":"","subscription_time":"","lastCourse":[],"username":"","country":"","phoneNumber":"","avatar":"","email":""},"locale":"es","languages":[{"url":"https://platzi.com.br","lang_name":"Portugués","lang":"pt","flag":"https://static.platzi.com/static/images/flags/brazil.5301e426d99b.jpg"},{"url":"https://platzi.com","lang_name":"Español","lang":"es","flag":"https://static.platzi.com/static/images/flags/espana.367527dfff74.jpg"},{"url":"https://courses.platzi.com","lang_name":"Inglés","lang":"en","flag":"https://static.platzi.com/static/images/flags/united-states.336e5b9b3848.jpg"}],"promo_banner":{"primary_color":"","active":false,"pricing":{"price":"","flag":""},"primary_log":"","url":"","end_date":"","tertiary_color":"","secondary_logo":"","secondary_color":""},"categories":[{"color":"#33b13a","name":"Desarrollo e ingeniería","url":"/categorias/desarrollo/"},{"color":"#6b407e","name":"Diseño y UX","url":"/categorias/diseno/"},{"color":"#29b8e8","name":"Marketing","url":"/categorias/marketing/"},{"color":"#f5c443","name":"Negocios y emprendimiento","url":"/categorias/negocios/"},{"color":"#98ca3f","name":"Comunidad","url":"/categorias/comunidad/"},{"color":"#fa7800","name":"Producción Audiovisual","url":"/categorias/produccion-audiovisual/"},{"color":"#cb161d","name":"Crecimiento Profesional","url":"/categorias/crecimiento-profesional/"}],"options":[{"title":"Preguntas frecuentes","url":"/faq/"},{"title":"Contáctanos","url":"/contacto/"},{"title":"Prensa","url":"/prensa/"},{"title":"Conferencias","url":"/conf/todas/"},{"title":"Términos y Condiciones","url":"/tos/"},{"title":"Privacidad","url":"/privacidad/"},{"title":"Estudiantes","url":"/historias/"},{"title":"Hola","url":"/hola/"}]},"home":{"business":{"title":"Capacitamos a tu empresa en transformación digital y las tecnologías más competitivas del mercado.","cta":"\u003cstrong>Inscribe tu empresa\u003c/strong>"},"entities":[],"testimonies":[{"socialUrl":"https://twitter.com/","profile":"/@gollum23/","name":"Diego Forero","flag":"https://static.platzi.com/media/flags/CO.png","text":"Si eres estudiante de Platzi y estudias sin dejar de practicar puedes conseguir el trabajo de tus sueños.","username":"gollum23","country":"Colombia","socialName":"","date_joined":"2012-09-20 05:42:32+00:00","image":"https://static.platzi.com/media/testimony/gollum.jpg"},{"socialUrl":"https://facebook.com/667170323","profile":"/@victoriaoshee/","name":"Vicky O'Shee","flag":"https://static.platzi.com/media/flags/CO.png","text":"Como founder de una StartUp, Platzi para mí me mostró un vacío que yo necesitaba llenar en mi día a día para crear un mejor producto. ","username":"victoriaoshee","country":"Colombia","socialName":"victoriaoshee","date_joined":"2015-03-15 00:05:58+00:00","image":"https://static.platzi.com/media/testimony/victoria-avatar.38668af96859.jpg"},{"socialUrl":"https://twitter.com/fjuandc","profile":"/@juandc/","name":"Juan David Castro","flag":"https://static.platzi.com/media/flags/CO.png","text":"Con Platzi entendí que la programación se convierte en parte de tu vida y con ella eres capaz de hacer cualquier cosa que te propongas. ","username":"juandc","country":"Colombia","socialName":"fjuandc","date_joined":"2015-10-20 16:42:50+00:00","image":"https://static.platzi.com/media/testimony/juandc1x1.jpg"}],"pinned_course":{"id":1728,"title":"Curso de Álgebra Lineal Aplicada para Machine Learning","slug":"algebra-ml","color":"#008647","badge":"https://static.platzi.com/media/achievements/bagde-algebra-lineal-machine-learning-dc3c7317-aaca-4320-b327-2986e965715f.png","video":"vMFAtGtN2eU","url":"https://platzi.com/clases/algebra-ml/","category":{"name":"Desarrollo e ingeniería","color":"#33b13a","url":"/categorias/desarrollo/"}},"has_subscription":false,"order_careers":[],"userType":"unlogged","next_course":{"language_type":"native","career_color":"#3eb64a","flag":"https://static.platzi.com/media/flags/CO.png","liked":false,"career_url":"/seguridad-informatica/","url":"/cursos/pentesting-redes/","title":"Curso de Pentesting a Redes","language_note":"","launch_date":"2019-11-12T22:00:00+00:00","likes":0,"description":"Evalúa la seguridad de tu infraestructura de red para identificar puntos débiles y robustecerla. Identifica cómo funcionan varios ataques a protocolos de red, d","career":"Seguridad","course_id":1734},"steps":[{"title":"Más que videos","subtitle":"Proyectos, desafíos, lecturas, clases en vivo","description":"Tendrás un plan de aprendizaje personal. Cada curso te da un proyecto real, desafíos, lecturas, sesiones en vivo y clases a tu ritmo.","img":"https://static.platzi.com/static/images/home-v3/step2.2fe5ebf55c1a.png","color":"#fecc01"},{"title":"80% consiguen un mejor trabajo, 10% crean empresa","subtitle":"Un mejor empleo o tu propia empresa","description":"Un diploma de certificación que enviamos a tu casa, vivas donde vivas por cada carrera que completes, junto con proyectos para tu portafolio, todo incluido. Y un taller para crear tu startup.","img":"https://static.platzi.com/static/images/home-v3/step3.84946a29d799.png","color":"#0791e6"},{"title":"No necesitas hardware especial para estudiar","subtitle":"Estudia en laptop o teléfono, online u offline","description":"Con la app móvil puedes descargar los cursos a tu teléfono. Platzi funciona sin instalar nada, en cualquier sistema y conexión a internet.","img":"https://static.platzi.com/static/images/home-v3/step4.1e2e959e03d5.png","color":"#ff7f38"}],"organization_id":1,"is_exclusive":false,"first_class":[{"title":"Curso de Diseño de Interfaces y UX 2017","badge":"https://static.platzi.com/media/achievements/badge-diseno-interfaces-ux-f4591d4c-0fda-4e3b-bbbb-38bb0a61e724.png","material_url":"/clases/1140-diseno-interfaces-ux-2017/7411-introduccion-a-ux/"},{"title":"Curso de Introducción al Marketing Digital","badge":"https://static.platzi.com/media/achievements/1328-bdfaf9ae-05e1-44c3-9c14-fccbb491a7d3.png","material_url":"/clases/1328-introduccion-marketing/12361-bienvenida-e-introduccion/"},{"title":"Curso Gratis de Programación Básica","badge":"https://static.platzi.com/media/achievements/1050-bfb74f83-8e2e-4ff7-a66d-77d2c0067908.png","material_url":"/clases/1050-programacion-basica/5103-mi-primera-linea-de-codigo/"},{"title":"Fundamentos de Ingeniería de Software","badge":"https://static.platzi.com/media/achievements/badge-ing-software-2017-18f503fd-36bd-42d8-b1a1-492865659687.png","material_url":"/clases/1098-ingenieria/6552-que-es-un-system-on-a-chip/"}],"plans":{"annual_plan":{"discount_active":false,"price_day":"2.740","discount_data":{},"price":"83.325","name":"annual_plan","slug":"anual","plan_price":"999.900","copy":"En un solo pago de","promo_active":false,"buy_url":"/comprar/anual/?course=todos","discount_amount":"100.900","symbol":"$","title":"Platzi Expert","promo_price":"899.000","full_price":"999.900","flag_url":"https://static.platzi.com/media/flags/CO.png","description":"pesos","save_money":"558.900*"},"monthly_plan":{"discount_active":false,"price_day":null,"price":"129.900","name":"monthly_plan","plan_price":"129.900","copy":"Pagas mes a mes","buy_url":"/comprar/mensual/?course=todos","discount_amount":"","symbol":"$","title":"Platzi Basic","promo_price":"129.900","flag_url":"https://static.platzi.com/media/flags/CO.png","description":"pesos"},"course":{"discount_active":false,"has_discount":true,"price":"142.900","name":"course","slug":"bienvenido","course_name":"","plan_price":"279.000","copy":"1 solo curso, 1 solo pago","buy_url":"/cursos/","discount_amount":"136.100","symbol":"$","title":"Un solo curso","promo_price":"142.900","flag_url":"https://static.platzi.com/media/flags/CO.png","description":"pesos"},"features":[{"html":"Accedes a \u003cstrong>\u003cspan className=\"underline\">más\u003c/span> de 300 cursos y 50 carreras\u003c/strong>","type":"notInSingleCourse"},{"html":"\u003cspan className=\"is-exclusive\">9 cursos\u003c/span> exclusivos","type":"annualExclusive","link":true},{"html":"Clases en vivo o a tu ritmo con profesores y mentores","type":"notInSingleCourse"},{"html":"Estudia donde quieras en la web o en tu teléfono","type":"all"},{"html":"Certificados digitales de los cursos que apruebas","type":"all"},{"html":"Recibe los certificados de tus carreras, vivas donde vivas","type":"annualExclusive"},{"html":"Acceso a las actualizaciones de todos los cursos","type":"all"},{"html":"Pago con tarjetas de crédito o débito","type":"all","images":["https://static.platzi.com/static/images/pricing/visa.23255aeaf452.png","https://static.platzi.com/static/images/pricing/mastercard.bb9b8fdc8dc8.png","https://static.platzi.com/static/images/pricing/american.6f27dfa00c19.png"]},{"html":"Pago en depósito, Paypal y otros métodos","type":"annualExclusive","images":["https://static.platzi.com/static/images/pricing/paypal.c85fc91d48a2.png","https://static.platzi.com/static/images/pricing/efectivo.e4a899f62d2d.png"]},{"html":"Entrada exclusiva al Taller de Creación de Startups","type":"annualExclusive"},{"html":"Entrada preferencial a PlatziConf en todo el mundo","type":"annualExclusive"},{"html":"Descarga los cursos offline con la app de iOS o Android","type":"annualExclusive"}],"messages":{"pricing.course.choose":"Elegiste","pricing.planCta.choose":"Elige tu curso","pricing.exclusives.title":"Cursos exclusivos de Platzi Expert","pricing.promo.returning":"\u003ch2>La educación profesional \u003cstrong>no necesita descuentos\u003c/strong> cuando sabes invertir en ti. \u003cp>Como ya tienes suscripción, \u003cstrong>agregaremos un año más a tu suscripción\u003c/strong> y no pierdes si eliges Expert hoy.\u003c/p>\u003c/h2>","pricing.currentPlan.choose":"Elige tu curso","pricing.column.save":"Ahorras","pricing.course.title":"Solo este curso","pricing.benefits.title":"Qué obtienes","pricing.promo.new.vzla":"\u003ch2>La educación profesional \u003cstrong>cambia tu vida\u003c/strong> y abre el marcado del planeta entero. \u003cp>En tu país sabemos que es un esfuerzo GIGANTE. Mira la \u003ca target='_blank' href='https://www.youtube.com/watch?v=J0eazs705eA'>historia de JJ Yepez\u003c/a>. Se puede. Sé Platzi Expert.\u003c/p>\u003c/h2>","pricing.promo.title":"\u003ch2>Elige un plan y empieza a estudiar\u003c/h2>","pricing.currentPlan.buy":"Comprar curso","pricing.planCta.buyCourse":"Comprar curso","pricing.planCta.buy":"Comprar Plan","pricing.promo.new":"\u003ch2>La educación profesional \u003cstrong>no necesita descuentos\u003c/strong> cuando sabes invertir en ti. \u003cp>Estudiar en Platzi \u003cstrong>duplica tus ingresos\u003c/strong>. No detengas tu crecimiento por centavos. Sé Platzi Expert hoy.\u003c/p>\u003c/h2>","pricing.column.recomended":"Recomendado","pricing.currentPlan.expert":"Elegir Expert","pricing.company.title":"¿Necesitas capacitación para tu empresa? Tenemos planes especiales. Conócelos en \u003ca href='https://platzi.com/empresas/' target='_blank'>platzi.com/empresas\u003c/a>"},"locale":"es"},"course_count":300,"next_courses":[{"has_course":false,"content_type":"video","language_type":"native","color":"","badge":"https://static.platzi.com/media/achievements/badge-pentesting-redes-802c682a-caf8-4dff-a2f2-c97ab409a313.png","cover_url":"","social_description":"Evalúa la seguridad de tu infraestructura de red para identificar puntos débiles y robustecerla. Identifica cómo funcionan varios ataques a protocolos de red, de servicio y de ingeniería social. Configura herramientas para realizar pruebas de seguridad. Elabora reportes para compartir tus hallazgos y acciones con personal no técnico.","bought":false,"is_new":false,"slug":"pentesting-redes","free":false,"cover_vertical_url":"","lang":"es","order":0,"url":"/clases/pentesting-redes/","teachers":[{"name":"Juan Pablo Caro","image":"https://static.platzi.com/media/teachers/JuanPA.jpg","twitter":"platzi","company":"Berkeley Research Group","position":"Senior Managing Consultant"}],"is_required":false,"buy_url":"/adquirir/pentesting-redes/curso/","title":"Curso de Pentesting a Redes","language_note":"","social_image_url":"https://static.platzi.com/media/courses/og-pentesting-redes.png","launch_date":"2019-11-12T17:00:00-05:00","type":"paid","video":null,"id":1734,"image":"https://static.platzi.com/media/achievements/platzi-bd.png","live_url":"/clases/pentesting-redes//live","description":"Evalúa la seguridad de tu infraestructura de red para identificar puntos débiles y robustecerla. Identifica cómo funcionan varios ataques a protocolos de red, de servicio y de ingeniería social. Configura herramientas para realizar pruebas de seguridad. Elabora reportes para compartir tus hallazgos y acciones con personal no técnico."},{"has_course":false,"content_type":"video","language_type":"native","color":"#21bdee","badge":"https://static.platzi.com/media/achievements/badgewom-78dace1e-c5e8-4f74-86dc-f3add5653769.png","cover_url":"","social_description":"Una estrategia de marketing boca a boca se desarrolla correctamente cuando todos los factores en su proceso son bien entendidos. Conoce las herramientas que te permitirán realizar un diagnóstico, estructuración y ejecución de una estrategia de marketing. Elabora tu estrategia de marketing para llevar tu marca a potenciales consumidores. Mide los resultados de tu estrategia y descubre algunas ideas que la fortalecerán.","bought":false,"is_new":false,"slug":"marketing-voz","free":false,"cover_vertical_url":"","lang":"es","order":0,"url":"/clases/marketing-voz/","teachers":[{"name":"Daniela Belén González","image":"https://static.platzi.com/media/teachers/Screen_Shot_2019-05-01_at_6.42.54_PM.png","twitter":"myrockandmyroll","company":"DigitalTie","position":"Co-Founder"}],"is_required":false,"buy_url":"/adquirir/marketing-voz/curso/","title":"Curso de Marketing de Boca a Boca","language_note":"","social_image_url":"https://static.platzi.com/media/courses/Opengraph-marketing-boca-boca.png","launch_date":"2019-11-13T18:00:00-05:00","type":"paid","video":null,"id":1736,"image":"https://static.platzi.com/media/achievements/platzi-bd.png","live_url":"/clases/marketing-voz//live","description":"Una estrategia de marketing boca a boca se desarrolla correctamente cuando todos los factores en su proceso son bien entendidos. Conoce las herramientas que te permitirán realizar un diagnóstico, estructuración y ejecución de una estrategia de marketing. Elabora tu estrategia de marketing para llevar tu marca a potenciales consumidores. Mide los resultados de tu estrategia y descubre algunas ideas que la fortalecerán."},{"has_course":false,"content_type":"video","language_type":"native","color":"#436b0e","badge":"https://static.platzi.com/media/achievements/badge-introduccion-marketing-videojuegos-4de9dfc3-b723-4fc4-a282-666b533e8451.png","cover_url":"","social_description":"Crea, diseña y ejecuta campañas efectivas de marketing digital enfocadas en videojuegos. Conoce cómo segmentar la audiencia para que alcances a tu público objetivo y conoce herramientas útiles para medir tus resultados en conversiones y ventas.","bought":false,"is_new":false,"slug":"marketing-vg","free":false,"cover_vertical_url":"","lang":"es","order":0,"url":"/clases/marketing-vg/","teachers":[],"is_required":false,"buy_url":"/adquirir/marketing-vg/curso/","title":"Curso de Introducción al Marketing para Videojuegos","language_note":"","social_image_url":"https://static.platzi.com/media/courses/OG-Introduccion-Marketing-Videojuegos.png","launch_date":"2019-11-14T16:00:00-05:00","type":"paid","video":null,"id":1746,"image":"https://static.platzi.com/media/achievements/platzi-bd.png","live_url":"/clases/marketing-vg//live","description":"Crea, diseña y ejecuta campañas efectivas de marketing digital enfocadas en videojuegos. Conoce cómo segmentar la audiencia para que alcances a tu público objetivo y conoce herramientas útiles para medir tus resultados en conversiones y ventas."}],"is_christmas":false,"expensivest_course":{"discount_active":false,"has_discount":true,"price":"142.900","name":"course","slug":"bienvenido","course_name":"","plan_price":"279.000","copy":"1 solo curso, 1 solo pago","buy_url":"/cursos/","discount_amount":"136.100","symbol":"$","title":"Un solo curso","promo_price":"142.900","flag_url":"https://static.platzi.com/media/flags/CO.png","description":"pesos"},"lang":"es","start_url":"/login/","platform":{"title":"Platzi funciona","steps":[{"title":"Logra tus metas:","text":"No sólo videos: Clases concretas, descargables, prácticas y desde cualquier dispositivo.","image":"https://static.platzi.com/static/images/home-v4/platform_goals.d9939806abe9.png"},{"title":"Examen de Certificación","text":"Un diploma de certificación por curso y carrera. Tendrás proyectos reales para tu portafolio.","image":"https://static.platzi.com/static/images/home-v4/platform_certificate.d105cf39346c.png"},{"title":"La mejor comunidad","text":"Crearemos una ruta de aprendizaje personalizada y toda nuestra comunidad te acompañará.","image":"https://static.platzi.com/static/images/home-v4/platform_community.239657e18408.png"}]},"country_name":"Colombia","is_gdpr":false,"recent_courses":[{"has_course":false,"content_type":"video","language_type":"native","color":"#008647","badge":"https://static.platzi.com/media/achievements/bagde-algebra-lineal-machine-learning-dc3c7317-aaca-4320-b327-2986e965715f.png","cover_url":"","social_description":"Todos los modelos de Machine Learning son representados en vectores y matrices. Aplica el  Álgebra Lineal con Python al procesamiento de imágenes  e inicia tu carrera como Data Scientist.","bought":false,"is_new":false,"slug":"algebra-ml","free":false,"cover_vertical_url":"","lang":"es","order":0,"url":"/clases/algebra-ml/","teachers":[{"name":"Sebastián Sosa","image":"https://static.platzi.com/media/teachers/_PVK7462.jpg","twitter":"helblings","company":"Caburé","position":"Co-founder"}],"is_required":false,"buy_url":"/adquirir/algebra-ml/curso/","title":"Curso de Álgebra Lineal Aplicada para Machine Learning","language_note":"","social_image_url":"https://static.platzi.com/media/courses/OG-Algebra-Lineal-Machine-Learning.png","launch_date":"2019-11-08T18:00:00-05:00","type":"paid","video":"vMFAtGtN2eU","id":1728,"image":"https://static.platzi.com/media/achievements/platzi-bd.png","live_url":"/clases/algebra-ml//live","description":"Todos los modelos de Machine Learning son representados en vectores y matrices. Aplica el  Álgebra Lineal con Python al procesamiento de imágenes  e inicia tu carrera como Data Scientist."},{"has_course":false,"content_type":"video","language_type":"native","color":"#008647","badge":"https://static.platzi.com/media/achievements/badge-algebra-python-5ea49736-48b6-48b4-906f-cedc4ee10b61.png","cover_url":"","social_description":"Conoce y aplica todos los conceptos fundamentales de Álgebra Lineal, la rama de las matemáticas que estudia los vectores, matrices y tensores, que necesitas para desarrollar tu carrera profesional como científico de datos.","bought":false,"is_new":false,"slug":"algebra-lineal","free":false,"cover_vertical_url":"","lang":"es","order":0,"url":"/clases/algebra-lineal/","teachers":[{"name":"Sebastián Sosa","image":"https://static.platzi.com/media/teachers/_PVK7462.jpg","twitter":"helblings","company":"Caburé","position":"Co-founder"}],"is_required":false,"buy_url":"/adquirir/algebra-lineal/curso/","title":"Curso de Fundamentos de Álgebra Lineal con Python","language_note":"","social_image_url":"https://static.platzi.com/media/courses/og-algebra-python.png","launch_date":"2019-11-07T18:00:00-05:00","type":"paid","video":"yfh8obgCy98","id":1725,"image":"https://static.platzi.com/media/achievements/platzi-bd.png","live_url":"/clases/algebra-lineal//live","description":"Conoce y aplica todos los conceptos fundamentales de Álgebra Lineal, la rama de las matemáticas que estudia los vectores, matrices y tensores, que necesitas para desarrollar tu carrera profesional como científico de datos."},{"has_course":false,"content_type":"video","language_type":"native","color":"#edd94f","badge":"https://static.platzi.com/media/achievements/badge-fundamento-gestion-proyectos-2f8ccca7-8f51-4a7b-abe2-dadf9d27dab4.png","cover_url":"","social_description":"Domina el funcionamiento de los proyectos desde su inicio, planificación, ejecución, control y cierre. Cumple con las metas de cualquier proyecto  teniendo en cuenta las restricciones, domina los principios básicos de la gestión de proyectos y dirige e intégrate exitosamente a equipos de trabajo en gestión de proyectos","bought":false,"is_new":false,"slug":"gestion","free":false,"cover_vertical_url":"","lang":"es","order":0,"url":"/clases/gestion/","teachers":[{"name":"Isabella Arévalo","image":"https://static.platzi.com/media/teachers/1909_gestion_PHOTOS_web_2.png","twitter":"bellarevalo","company":"Universidad Tecnológica Centroamericana","position":"Docente"}],"is_required":false,"buy_url":"/adquirir/gestion/curso/","title":"Curso de Fundamentos de Gestión de Proyectos","language_note":"","social_image_url":"https://static.platzi.com/media/courses/Opengraph-fundamentos-gestion-proyectos.png","launch_date":"2019-11-06T14:00:00-05:00","type":"paid","video":"NIsa7Vaw4Nc","id":1721,"image":"https://static.platzi.com/media/achievements/platzi-bd.png","live_url":"/clases/gestion//live","description":"Domina el funcionamiento de los proyectos desde su inicio, planificación, ejecución, control y cierre. Cumple con las metas de cualquier proyecto  teniendo en cuenta las restricciones, domina los principios básicos de la gestión de proyectos y dirige e intégrate exitosamente a equipos de trabajo en gestión de proyectos"},{"has_course":false,"content_type":"video","language_type":"native","color":"#fd7d7a","badge":"https://static.platzi.com/media/achievements/badge-computacion-basica-7bbb6f8a-04e3-4af2-82f2-8b8f2932ba04.png","cover_url":"","social_description":"¿Eres principiante y quieres tener las bases para manejar tu computadora de manera autónoma? Inicia en el mundo de la computación y aprende a instalar programas en Windows 10. Envía correos, gestiona tu seguridad e identifica las partes básica de una computadora.","bought":false,"is_new":false,"slug":"computacion-basica","free":false,"cover_vertical_url":"","lang":"es","order":0,"url":"/clases/computacion-basica/","teachers":[{"name":"Ricardo Celis","image":"https://static.platzi.com/media/teachers/fotoPlatzi.png","twitter":"celismx","company":"Platzi","position":"Education Team"}],"is_required":false,"buy_url":"/adquirir/computacion-basica/curso/","title":"Curso de Computación Básica","language_note":"","social_image_url":"https://static.platzi.com/media/courses/Opengraphcomputacion-basica_1.jpg","launch_date":"2019-11-05T18:00:00-05:00","type":"paid","video":"ksJe2uxqDMU","id":1741,"image":"https://static.platzi.com/media/achievements/platzi-bd.png","live_url":"/clases/computacion-basica//live","description":"¿Eres principiante y quieres tener las bases para manejar tu computadora de manera autónoma? Inicia en el mundo de la computación y aprende a instalar programas en Windows 10. Envía correos, gestiona tu seguridad e identifica las partes básica de una computadora."},{"has_course":false,"content_type":"video","language_type":"native","color":"#72af51","badge":"https://static.platzi.com/media/achievements/badge-deep-learning-pytorch-ee3f9279-1b24-4cc8-a1b6-9311d3f28de4.png","cover_url":"","social_description":"Deep Learning es una de las ramas de la Inteligencia Artificial que te permite entrenar modelos que puedan tomar decisiones basadas en datos. Con el Curso de Deep Learning con Pytorch de Platzi aprenderás a crear, implementar y entrenar tu propio modelo de aprendizaje profundo.","bought":false,"is_new":false,"slug":"deep-learning","free":false,"cover_vertical_url":"","lang":"es","order":0,"url":"/clases/deep-learning/","teachers":[{"name":"Juan Pablo Morales","image":"https://static.platzi.com/media/teachers/Screen_Shot_2017-09-21_at_12.06.44_PM.png","twitter":"JuanpaMF","company":"Arara","position":"Gerente de ingeniería"}],"is_required":false,"buy_url":"/adquirir/deep-learning/curso/","title":"Curso de Deep Learning con Pytorch","language_note":"","social_image_url":"https://static.platzi.com/media/courses/Opengraph-deep-learning-pytorch.png","launch_date":"2019-11-04T17:00:00-05:00","type":"paid","video":null,"id":1724,"image":"https://static.platzi.com/media/achievements/platzi-bd.png","live_url":"/clases/deep-learning//live","description":"Deep Learning es una de las ramas de la Inteligencia Artificial que te permite entrenar modelos que puedan tomar decisiones basadas en datos. Con el Curso de Deep Learning con Pytorch de Platzi aprenderás a crear, implementar y entrenar tu propio modelo de aprendizaje profundo."},{"has_course":false,"content_type":"video","language_type":"native","color":"#004d96","badge":"https://static.platzi.com/media/achievements/badge-ar-spark-4e2e0f56-da23-49a3-9ef1-ad6fcc3d75e1.png","cover_url":"","social_description":"Utiliza Spark AR Studio para crear experiencias de realidad aumentada y genera contenido para redes sociales y eventos. También puedes simular objetos de AR en su proporción real, por lo que es ideal para arquitectos y diseñadores. Aprende los fundamentos del uso de esta herramienta: face tracking, hand tracking, plane tracking, object tracking, texturas y objetos 3D.","bought":false,"is_new":false,"slug":"spark-ar","free":false,"cover_vertical_url":"","lang":"es","order":0,"url":"/clases/spark-ar/","teachers":[{"name":"Edward Ramos","image":"https://static.platzi.com/media/teachers/02.Ramos.jpg","twitter":"srRamos17","company":"Platzi","position":"Frontend Developer"}],"is_required":false,"buy_url":"/adquirir/spark-ar/curso/","title":"Curso de Realidad Aumentada con Spark AR","language_note":"","social_image_url":"https://static.platzi.com/media/courses/Opengraph.png","launch_date":"2019-11-01T16:00:00-05:00","type":"paid","video":null,"id":1683,"image":"https://static.platzi.com/media/achievements/platzi-bd.png","live_url":"/clases/spark-ar//live","description":"Utiliza Spark AR Studio para crear experiencias de realidad aumentada y genera contenido para redes sociales y eventos. También puedes simular objetos de AR en su proporción real, por lo que es ideal para arquitectos y diseñadores. Aprende los fundamentos del uso de esta herramienta: face tracking, hand tracking, plane tracking, object tracking, texturas y objetos 3D."},{"has_course":false,"content_type":"video","language_type":"native","color":"#96d001","badge":"https://static.platzi.com/media/achievements/badge-matematicasai-dfba66db-91ab-4ec1-a4a4-9677b072fe24.png","cover_url":"","social_description":"Explora el funcionamiento de la inteligencia artificial desde la lógica y las matemáticas. Conoce los conceptos matemáticos clave usados en Inteligencia Artificial. Aprende como funcionan los algoritmos que procesan datos para clasificar, agrupar, identificar patrones y más.","bought":false,"is_new":false,"slug":"matematicas-ai","free":false,"cover_vertical_url":"","lang":"es","order":0,"url":"/clases/matematicas-ai/","teachers":[{"name":"Rafael Fernando Díaz Gaztelu","image":"https://static.platzi.com/media/teachers/50d43733-da86-4136-994d-36f5dea94ab7_-_Rafa_D.jpg","twitter":"rafadiazgaz","company":"Clubes de Ciencia España","position":"Organizador"}],"is_required":false,"buy_url":"/adquirir/matematicas-ai/curso/","title":"Curso de Fundamentos Matemáticos para Inteligencia Artificial","language_note":"","social_image_url":"https://static.platzi.com/media/courses/og-matematicasai.png","launch_date":"2019-10-31T14:00:00-05:00","type":"paid","video":null,"id":1729,"image":"https://static.platzi.com/media/achievements/platzi-bd.png","live_url":"/clases/matematicas-ai//live","description":"Explora el funcionamiento de la inteligencia artificial desde la lógica y las matemáticas. Conoce los conceptos matemáticos clave usados en Inteligencia Artificial. Aprende como funcionan los algoritmos que procesan datos para clasificar, agrupar, identificar patrones y más."},{"has_course":false,"content_type":"video","language_type":"native","color":"#c842cc","badge":"https://static.platzi.com/media/achievements/badge-arte-personajes-2d-c2171119-e268-46a3-a512-93c13f9f5313.png","cover_url":"","social_description":"Aprende conceptos como silueta, línea de acción y perspectiva para que puedas diseñar personajes memorables. Usa photoshop para hacer realidad tus bocetos. Tus personajes quedarán listos para que un artista 3D comience a modelarlos.","bought":false,"is_new":false,"slug":"personajes-2d","free":false,"cover_vertical_url":"","lang":"es","order":0,"url":"/clases/personajes-2d/","teachers":[{"name":"Carlos Ávila","image":"https://static.platzi.com/media/teachers/WhatsApp_Image_2019-09-16_at_10.03.08_AM.jpeg","twitter":"","company":"Escuela Escena","position":"Profesor de dibujo y artista"}],"is_required":false,"buy_url":"/adquirir/personajes-2d/curso/","title":"Curso de Arte para Personajes 2D","language_note":"","social_image_url":"https://static.platzi.com/media/courses/Opengraph-arte-personajes-2D.png","launch_date":"2019-10-30T18:00:00-05:00","type":"paid","video":null,"id":1738,"image":"https://static.platzi.com/media/achievements/platzi-bd.png","live_url":"/clases/personajes-2d//live","description":"Aprende conceptos como silueta, línea de acción y perspectiva para que puedas diseñar personajes memorables. Usa photoshop para hacer realidad tus bocetos. Tus personajes quedarán listos para que un artista 3D comience a modelarlos."},{"has_course":false,"content_type":"video","language_type":"native","color":"#c842cc","badge":"https://static.platzi.com/media/achievements/mesa-de-trabajo-287-8d2fcee3-34ca-47a3-8fd4-cf23bb93fe85.png","cover_url":"","social_description":"Aprende a usar todas las herramientas narrativas necesarias para construir la psicología de tu personaje. Desarrollaremos personajes desde su arquetipo básico hasta darles un arco narrativo completo. Además, aprenderemos ejercicios creativos que te ayudarán a darles profundidad. Este curso es para todos los interesados en ser guionistas o directores creativos.","bought":false,"is_new":false,"slug":"creacion-personajes","free":false,"cover_vertical_url":"","lang":"es","order":0,"url":"/clases/creacion-personajes/","teachers":[{"name":"Humberto Cervera","image":"https://static.platzi.com/media/teachers/WhatsApp_Image_2019-09-18_at_9.29.25_AM.jpeg","twitter":"Game_Brains","company":"Creador Independiente","position":"Escritor y Productor"}],"is_required":false,"buy_url":"/adquirir/creacion-personajes/curso/","title":"Curso de Introducción  a la Creación de Personajes","language_note":"","social_image_url":"https://static.platzi.com/media/courses/Opengraph-int-creaci%C3%B3n-personajes_1.png","launch_date":"2019-10-25T17:00:00-05:00","type":"paid","video":"g4Zw3oX4IxA","id":1733,"image":"https://static.platzi.com/media/achievements/platzi-bd.png","live_url":"/clases/creacion-personajes//live","description":"Aprende a usar todas las herramientas narrativas necesarias para construir la psicología de tu personaje. Desarrollaremos personajes desde su arquetipo básico hasta darles un arco narrativo completo. Además, aprenderemos ejercicios creativos que te ayudarán a darles profundidad. Este curso es para todos los interesados en ser guionistas o directores creativos."},{"has_course":false,"content_type":"video","language_type":"native","color":"#acdf00","badge":"https://static.platzi.com/media/achievements/badge-infraestructura-codigo-aws-523f9344-e19f-4d04-bd06-8b6c159e95e7.png","cover_url":"","social_description":"Automatiza y gestiona la configuración de tus centros de computo.  Implementa arquitecturas escalables y fáciles de replicar. Automatiza los despliegues de arquitectura con CloudFormation, el servicio de Infraestructura como Código de AWS.","bought":false,"is_new":false,"slug":"iaac-aws","free":false,"cover_vertical_url":"","lang":"es","order":0,"url":"/clases/iaac-aws/","teachers":[{"name":"Carlos Zambrano","image":"https://static.platzi.com/media/teachers/fN423K8m_400x400.jpg","twitter":"czam01","company":"Globant","position":"Cloud Architect"}],"is_required":false,"buy_url":"/adquirir/iaac-aws/curso/","title":"Curso de Infraestructura Como Código en AWS","language_note":"","social_image_url":"https://static.platzi.com/media/courses/Opengraph-Infraestructura-Codigo-AWS.png","launch_date":"2019-10-24T18:00:00-05:00","type":"paid","video":null,"id":1717,"image":"https://static.platzi.com/media/achievements/platzi-bd.png","live_url":"/clases/iaac-aws//live","description":"Automatiza y gestiona la configuración de tus centros de computo.  Implementa arquitecturas escalables y fáciles de replicar. Automatiza los despliegues de arquitectura con CloudFormation, el servicio de Infraestructura como Código de AWS."},{"has_course":false,"content_type":"video","language_type":"native","color":"#fd7d7a","badge":"https://static.platzi.com/media/achievements/badge-powerpoint-064ac3a0-17b9-420c-9fc3-740689e6374d.png","cover_url":"","social_description":"Crea informes atractivos y efectivos. Domina funcionalidades de PowerPoint para editar gráficos y transmitir ideas de forma eficaz. Utiliza herramientas prácticas e interactivas como Zoom y Google Meets. Configura y administra presentaciones con tu equipo de trabajo y consigue que las tareas del día sean prácticas con Platzi.","bought":false,"is_new":false,"slug":"microsoft-powerpoint","free":false,"cover_vertical_url":"","lang":"es","order":0,"url":"/clases/microsoft-powerpoint/","teachers":[{"name":"Daniel Sánchez","image":"https://static.platzi.com/media/teachers/DanielWho.jpg","twitter":"danielowho","company":"Platzi","position":"Analista de Datos"}],"is_required":false,"buy_url":"/adquirir/microsoft-powerpoint/curso/","title":"Gestión de Documentos Digitales con PowerPoint","language_note":"","social_image_url":"https://static.platzi.com/media/courses/og-powerpoint.png","launch_date":"2019-10-23T17:00:00-05:00","type":"paid","video":null,"id":1720,"image":"https://static.platzi.com/media/achievements/platzi-bd.png","live_url":"/clases/microsoft-powerpoint//live","description":"Crea informes atractivos y efectivos. Domina funcionalidades de PowerPoint para editar gráficos y transmitir ideas de forma eficaz. Utiliza herramientas prácticas e interactivas como Zoom y Google Meets. Configura y administra presentaciones con tu equipo de trabajo y consigue que las tareas del día sean prácticas con Platzi."},{"has_course":false,"content_type":"video","language_type":"native","color":"#fdc001","badge":"https://static.platzi.com/media/achievements/badge-eng-management-8aa3f5cb-e16d-4ef6-8ef0-ff244a6ab746.png","cover_url":"","social_description":"En tu carrera como ingeniera tienes dos caminos claros de crecimiento, puedes enfocarte en ser cada día mejor desarrollador y crecer técnicamente o puedes enfocarte en ser un gerente de ingeniería y enfocarte en hacer crecer a tu equipo y con esto a tu empresa.\r\nEn este curso te damos todas las bases que necesitarás tener para comenzar tu camino como Manager de forma exitosa.","bought":false,"is_new":false,"slug":"eng-management","free":false,"cover_vertical_url":"","lang":"es","order":0,"url":"/clases/eng-management/","teachers":[{"name":"Juan Pablo Buriticá","image":"https://static.platzi.com/media/teachers/Anotaci%C3%B3n_2019-10-21_090133.png","twitter":"Buritica","company":"Splice","position":"VP of Engineering"}],"is_required":false,"buy_url":"/adquirir/eng-management/curso/","title":"Curso de Engineering Management","language_note":"","social_image_url":"https://static.platzi.com/media/courses/og-eng-management.png","launch_date":"2019-10-22T20:00:00-05:00","type":"paid","video":"sPB-X6Uc24M","id":1732,"image":"https://static.platzi.com/media/achievements/platzi-bd.png","live_url":"/clases/eng-management//live","description":"En tu carrera como ingeniera tienes dos caminos claros de crecimiento, puedes enfocarte en ser cada día mejor desarrollador y crecer técnicamente o puedes enfocarte en ser un gerente de ingeniería y enfocarte en hacer crecer a tu equipo y con esto a tu empresa.\r\nEn este curso te damos todas las bases que necesitarás tener para comenzar tu camino como Manager de forma exitosa."},{"has_course":false,"content_type":"video","language_type":"native","color":"#fd7d7a","badge":"https://static.platzi.com/media/achievements/badge-word-6afaf389-824d-4b60-a0b8-91f1663a5c90.png","cover_url":"","social_description":"Utiliza el procesador de texto para distribuir información y gestionar documentos de forma ágil y simple. Aprende a usar herramientas como OCRs y OfficeLens para simplificar tu trabajo. Con Platzi, domina las herramientas de Microsoft Word y aprovéchalas para optimizar tus tareas del día a día.","bought":false,"is_new":false,"slug":"microsoft-word","free":false,"cover_vertical_url":"","lang":"es","order":0,"url":"/clases/microsoft-word/","teachers":[{"name":"Daniel Sánchez","image":"https://static.platzi.com/media/teachers/DanielWho.jpg","twitter":"danielowho","company":"Platzi","position":"Analista de Datos"}],"is_required":false,"buy_url":"/adquirir/microsoft-word/curso/","title":"Curso de Gestión de Documentos Digitales con Microsoft Word","language_note":"","social_image_url":"https://static.platzi.com/media/courses/og-word.png","launch_date":"2019-10-21T18:00:00-05:00","type":"paid","video":null,"id":1719,"image":"https://static.platzi.com/media/achievements/platzi-bd.png","live_url":"/clases/microsoft-word//live","description":"Utiliza el procesador de texto para distribuir información y gestionar documentos de forma ágil y simple. Aprende a usar herramientas como OCRs y OfficeLens para simplificar tu trabajo. Con Platzi, domina las herramientas de Microsoft Word y aprovéchalas para optimizar tus tareas del día a día."},{"has_course":false,"content_type":"video","language_type":"native","color":"#fd7d7a","badge":"https://static.platzi.com/media/achievements/badge-finanzas-personales-futuro-66c11bf0-4d51-4570-9967-6dd543da4f7c.png","cover_url":"","social_description":"¿Alguna vez  te has  preguntado cómo quieres que sea tu futuro financiero? ¿Has pensado en tu retiro o tu pensión?  Estás en el mejor momento para aprender a invertir y ahorrar. Así podrás tener el capital suficiente para tomarte un año sabático y para tener una vejez plena.","bought":false,"is_new":false,"slug":"finanzas-futuro","free":false,"cover_vertical_url":"","lang":"es","order":0,"url":"/clases/finanzas-futuro/","teachers":[{"name":"Liliana Zamacona","image":"https://static.platzi.com/media/teachers/WhatsApp_Image_2019-09-12_at_12.24.29_PM.jpeg","twitter":"lachinafinanciera","company":"Mujer Inversionista","position":"Co-fundadora"}],"is_required":false,"buy_url":"/adquirir/finanzas-futuro/curso/","title":"Curso de Finanzas Personales para el Futuro","language_note":"","social_image_url":"https://static.platzi.com/media/courses/Opengraph-finanzas-personales-futuro_1.png","launch_date":"2019-10-18T17:00:00-05:00","type":"paid","video":null,"id":1727,"image":"https://static.platzi.com/media/achievements/platzi-bd.png","live_url":"/clases/finanzas-futuro//live","description":"¿Alguna vez  te has  preguntado cómo quieres que sea tu futuro financiero? ¿Has pensado en tu retiro o tu pensión?  Estás en el mejor momento para aprender a invertir y ahorrar. Así podrás tener el capital suficiente para tomarte un año sabático y para tener una vejez plena."},{"has_course":false,"content_type":"audio","language_type":"native","color":"#fd7d7a","badge":"https://static.platzi.com/media/achievements/mesa-de-trabajo-38-33c261c4-28ea-4541-8ed9-3a7376ea0f6f.png","cover_url":"","social_description":"Transfórmate de un creativo a un creador. Aprende cómo trabajar con tus ideas hasta el punto en que sean realidad y elimina todos los pretextos que te detienen de empezar. Este curso es 100% audio, escúchalo solo en la App de Platzi.","bought":false,"is_new":false,"slug":"desbloquea-creatividad","free":false,"cover_vertical_url":"","lang":"es","order":0,"url":"/clases/desbloquea-creatividad/","teachers":[{"name":"Cesar Fajardo","image":"https://static.platzi.com/media/teachers/cesar_fajardo_teacher.jpg","twitter":"fajardocesar","company":"Platzi","position":"Video Producer"}],"is_required":false,"buy_url":"/adquirir/desbloquea-creatividad/curso/","title":"Curso para Desbloquear tu Creatividad","language_note":"","social_image_url":"https://static.platzi.com/media/courses/Opengraph-creatividad.png","launch_date":"2019-10-18T15:00:00-05:00","type":"paid","video":null,"id":1634,"image":"https://static.platzi.com/media/achievements/platzi-bd.png","live_url":"/clases/desbloquea-creatividad//live","description":"Transfórmate de un creativo a un creador. Aprende cómo trabajar con tus ideas hasta el punto en que sean realidad y elimina todos los pretextos que te detienen de empezar. Este curso está diseñado para ser consumido 100% en audio y es exclusivo de la App."}],"careers":[],"can_buy":true,"exclusive_courses":[{"color":"#fdc001","url":"/cursos/taller-startups/","title":"Taller de creación de Startups","badge_url":"https://static.platzi.com/media/achievements/badge-taller-creacion-startups-f72974de-ce1e-4767-bd47-988ed8f3369a.png"},{"color":"#fdc001","url":"/cursos/creacion-de-empresas/","title":"Introducción a la Creación de Empresas y Startups","badge_url":"https://static.platzi.com/media/achievements/1186-0cbf6899-eeb8-4b9e-9bf9-a55a004e4307.png"},{"color":"#fd7d7a","url":"/cursos/ingles/","title":"Curso de Inglés Técnico para Profesionales","badge_url":"https://static.platzi.com/media/achievements/1188-ea5968c2-aedf-436c-bd94-9141a594770f.png"},{"color":"#fdc001","url":"/cursos/financiera-startups-2017/","title":"Curso de Gestión Financiera para Startups-2017","badge_url":"https://static.platzi.com/media/achievements/badge-financiera-bac2ce86-e4f5-41fe-83da-708ecb16e79a.png"},{"color":"#fdc001","url":"/cursos/developer/","title":"Cómo conseguir trabajo en Programación","badge_url":"https://static.platzi.com/media/achievements/1227-863956bd-65fd-4ca3-b2de-51d8e67786ca.png"},{"color":"#fdc001","url":"/cursos/internacionalizacion-startups/","title":"Curso de Internacionalización para Startups","badge_url":"https://static.platzi.com/media/achievements/1266-0dbaeb6d-379d-4e62-add3-902e718bc95e.png"},{"color":"#fd7d7a","url":"/cursos/ingles-basico/","title":"Curso de Inglés Básico para Principiantes","badge_url":"https://static.platzi.com/media/achievements/badge-basico-ingles-e073f711-763d-4129-badc-5e4baa78b225.png"},{"color":"#fd7d7a","url":"/cursos/ingles-gramatica/","title":"Curso de Inglés Básico: Gramática","badge_url":"https://static.platzi.com/media/achievements/1370-836f01ea-6748-4c9f-a8e0-ce51c7c28d0b.png"},{"color":"#fd7d7a","url":"/cursos/ingles-conversacion/","title":"Curso de Inglés Básico: Conversación","badge_url":"https://static.platzi.com/media/achievements/1371-db5ea3c7-4ac9-4b61-b786-9346ebb3fc7f.png"}],"courses":[],"is_cifes":false,"order_plans":["annual_plan","monthly_plan","course"],"is_authenticated":false,"all_courses":true,"hero":{"title":"La escuela online de formación profesional en tecnología","copy":[{"percentage":70,"text":"de los graduados de Platzi \u003cbr/> duplican sus ingresos"},{"percentage":20,"text":"crean su propia empresa \u003cbr/> de tecnología o startup"}],"cta":"Regístrate a un curso nuevo","cta2":"Comienza ahora","firstClass":"Toma tu primera clase","image":"https://static.platzi.com/static/images/home-v4/hero_person_md.0fe547e6c79c.png","image_2":"https://static.platzi.com/static/images/home-v4/hero_person.9bd5b0bc5be7.png"},"search_bar":true,"categories":[{"title":"Desarrollo e ingeniería","url":"/categorias/desarrollo/","head":"https://static.platzi.com/static/images/christmas/christmas-2018/desarrollo.0b26b65fc945.jpg","courses":212,"id":5,"color":"#33b13a","slug":"desarrollo"},{"title":"Crecimiento Profesional","url":"/categorias/crecimiento-profesional/","head":"https://static.platzi.com/static/images/christmas/christmas-2018/crecimiento.8a19f8e421cf.jpg","courses":31,"id":11,"color":"#cb161d","slug":"crecimiento-profesional"},{"title":"Negocios y emprendimiento","url":"/categorias/negocios/","head":"https://static.platzi.com/static/images/christmas/christmas-2018/negocios.a19aeb3eadc0.jpg","courses":38,"id":8,"color":"#f5c443","slug":"negocios"},{"title":"Diseño y UX","url":"/categorias/diseno/","head":"https://static.platzi.com/static/images/christmas/christmas-2018/design.5cfa1e806591.jpg","courses":50,"id":6,"color":"#6b407e","slug":"diseno"},{"title":"Producción Audiovisual","url":"/categorias/produccion-audiovisual/","head":"https://static.platzi.com/static/images/christmas/christmas-2018/audiovisual.3b4b5d47d7b1.jpg","courses":18,"id":10,"color":"#fa7800","slug":"produccion-audiovisual"},{"title":"Marketing","url":"/categorias/marketing/","head":"https://static.platzi.com/static/images/christmas/christmas-2018/marketing.c9440940f886.jpg","courses":29,"id":7,"color":"#29b8e8","slug":"marketing"}],"i18n":{"FirstClass_title":"Toma tu primera clase","login.fb":"Ingresa con facebook","LaunchDate":"Lanzamiento: ","login.email.title":"Con tu Email","HeroPlansDetail":"Con planes para \u003ca href=\"/precios/\">personas\u003c/a> o \u003ca href=\"/empresas/\">empresas\u003c/a>","ResultsTitle":"Para más resultados oprime ENTER","courses.title":"Nuestros cursos","admin.add":"Crear un nuevo curso","contributions.filters.best":"Mejores","contributions.filters.new":"Nuevos","welcome":"Regístrate a Platzi","StudyBannerTitle":"Clases en video, lecturas, proyectos colaborativos, desafíos, quizzes, ejercicios, en tu móvil o escritorio","HomeTestimonials_copy_all":"Platzi es la estrategia de formación de miles de personas para conseguir un mejor empleo o crear una empresa de tecnología","NextReleases_box_title":"Próximos lanzamientos","contributions.item.comments":"{amount, plural, =0 {Sin comentarios} one {1 comentario} other {{amount} comentarios}}","SuggestCourse-placeholder":"¿Qué quisieras aprender?","HomeSearch-imput":"Busca entre los más de {cursos} cursos","highlighted.empty.primary":"Comparte tus conocimientos sobre:","highlighted.readMore":"Leer más...","HomeTestimonials_link":"Conoce \u003cstrong>todas las historias\u003c/strong>","careerList.popular":"Populares","continue":"Continúa","careerList.more":"Más carreras","terms":"Términos de Uso","MeetOurBlog":"Conoce nuestro Blog","CareersSectionSubtitle":"Al suscribirte, personalizamos tu ruta de aprendizaje para que logres tus objetivos profesionales","outstanding.recommend":"Te recomendamos","login.tw":"Ingresa con twitter","privacy":"Políticas de privacidad","CareersSectionTitle":"Tenemos más de {coursesRounded} cursos y {careersSize} carreras","breadcrumb.tutorial":"Posts","HeroLearn":"Aprende:","CoursesList-message-text":"Si ya eres alumno puedes","SuggestCourse-title":"No encontramos el curso que buscas.","name":"Nombre","HomeTestimonials_title":"Historias y testimonios","agree":"Acepto los {terms} y {privacy} de Platzi","Platform_title":"Platzi funciona","StudyBannerSubtitle":"¿Qué te detiene a invertir en ti?","contributions.title":"Posts","highlighted.empty.button":"Más cursos","form.title":"Regístrate a Platzi","SuggestCourse-recommend":"Enviar","NextCourse":"Próximo Curso","CardCareer":"Carrera de","careerList.all":"Todas","RegisterSuscribe":"Suscríbete hoy","contributions.filters.drafts":"Borradores","login.password.forgot":"¿Olvidaste tu contraseña?","HomeSearch-title":"¿En qué quieres especializarte?","login.social":"Con tus redes sociales","form.email":"Correo electrónico","CoursesList-message-cta":"Ingresa al curso","HeroCareersCount":"y {careersSize} carreras más","startNow":"Comienza ahora","RegisterTitle":"Aprende de expertos en programación, diseño, marketing, startups, video y web.","form.name":"Nombre","RecentCourses_title":"Nuevos cursos lanzados","TestimoniesTitle":"Tu felicidad es nuestro éxito","login.email":"Correo electrónico","contributions.filters.top":"Más votados","breadcrumb.start":"Inicio","highlighted.empty.secondary":"¡Sé el primero en crear un post!","Courses":"cursos","Business_digital":"Capacitamos a tu empresa en transformación digital y las tecnologías más competitivas del mercado.","Business_link":"\u003cstrong>Inscribe tu empresa\u003c/strong>","course.material":"Materiales","start_learning":"Comienza ahora","StudyBannerCTA":"Comienza a estudiar","HomeBusinessCta-title":"Conoce como \u003cstrong>inscribir tu empresa\u003c/strong>","HomeCta-title":"La comunidad de estudiantes más grande de latinoamerica","ogin.account":"¿Aún no tienes cuenta? \u003ca href=\"/signup/?next={next}\" class=\"link\">Regístrate aquí\u003c/a>","form.button":"Comienza ahora","email":"Correo electrónico","SuggestCourse-title_2":"Cuéntanos qué curso o temática te gustaría que esté en nuestra plataforma y te notificaremos cuando esté disponible:","mainTitle":"Regístrate a Platzi"}}}</script>
          <script id="initialProps" >window.initialProps = {}</script>
          <script id="translations" >window.translations = {"locale":"es","messages":{"details_text_mobile":"Compra Platzi Expert a un precio especial.","details_text_desktop":"Acelera tu carrera profesional \u003cbr /> \u003cstrong>Compra Platzi Expert a un precio especial\u003c/strong>","countdown_text":"Termina en:","contactus_title":"¿Tienes dudas o quieres comunicarte con nosotros? ","contactus_subtitle":"Elige el medio que más te convenga, te sugerimos ","write":"Escríbenos","dm":"Mensaje Directo","telephone":"Teléfono","continue_watching":"Continua viendo","all_courses":"Ver todos mis cursos","username":"¡Hola, {user_name}!","subscriptionTime":"Tienes {subscription_time} días de tu Plan","view_profile":"Ver mi Perfil","logout":"Cerrar sesión","login":"Iniciar sesión","live_in":"En Vivo","live":"live","menu":"Menú","view_plans":"Quiero saber más","courses":"Cursos.","more_results":"Más resultados","careers":"Carreras","no_results":"No tenemos resultados destacados","avanced_search":"Presiona ENTER para una busqueda avanzada","init_plan":"Iniciar mi plan","init_plan2":"Planes","switch_language":"Do you want to switch to Platzi in English?","switch_english":"Yes, switch to English","user_login":"Inicia sesión o crea tu cuenta","nextPage":"Siguiente","searchPlaceholder":"Buscar en Platzi","login_live_text":"Participa en sesiones en vivo y foros de Platzi","login_courses_text":"Accede a más de 120 cursos","login_opportunities":"Accede a mejores oportunidades laborales","mark_as_read":"Marcar todas como leídas","title":"Tus notificaciones","hide":"Ocultar","hide_description":"Ocultar esta notificación del historial","undo":"Deshacer","notification_hidden":"Se ocultó la notificatión.","notification_empty_title":"¡Aún no tienes notificaciones!","notification_emtpy_subtitle":"Participa, comparte y discute para empezar a recibir notificaciones","see_all":"Ver todas","notifications_disabled_title":"¡Tus notificaciones están desactivadas!","notification_not_available_title":"¡Lo sentimos!","notifications_not_available_subtitle":"El contenido al que intentas acceder no se encuentra disponible.","notifications_disabled_subtitle":"Para recibir nuevamente tus notificaciones debes activarlas en \u003cspan class='icon-cog'>\u003c/span>","required_courses":"Cursos Obrigatórios","awardsText":"Reconocidos y premiados por","fromLatam":"De LATAM con ","toTheWorld":"para el mundo","FooterShareLink":"Comparte este link y por cada registro con esta URL te damos un mes","FooterCopyLink":"ingrese un link","qualityEducation":"Educación online de calidad","FooterfollowUs":"Ver todas","FooterChangeLang":"Cambiar idioma","SubscribeSectionTitle":"Entérate de todas las novedades en educación, negocios y tecnología","SubscribeSectionCTA":"Suscríbete","YourEmail":"Correo electrónico","LoginSocial-facebook-login":"Inicia sesión con Facebook","LoginSocial-twitter-login":"Inicia sesión con Twitter","login_email":"Tu email","login_password":"Tu contraseña","LoginWithEmail-login":"Inicia sesión","LoginWithEmail-lostpassword":"¿Olvidaste tu contraseña?","AccountFooter-title-register":"¿Aún no tienes cuenta en Platzi?","AccountFooter-register":"Regístrate","AccountFooter-login":"Inicia tu sesión","AccountFooter-title-login ":"¿Ya tienes una cuenta?","RegisterButton-email":"Regístrate con tu Email","LoginSocial-twitter-register":"Regístrate con Twitter","LoginSocial-facebook-register":" Regístrate con Facebook","welcome":"Regístrate a Platzi","name":"Nombre","email":"Correo electrónico","start_learning":"Comienza ahora","mainTitle":"Regístrate a Platzi","startNow":"Comienza ahora","login.fb":"Ingresa con facebook","login.social":"Con tus redes sociales","login.tw":"Ingresa con twitter","login.email.title":"Con tu Email","login.email":"Correo electrónico","login.password.forgot":"¿Olvidaste tu contraseña?","ogin.account":"¿Aún no tienes cuenta? \u003ca href=\"/signup/?next={next}\" class=\"link\">Regístrate aquí\u003c/a>","careerList.all":"Todas","careerList.more":"Más carreras","careerList.popular":"Populares","breadcrumb.start":"Inicio","breadcrumb.tutorial":"Posts","highlighted.readMore":"Leer más...","highlighted.empty.primary":"Comparte tus conocimientos sobre:","highlighted.empty.secondary":"¡Sé el primero en crear un post!","highlighted.empty.button":"Más cursos","form.title":"Regístrate a Platzi","form.name":"Nombre","form.email":"Correo electrónico","form.button":"Comienza ahora","outstanding.recommend":"Te recomendamos","contributions.title":"Posts","contributions.filters.best":"Mejores","contributions.filters.drafts":"Borradores","contributions.filters.new":"Nuevos","contributions.filters.top":"Más votados","contributions.item.comments":"{amount, plural, =0 {Sin comentarios} one {1 comentario} other {{amount} comentarios}}","agree":"Acepto los {terms} y {privacy} de Platzi","terms":"Términos de Uso","privacy":"Políticas de privacidad","courses.title":"Nuestros cursos","admin.add":"Crear un nuevo curso","course.material":"Materiales","continue":"Continúa","MeetOurBlog":"Conoce nuestro Blog","StudyBannerTitle":"Clases en video, lecturas, proyectos colaborativos, desafíos, quizzes, ejercicios, en tu móvil o escritorio","StudyBannerSubtitle":"¿Qué te detiene a invertir en ti?","StudyBannerCTA":"Comienza a estudiar","CareersSectionTitle":"Tenemos más de {coursesRounded} cursos y {careersSize} carreras","CareersSectionSubtitle":"Al suscribirte, personalizamos tu ruta de aprendizaje para que logres tus objetivos profesionales","HeroLearn":"Aprende:","HeroCareersCount":"y {careersSize} carreras más","HeroPlansDetail":"Con planes para \u003ca href=\"/precios/\">personas\u003c/a> o \u003ca href=\"/empresas/\">empresas\u003c/a>","NextCourse":"Próximo Curso","LaunchDate":"Lanzamiento: ","RegisterTitle":"Aprende de expertos en programación, diseño, marketing, startups, video y web.","RegisterSuscribe":"Suscríbete hoy","ResultsTitle":"Para más resultados oprime ENTER","TestimoniesTitle":"Tu felicidad es nuestro éxito","CardCareer":"Carrera de","Courses":"cursos","Business_digital":"Capacitamos a tu empresa en transformación digital y las tecnologías más competitivas del mercado.","Business_link":"\u003cstrong>Inscribe tu empresa\u003c/strong>","NextReleases_box_title":"Próximos lanzamientos","HomeTestimonials_title":"Historias y testimonios","HomeSearch-title":"¿En qué quieres especializarte?","HomeSearch-imput":"Busca entre los más de {cursos} cursos","Platform_title":"Platzi funciona","HomeTestimonials_copy_all":"Platzi es la estrategia de formación de miles de personas para conseguir un mejor empleo o crear una empresa de tecnología","HomeTestimonials_link":"Conoce \u003cstrong>todas las historias\u003c/strong>","FirstClass_title":"Toma tu primera clase","RecentCourses_title":"Nuevos cursos lanzados","HomeCta-title":"La comunidad de estudiantes más grande de latinoamerica","HomeBusinessCta-title":"Conoce como \u003cstrong>inscribir tu empresa\u003c/strong>","SuggestCourse-title":"No encontramos el curso que buscas.","SuggestCourse-title_2":"Cuéntanos qué curso o temática te gustaría que esté en nuestra plataforma y te notificaremos cuando esté disponible:","SuggestCourse-placeholder":"¿Qué quisieras aprender?","SuggestCourse-recommend":"Enviar","CoursesList-message-text":"Si ya eres alumno puedes","CoursesList-message-cta":"Ingresa al curso","HeroContent_title":"La escuela online de formación profesional en tecnología","HomeCta-btn":"Comienza ahora","accept":"Términos de Uso","planExpert":"Plan Expert","planExpertText":"Desarrolla tus habilidades en programación, diseño, producción audiovisual, marketing y muchas más. Mide tu progreso y recibe certificados con tu nombre a finalizar cada curso."}}</script>
          <script async src="https://cdnjs.cloudflare.com/ajax/libs/lazysizes/5.1.2/lazysizes.min.js" async></script>
          <script async src="https://static.platzi.com/bff/assets/home.fd4b74f529f2f824400f.js" type="text/javascript"></script>
          <script async src="https://static.platzi.com/bff/assets/vendor.57d91dc77076e45cdc6c.js" type="text/javascript"></script>
          <!-- Fuente Lato -->
            <script type="text/javascript">WebFontConfig={google:{families:['Lato:300,400,700:latin']}};(function(){var wf=document.createElement('script');wf.src=('https:'==document.location.protocol?'https':'http')+'://ajax.googleapis.com/ajax/libs/webfont/1/webfont.js';wf.type='text/javascript';wf.async='true';var s=document.getElementsByTagName('script')[0];s.parentNode.insertBefore(wf,s);})();</script>
          <!-- End Fuente Lato -->
          <script async type="application/ld+json">
            {
                "@context": "http://schema.org",
                "@type": "Organization",
                "name": "Platzi",
                "url": "https://platzi.com/",
                "description": "Aprende de expertos en programación, diseño, marketing, startups, video y web. Suscríbete hoy.",
                "foundingDate": "2013-01-01",
                "founders": [
                    {
                        "@type": "Person",
                        "name": "John Freddy Vega"
                    },
                    {
                        "@type": "Person",
                        "name": "Christian Van Der Henst"
                    }
                ],
                "sameAs": [
                    "https://www.facebook.com/platzi/",
                    "https://twitter.com/Platzi",
                    "https://www.youtube.com/channel/UC55-mxUj5Nj3niXFReG44OQ",
                    "https://www.linkedin.com/school/2822346"
                ]
            }
          </script>
          <script src="https://wchat.freshchat.com/js/widget.js"></script>
          <script>
            window.fcWidget.init({
              token: "9f040694-40f6-4508-bbbf-153314894548",
              host: "https://wchat.freshchat.com"
            });
          </script>
        </body>
      </html >
  

Hagamos un parseo:

In [25]:
soup_platzi = BeautifulSoup(respuesta_platzi.text,'lxml')
HECHO!

ahora veamos que hay en esta "sopa"

In [28]:
titulo_platzi = soup_platzi.title
print(titulo_platzi.text)
Cursos Online Profesionales de Tecnología | ‎🚀 Platzi
In [29]:
print(soup_platzi.select('meta[name=description]'))
[<meta content="Aprende desde cero a crear el futuro web con nuestros Cursos Online Profesionales de Tecnología. ¡Cursos Únicos de Desarrollo, Diseño, Marketing y Negocios!" name="description"/>]
In [53]:
for meta in soup_platzi.select('meta[property]'):
    print(meta)
<meta content="263680607075199" property="fb:app_id"/>
<meta content="1030603473" property="fb:admins"/>
<meta content="Aprende desde cero a crear el futuro web con nuestros Cursos Online Profesionales de Tecnología. ¡Cursos Únicos de Desarrollo, Diseño, Marketing y Negocios!" property="og:description"/>
<meta content="Cursos Online Profesionales de Tecnología | ‎🚀 Platzi" property="og:title"/>
<meta content="website" property="og:type"/>
<meta content="https://platzi.com" property="og:url"/>
<meta content="https://static.platzi.com/media/meta_tags/og/social.0e9a162f1dba.jpg" property="og:image"/>
<meta content="https://platzi.com" property="og:site_name"/>
<meta content="4503599630205252" property="twitter:account_id"/>

Hagamos lago interesante, dentro de la categoria de desarrollo e ingeniería de platzi, veamos todos los cursos que ofrecen:

In [74]:
respuesta = requests.get('https://platzi.com/categorias/desarrollo/')
if(respuesta.ok):
    soup = BeautifulSoup(respuesta.text,'lxml')
    print(soup.title.text)
else: 
    print("No contestaron!")
Platzi | Categoría: Desarrollo e ingeniería
In [75]:
headers_links = soup.find('div',class_='CarrersList-content')
In [76]:
for a in headers_links.find_all('a'):
    print(a.text)
CarreraDesarrollo con Unity6 cursos
CarreraCiencia3 cursos
CarreraBig Data y Data Science9 cursos
CarreraDesarrollo de Aplicaciones con ASP .NET5 cursos
CarreraBases de Datos4 cursos
CarreraArquitectura Frontend17 cursos
CarreraDesarrollo de Aplicaciones Android7 cursos
CarreraDesarrollo Backend con Ruby4 cursos
CarreraBackend con JavaScript13 cursos
CarreraInteligencia Artificial8 cursos
CarreraVue.js4 cursos
CarreraDesarrollo con Java7 cursos
CarreraDesarrollo de Apps multiplataforma5 cursos
CarreraFirebase7 cursos
CarreraDesarrollo Backend con PHP6 cursos
CarreraJavaScript10 cursos
CarreraVideojuegos16 cursos
CarreraSeguridad Informática9 cursos
CarreraInternet of Things8 cursos
CarreraDesarrollo Backend con Python y Django10 cursos
CarreraGoogle Cloud Platform3 cursos
CarreraApple Fullstack Developer4 cursos
CarreraDesarrollo Multiplataforma con Xamarin9 cursos
CarreraAdministración de Servidores y DevOps18 cursos
CarreraDesarrollo con WordPress5 cursos
CarreraAmazon Web Services6 cursos
CarreraFrontend con React.JS8 cursos
CarreraFundamentos de Programación21 cursos
CarreraMatemáticas para Programación10 cursos
CarreraDesarrollo Backend con GO2 cursos
CarreraIBM Cloud3 cursos
CarreraDesarrollo de Apps con React Native5 cursos
CarreraDesarrollo con Angular9 cursos

Gracias por la atención!

separador_dos