Web Scraping, Expresiones Regulares y Visualización de Datos, Todo en Python

Python, Scraping, Nov-15-20225 minutos de lectura

El web scraping puede definirse como el método de recopilación y reestructuración de datos de sitios web. También puede definirse como el método programático de obtener datos de sitios web de forma automatizada. Por ejemplo, desea extraer los ID de correo electrónico de todas las personas que comentaron un post de Facebook. Para ello

Índice

El web scraping puede definirse como el método de recopilación y reestructuración de datos de sitios web. También puede definirse como el método programático de obtener datos de sitios web de forma automatizada. Por ejemplo, desea extraer los ID de correo electrónico de todas las personas que comentaron un post de Facebook. Puede hacerlo de dos maneras. En primer lugar, puedes apuntar con el cursor a la cadena de direcciones de correo electrónico de cualquier persona. A continuación, puedes copiarla y pegarla en un archivo. Este método se conoce como scraping manual. Pero, ¿y si quiere reunir 2.000 direcciones de correo electrónico? Con la ayuda de una herramienta de web scraping, puede extraer todos los ID de correo electrónico en 30 segundos en lugar de 3 horas si utiliza el scraping manual.

Puedes utilizar herramientas de web scraping para extraer información de sitios web. Sólo hay que saber hacer clic y no se requieren conocimientos de programación. Estas herramientas consumen pocos recursos y ahorran tiempo y dinero. Puedes raspar millones de páginas en función de tus necesidades sin preocuparte por los anchos de banda de la red. Algunos sitios web implementan anti-bots que disuaden a los scraper de recopilar datos. Pero las buenas herramientas de web scraping tienen funciones integradas para evitar estas herramientas y ofrecer una experiencia de scraping sin problemas.

Web Scraping En Python

Python dispone de excelentes herramientas para scrapear los datos de la web. Por ejemplo, puedes importar la librería requests para recuperar el contenido de una página web y bs4(BeautifulSoup) para extraer la información relevante. Puedes seguir los siguientes pasos para hacer web scrape en Python. Vamos a extraer información de esta página web. 

Solicitudes de importación:

Tiene que importar la biblioteca de peticiones para obtener el HTML del sitio web. 

solicitudes de importación

Solicitud GET:

Tienes que hacer una petición GET al sitio web. Puedes hacerlo pegando la URL en la función requests.get().

r = requests.get('http://www.cleveland.com/metro/index.ssf/2017/12/case_western_reserve_university_president_barbara_snyders_base_salary_and_bonus_pay_tops_among_private_colleges_in_ohio.html')

Extraer el contenido:

Extraiga el contenido de la página web utilizando r.content. Proporciona el contenido del sitio web en bytes. 

c = r.contenido

Importar BeautifulSoup:

Tienes que importar la librería BeautifulSoup ya que facilita el scrapeo de información de páginas web.

from bs4 import BeautifulSoup

Crea un objeto sopa:

Tienes que crear un objeto BeautifulSoup a partir del contenido y analizarlo utilizando varios métodos.

sopa = BeautifulSoup(c)
print(sopa.obtener_texto())

Obtendrás la salida (es sólo una parte) más o menos así.

Extraer datos útiles:

Tenemos que encontrar los selectores CSS adecuados ya que necesitamos extraer nuestros datos deseados. Podemos encontrar el contenido principal de la página web utilizando el método .find() del objeto soup.

main_content = soup.find('div', attrs = {'class': 'entry-content'})

Utilice el atributo .text:

Podemos recuperar la información como texto de la tabla utilizando el atributo .text de la sopa.

content = contenido_principal.find('ul').text
print(contenido)

Recuperamos el texto de la tabla como una cadena. Pero la información será de gran utilidad si extraemos las partes específicas de la cadena de texto. Para lograr esta tarea, necesitamos pasar a las Expresiones Regulares.

Expresiones regulares en Python

Las expresiones regulares (RegEx) son una secuencia de patrones que definen un patrón de búsqueda. La idea básica es que

  • Defina un patrón que desee hacer coincidir en una cadena de texto. 
  • Buscar en la cadena para devolver coincidencias.

Supongamos que queremos extraer la siguiente información de la tabla de texto.

  • Salarios
  • Nombres de los colegios
  • Nombres de los presidentes

Puede extraer los tres datos siguiendo los pasos que se mencionan a continuación.

Paso 01:

Importa re y para extraer los salarios, tienes que hacer un patrón de salarios. Utilice el método re.compile() para compilar un patrón de expresión regular proporcionado como cadena en un objeto patrón RegEx. Además, puede utilizar pattern.findall() para encontrar todas las coincidencias y devolverlas como una lista de cadenas. Cada cadena representará una coincidencia.

importar re
patrón_salario = re.compile(r'\$.+')
salarios = salary_pattern.findall(contenido)

Paso 02:

Repita el mismo procedimiento para extraer los nombres de las universidades. Haga un patrón y extraiga los nombres. 

school_pattern = re.compile(r'(?:,|,\s)([A-Z]{1}.*?)(?:\s\(|:|,)')
schools = school_pattern.findall(content)
print(schools)
print(salaries)

Paso 03:

Repita el mismo procedimiento para extraer los nombres de los presidentes. Haz un patrón y extrae los nombres necesarios. 

name_pattern = re.compile(r'^([A-Z]{1}.+?)(?:,)', flags = re.M)
names = name_pattern.findall(content)
print(names)

Paso 04:

Los salarios se ven desordenados y no son comprensibles. Por lo tanto, utilizaremos la comprensión de listas de Python para convertir los salarios de cadena en números. Utilizaremos el corte de cadenas, la división y unión, y la comprensión de listas para conseguir los resultados deseados.

salarios = ['876.001$', '543.903$', '2453.896 $']
[int(''.join(s[1:].split(','))) for s in salarios]

La salida es como:

Visualización de datos en Python

La visualización de datos le ayuda a entender los datos visualmente para que puedan exponerse las tendencias, los patrones y las correlaciones. Puedes traducir una gran cantidad de datos en gráficos, diagramas y otros elementos visuales para identificar los valores atípicos y obtener información valiosa.

Podemos utilizar matplotlib para visualizar los datos, como se muestra a continuación.

Importe las bibliotecas necesarias como se muestra a continuación.

importar pandas como pd
import matplotlib.pyplot como plt

Haz un dataframe pandas de escuelas, nombres y salarios. Por ejemplo, puede convertir las escuelas en un dataframe como:

df_escuela = pd.DataFrame(escuelas)
imprimir(df_escuela)

La salida es:

Del mismo modo, puede hacer lo mismo con los salarios y los nombres.

Para visualizar los datos, podemos trazar un gráfico de barras como el que se muestra a continuación.

df.plot(kind='barh', x = 'Presidente', y = 'salario')

La salida es como:

¿Por qué se necesitan proxies para el Web Scraping?

El raspado web ayuda a las empresas a extraer información útil sobre perspectivas de mercado e industrias para ofrecer servicios impulsados por datos y tomar decisiones basadas en datos. Los proxies son esenciales para raspar datos de varios sitios web por las siguientes razones de manera efectiva.

  • Evitar las prohibiciones de IP - Para evitar que los scrapers realicen demasiadas solicitudes, los sitios web empresariales limitan la cantidad de datos rastreables denominada Crawl Rate. La tasa de rastreo ralentiza la velocidad del sitio web y dificulta al usuario el acceso efectivo al contenido deseado. Sin embargo, si utiliza un grupo suficiente de proxies para rastrear los datos, superará los límites de velocidad del sitio web de destino. Esto se debe a que los proxies envían peticiones desde diferentes direcciones IP, lo que le permite extraer datos de los sitios web según sus necesidades.
  • Permitir el acceso a contenido específico de la región - Las empresas tienen que controlar a sus competidores (sitios web) para ofrecer características de producto y precios adecuados a los clientes de una región geográfica específica. Pueden acceder a todo el contenido disponible en esa región utilizando proxies residenciales con direcciones IP.
  • Mayor seguridad: un servidor proxy añade una capa adicional de seguridad al ocultar la dirección IP del dispositivo del usuario.

¿Sabe cuántos proxies se necesitan para obtener las ventajas mencionadas? Puede calcular el número necesario de proxies utilizando esta fórmula:

Número de proxies = Número de solicitudes de acceso / Crawl Rate

El número de solicitudes de acceso depende de los siguientes parámetros.

  • La frecuencia con la que el scraper extrae información de un sitio web.
  • Número de páginas que el usuario desea raspar

Por otro lado, la tasa de rastreo está limitada por el número de peticiones que el usuario realiza en un determinado periodo de tiempo. Algunos sitios web permiten un número limitado de solicitudes por usuario para diferenciar las solicitudes automatizadas de las humanas. 

Uso de proxies en Python

Puedes utilizar proxies en Python siguiendo los pasos que se indican a continuación.

  • Tienes que importar el módulo requests de Python.
solicitudes de importación
  • Puedes crear un pool de proxies para rotarlos.
proxy = ' http://114.121.248.251:8080'
url = 'https://ipecho.net/plain'
  • Puedes utilizar requests.get() para enviar una petición GET pasando un proxy como parámetro a la URL.
page = requests.get(url,
                    proxies={"http": proxy, "https": proxy})
  • Puede obtener el contenido de la URL solicitada si no se produce ningún error de conexión.
imprimir(página.texto)

La salida es como:

Conclusión

Hemos hablado de que podemos utilizar el web scraping para extraer datos de sitios web en lugar de utilizar el scraping manual. El web scraping es un proceso rentable que ahorra tiempo. Las empresas lo utilizan para recopilar y reestructurar información web para tomar decisiones basadas en datos y obtener información valiosa. El uso de proxies es esencial para el web scraping seguro, ya que oculta la dirección IP original del usuario del sitio web de destino. Puede utilizar proxies de centro de datos o residenciales para el web scraping. Pero es preferible utilizar proxies residenciales, ya que son rápidos y no pueden ser detectados fácilmente. Además, podemos utilizar expresiones regulares en Python para encontrar conjuntos de cadenas. Esto significa que podemos extraer cualquier patrón de cadena del texto con la ayuda de expresiones regulares. También vimos que la visualización de datos convierte cantidades voluminosas de datos en cuadros, gráficos y otros elementos visuales que nos ayudan a detectar anomalías e identificar tendencias útiles en los datos.