Python Web Scraping: extracción de datos

Analizar una página web significa comprender su estructura. Ahora, surge la pregunta de por qué es importante para el web scraping. En este capítulo, comprendamos esto en detalle.

Análisis de páginas web

El análisis de la página web es importante porque sin analizar no podemos saber en qué forma vamos a recibir los datos (estructurados o no) de esa página web después de la extracción. Podemos hacer análisis de páginas web de las siguientes formas:

Ver fuente de página

Esta es una forma de comprender cómo está estructurada una página web examinando su código fuente. Para implementar esto, debemos hacer clic derecho en la página y luego seleccionar elView page sourceopción. Luego, obtendremos los datos de nuestro interés de esa página web en forma de HTML. Pero la principal preocupación son los espacios en blanco y el formato que nos resulta difícil de formatear.

Inspeccionar el origen de la página haciendo clic en la opción Inspeccionar elemento

Esta es otra forma de analizar la página web. Pero la diferencia es que resolverá el problema del formato y los espacios en blanco en el código fuente de la página web. Puede implementar esto haciendo clic derecho y luego seleccionando elInspect o Inspect elementopción del menú. Proporcionará la información sobre un área o elemento particular de esa página web.

Diferentes formas de extraer datos de una página web

Los siguientes métodos se utilizan principalmente para extraer datos de una página web:

Expresión regular

Son lenguajes de programación altamente especializados integrados en Python. Podemos usarlo a través deremódulo de Python. También se llama RE o expresiones regulares o patrones de expresiones regulares. Con la ayuda de expresiones regulares, podemos especificar algunas reglas para el posible conjunto de cadenas que queremos hacer coincidir a partir de los datos.

Si desea obtener más información sobre las expresiones regulares en general, vaya al enlace https://www.tutorialspoint.com/automata_theory/regular_expressions.htmy si desea saber más sobre el módulo re o la expresión regular en Python, puede seguir el enlace https://www.tutorialspoint.com/python/python_reg_expressions.htm .

Ejemplo

En el siguiente ejemplo, vamos a extraer datos sobre India de http://example.webscraping.com después de hacer coincidir el contenido de <td> con la ayuda de una expresión regular.

import re
import urllib.request
response =
   urllib.request.urlopen('http://example.webscraping.com/places/default/view/India-102')
html = response.read()
text = html.decode()
re.findall('<td class="w2p_fw">(.*?)</td>',text)

Salida

La salida correspondiente será como se muestra aquí:

[
   '<img src="/places/static/images/flags/in.png" />',
   '3,287,590 square kilometres',
   '1,173,108,018',
   'IN',
   'India',
   'New Delhi',
   '<a href="/places/default/continent/AS">AS</a>',
   '.in',
   'INR',
   'Rupee',
   '91',
   '######',
   '^(\\d{6})$',
   'enIN,hi,bn,te,mr,ta,ur,gu,kn,ml,or,pa,as,bh,sat,ks,ne,sd,kok,doi,mni,sit,sa,fr,lus,inc',
   '<div>
      <a href="/places/default/iso/CN">CN </a>
      <a href="/places/default/iso/NP">NP </a>
      <a href="/places/default/iso/MM">MM </a>
      <a href="/places/default/iso/BT">BT </a>
      <a href="/places/default/iso/PK">PK </a>
      <a href="/places/default/iso/BD">BD </a>
   </div>'
]

Observe que en el resultado anterior puede ver los detalles sobre el país India utilizando expresiones regulares.

Hermosa sopa

Supongamos que queremos recopilar todos los hipervínculos de una página web, luego podemos usar un analizador llamado BeautifulSoup que se puede conocer con más detalle en https://www.crummy.com/software/BeautifulSoup/bs4/doc/.En palabras simples, BeautifulSoup es una biblioteca de Python para extraer datos de archivos HTML y XML. Se puede usar con solicitudes, porque necesita una entrada (documento o url) para crear un objeto de sopa, ya que no puede obtener una página web por sí mismo. Puede utilizar la siguiente secuencia de comandos de Python para recopilar el título de la página web y los hipervínculos.

Instalación de Beautiful Soup

Utilizando el pip comando, podemos instalar beautifulsoup ya sea en nuestro entorno virtual o en una instalación global.

(base) D:\ProgramData>pip install bs4
Collecting bs4
   Downloading
https://files.pythonhosted.org/packages/10/ed/7e8b97591f6f456174139ec089c769f89
a94a1a4025fe967691de971f314/bs4-0.0.1.tar.gz
Requirement already satisfied: beautifulsoup4 in d:\programdata\lib\sitepackages
(from bs4) (4.6.0)
Building wheels for collected packages: bs4
   Running setup.py bdist_wheel for bs4 ... done
   Stored in directory:
C:\Users\gaurav\AppData\Local\pip\Cache\wheels\a0\b0\b2\4f80b9456b87abedbc0bf2d
52235414c3467d8889be38dd472
Successfully built bs4
Installing collected packages: bs4
Successfully installed bs4-0.0.1

Ejemplo

Tenga en cuenta que en este ejemplo, estamos ampliando el ejemplo anterior implementado con el módulo de solicitudes de Python. estamos usandor.text para crear un objeto de sopa que luego se usará para obtener detalles como el título de la página web.

Primero, necesitamos importar los módulos de Python necesarios:

import requests
from bs4 import BeautifulSoup

En la siguiente línea de código, usamos solicitudes para realizar solicitudes GET HTTP para la URL: https://authoraditiagarwal.com/ haciendo una solicitud GET.

r = requests.get('https://authoraditiagarwal.com/')

Ahora necesitamos crear un objeto Soup de la siguiente manera:

soup = BeautifulSoup(r.text, 'lxml')
print (soup.title)
print (soup.title.text)

Salida

La salida correspondiente será como se muestra aquí:

<title>Learn and Grow with Aditi Agarwal</title>
Learn and Grow with Aditi Agarwal

Lxml

Otra biblioteca de Python que vamos a discutir para web scraping es lxml. Es una biblioteca de análisis HTML y XML de alto rendimiento. Es comparativamente rápido y sencillo. Puedes leer más sobre esto enhttps://lxml.de/.

Instalación de lxml

Usando el comando pip, podemos instalar lxml ya sea en nuestro entorno virtual o en una instalación global.

(base) D:\ProgramData>pip install lxml
Collecting lxml
   Downloading
https://files.pythonhosted.org/packages/b9/55/bcc78c70e8ba30f51b5495eb0e
3e949aa06e4a2de55b3de53dc9fa9653fa/lxml-4.2.5-cp36-cp36m-win_amd64.whl
(3.
6MB)
   100% |¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦| 3.6MB 64kB/s
Installing collected packages: lxml
Successfully installed lxml-4.2.5

Ejemplo: extracción de datos usando lxml y solicitudes

En el siguiente ejemplo, estamos extrayendo un elemento particular de la página web de authoraditiagarwal.com mediante el uso de lxml y solicitudes -

Primero, necesitamos importar las solicitudes y html de la biblioteca lxml de la siguiente manera:

import requests
from lxml import html

Ahora debemos proporcionar la URL de la página web para eliminar

url = 'https://authoraditiagarwal.com/leadershipmanagement/'

Ahora necesitamos proporcionar el camino (Xpath) a un elemento particular de esa página web -

path = '//*[@id="panel-836-0-0-1"]/div/div/p[1]'
response = requests.get(url)
byte_string = response.content
source_code = html.fromstring(byte_string)
tree = source_code.xpath(path)
print(tree[0].text_content())

Salida

La salida correspondiente será como se muestra aquí:

The Sprint Burndown or the Iteration Burndown chart is a powerful tool to communicate
daily progress to the stakeholders. It tracks the completion of work for a given sprint
or an iteration. The horizontal axis represents the days within a Sprint. The vertical 
axis represents the hours remaining to complete the committed work.