Web Scraping Para Ofertas De Empleo - Guía Definitiva 2024

Python, Scraping, Jan-05-20235 minutos de lectura

El Web Scraping para ofertas de empleo es un atajo alternativo para que los demandantes de empleo creen una base de datos de ofertas actuales. Randstad afirma que la búsqueda media de empleo puede durar entre cinco y seis meses, desde que se presenta una candidatura hasta que se cubre un puesto. ¿Y si existiera una solución que redujera la carga

El Web Scraping para ofertas de empleo es un atajo alternativo para que los demandantes de empleo creen una base de datos de ofertas actuales. Randstad afirma que la búsqueda media de empleo puede durar entre cinco y seis meses, desde que se presenta una solicitud hasta que se cubre un puesto. ¿Y si existiera una solución que redujera la carga de navegar por todos los portales de empleo y elegir el que más le convenga? 

Este artículo te llevará de viaje explicándote cómo hacer web scraping para ofertas de empleo. Por lo tanto, usted está en el mercado de trabajo y tratando de encontrar el mejor trabajo. Pero usted quiere jugar más inteligente y no más difícil. ¿Por qué no construir un raspador web para recoger y analizar los anuncios de trabajo para usted. Una vez que lo configures, te proporcionará una gran cantidad de datos en un formato ordenado, para que no tengas que comprobarlo manualmente una y otra vez. Empecemos.

¿Qué es el Web Scraping para ofertas de empleo?

El raspado web para ofertas de empleo es la solución que recopila automáticamente datos de múltiples portales de empleo y reduce el tiempo necesario para obtener datos de cada sitio web. Disponer de una herramienta de este tipo, que puede proporcionarle una base de datos completa de ofertas de empleo, simplificará su tarea en gran medida. Todo lo que tienes que hacer es filtrar las que te convengan y proceder con el proceso de solicitud. 

Así que estás en el mercado laboral e intentas encontrar el mejor trabajo. Pero usted quiere jugar más inteligente y no más difícil. ¿Por qué no crear un raspador web que recopile y analice las ofertas de empleo? Una vez que lo configures, te proporcionará una gran cantidad de datos en un formato ordenado, para que no tengas que comprobarlos manualmente una y otra vez. Empecemos.

[Descargo de responsabilidad Muchos sitios web pueden restringir la extracción de datos de sus páginas. Los usuarios pueden estar sujetos a problemas legales dependiendo de dónde y cómo intenten extraer la información. Así que hay que ser extremadamente cuidadoso si se buscan sitios que alberguen sus datos. Por ejemplo, Facebook, Linked In y Craiglist a veces se preocupan si se extraen datos de sus páginas. Así que si quieres hacer scraping, hazlo por tu cuenta y riesgo].

Este será un artículo muy básico en el que veremos los fundamentos del web scraping extrayendo alguna información útil respecto a empleos relacionados con "Data Science" de indeed.com. Escribiremos un programa sorprendente que actualiza los puestos de trabajo varias veces de forma manual. Algunas librerías útiles que serán muy prácticas mientras construimos este scraper son "requests" y "BeautifulSoup".

Comprender la URL y la estructura de la página

En primer lugar, echemos un vistazo a la página de ejemplo que vamos a extraer de hecho

La estructura de la URL es importante:

  • tenga en cuenta que "q=" inicia la cadena para el campo "qué" de la página, separando los términos de búsqueda con "+" (por ejemplo, buscar empleos de "datos+científico")
  • cuando se especifique el salario, se analizará por comas en la cifra del salario, de modo que el comienzo del salario irá precedido por %24 y luego el número antes de la primera coma, luego se interrumpirá por %2C y se continuará con el resto del número (es decir, %2420%2C000 = $20.000)
  • nota "&l=" inicia la cadena para la ciudad de interés, separando los términos de búsqueda con "+" si la ciudad es más de una palabra (por ejemplo, "Nueva+York").
  • anote "&start=" en el resultado de búsqueda por el que desea empezar (por ejemplo, empiece por el décimo resultado)

Esta estructura de URL sería de gran ayuda a medida que continuamos construyendo el scraper y recopilando datos de múltiples páginas. 

Chrome puede examinar la estructura HTML de la página haciendo clic con el botón derecho del ratón y utilizando la opción inspeccionar elemento. Aparecerá un menú a la derecha, que también mostrará las etiquetas de los elementos anidados y, al situar el cursor sobre esos elementos, resaltará esa parte de la pantalla.  

Para este artículo, supongo que sabes lo básico sobre HTML como etiquetas, divs, etc., pero por suerte no necesitas saberlo todo. Sólo necesitas entender la estructura de la página y la jerarquía de los diferentes componentes.

Primeros pasos con el rascador

Ahora hemos analizado la estructura de la página. Esto nos ayudará a construir código de acuerdo a esa información para extraer los datos de nuestra elección. Empecemos primero importando nuestras librerías. Nótese que aquí también estamos importando "time", lo que será útil para no saturar el servidor del sitio al raspar la información.

importar solicitudes
importar bs4
from bs4 import BeautifulSoup
import pandas as pd
import tiempo

Primero nos centraremos en la página única para retirar cada dato que queramos,

URL = "https://www.indeed.com/jobs?q=data+scientist+%2420%2C000&l=New+York&start=10"
#realizar una petición de la URL indicada anteriormente:
page = requests.get(URL)
#especificando el formato deseado de "page" usando el parser html - esto permite a python leer los distintos componentes de la página, en lugar de tratarla como una cadena larga.
soup = BeautifulSoup(page.text, "html.parser")
#impresión de la sopa en un formato de árbol más estructurado que facilita la lectura
print(soup.prettify())

El uso de prettify facilita tener una visión general de la codificación HTML de la página y proporciona una salida como esta,

 Ahora toda la información de nuestra página de interés está en nuestra variable "sopa". Tenemos que escarbar más en el código para iterar a través de varias etiquetas y sub-etiquetas para capturar la información requerida.

Obtención de elementos básicos de datos

Los cinco puntos clave de toda oferta de empleo son,

Título del puesto.Nombre de la empresa.Ubicación.Salario.Resumen del puesto.

Si echamos un vistazo a la página, hay 15 ofertas de empleo. Por lo tanto, nuestro código también debería generar 15 elementos diferentes. Sin embargo, si el código proporciona menos que esto, podemos volver a la página y ver lo que no se está capturando.

Obtener el puesto de trabajo

As can be seen, the entirety of each job posting is under <div> tags, with an attribute “class” = “row result.”

Further, we could also see that job titles are under <a> tags, with the attribute “title = (title)”. One can see the value of the tag’s attribute with tag[“attribute”], so I can use it to find each posting’s job title.

Si resumimos, la función que vamos a ver implica los tres pasos siguientes,

Pulling out all the <div> tags with class including “row”.Identifying <a> tags with attribute “data-tn-element”:”jobTitle”For each of these <a> tags, find attribute values “title”

def extract_job_title_from_result(soup): 
  jobs = []
  for div in soup.find_all(name="div", attrs={"class":"row"}):
    for a in div.find_all(name="a", attrs={"data-tn-element":"jobTitle"}):
      jobs.append(a["title"])
  return(jobs)
extract_job_title_from_result(soup)

Este código producirá un resultado como el siguiente,

Obtener el nombre de la empresa

Getting company names can be a bit tricky because most of them are appearing in <span> tags, with “class”:” company”.  They are also housed in <span> tags with “class”:” result-link-source”.

Utilizaremos sentencias if/else para extraer la información de la empresa de cada uno de estos lugares. Con el fin de eliminar los espacios en blanco alrededor de los nombres de las empresas cuando se emiten, vamos a utilizar inputting.strip() al final.

def extract_company_from_result(soup): 
 companies = []
 for div in soup.find_all(name="div", attrs={"class":"row"}):
   company = div.find_all(name="span", attrs={"class":"company"})
   if len(company) &gt; 0:
    for b in company:
     companies.append(b.text.strip())
   else:
    sec_try = div.find_all(name="span", attrs={"class":"result-link-source"})
    for span in sec_try:
      companies.append(span.text.strip())
 return(companies)
 
extract_company_from_result(soup)

Localización

Locations are located under the <span> tags. Span tags are sometimes nested within each other, such that the location text may sometimes be within “class”:”location” attributes, or nested in “itemprop”:”addressLocality”. However a simple for loop can examine all span tags for text and retrieve the necessary information.

def extract_location_from_result(soup): 
  locations = []
  spans = soup.findAll('span', attrs={'class': 'location'})
  for span in spans:
    locations.append(span.text)
  return(locations)
extract_location_from_result(soup)

Obtener salario

El salario es la parte más difícil de extraer de los anuncios de empleo. La mayoría de los anuncios no publican información sobre el salario, mientras que en otros que sí lo hacen, puede haber varios lugares para recogerlo. Así que tenemos que escribir un código que puede recoger varios salarios de varios lugares, y si no se encuentra el salario, tenemos que crear un marcador de posición "No se encontró nada" valor para los puestos de trabajo que no contienen salario. 

Some salaries are under <nobr> tags, while others are under <div> tags, “class”:”sjcl” and are under separate div tags with no attributes. Try/except statement can be helpful while extracting this information. 

def extract_salary_from_result(soup): 
  salaries = []
  for div in soup.find_all(name="div", attrs={"class":"row"}):
    try:
      salaries.append(div.find('nobr').text)
    except:
      try:
        div_two = div.find(name="div", attrs={"class":"sjcl"})
        div_three = div_two.find("div")
        salaries.append(div_three.text.strip())
      except:
        salaries.append("Nothing_found")
  return(salaries)
extract_salary_from_result(soup)

Resumen del trabajo

La última tarea es obtener el resumen del puesto. Sin embargo, no es posible obtener los resúmenes de cada puesto en particular porque no están incluidos en el HTML de una determinada página de Indeed. Podemos obtener alguna información sobre cada puesto a partir de lo que se proporciona. Para ello podemos utilizar Selenium.

But let’s first try this using python. Summaries are located under <span> tags. Span tags are nested within each other such that the location text is within “class”:” location” tags or nested in “itemprop”:” adressLocality”. However, using a simple for loop can examine all span tags for text to retrieve the necessary information.

Preguntas frecuentes

Preguntas frecuentes:

1. ¿Por qué es necesario raspar los datos del puesto?
Hay suficientes portales de empleo que pueden notificarte las ofertas que se ajustan a tu perfil. Sin embargo, con una solución de job scraping obtendrás una lista completa de empleos y su descripción en una práctica base de datos. Esto le permitirá tener una mejor visión de todas las oportunidades de trabajo en un solo lugar.
2. ¿Cómo puede ayudar un proxy a obtener los datos de un puesto de trabajo?
El raspado de páginas web suele plantear ciertos problemas, como bloqueos de IP, geobloqueos y velocidad limitada. El raspado de trabajos de portales de empleo también presenta estos problemas. Para evitar todos estos problemas, las direcciones proxy pueden ayudarle con las direcciones IP de la ubicación requerida y garantizar el anonimato.
3. ¿Cuáles son las bibliotecas python necesarias para obtener los detalles de los trabajos?
Requests, BeautifulSoup, y Pandas son librerías python bastante comunes para scrapear datos relacionados con el trabajo desde sitios web. Request es la librería python más utilizada para enviar peticiones web, mientras que BeautifulSoup se encarga de analizar los datos y Pandas ayuda con las operaciones de estructura de datos.

Artículos relacionados

Cómo scrapear Twitter con Python

Cómo scrapear Instagram con Python

Cómo scrapear Reddit con Python

Conclusión

En este artículo, hemos visto qué es el web scraping y cómo puede ser útil en nuestra vida diaria mediante un ejemplo práctico de scraping de datos de empleo de las páginas web de Indeed. Ten en cuenta que los resultados que obtengas pueden ser diferentes a estos ya que las páginas son dinámicas, por lo que la información va cambiando con el tiempo. 

El Web Scraping es una técnica increíble si se hace correctamente y de acuerdo con sus necesidades. Hemos visto además los cinco aspectos importantes de cada anuncio de empleo y cómo extraerlos. Cuando pruebes este código por tu cuenta, habrás raspado los datos de las ofertas de empleo y no tendrás que buscarlas manualmente, lo cual es increíble. La misma técnica puede aplicarse a otras páginas web, pero su estructura puede ser diferente. Por lo tanto, hay que optimizar el código en función de ello. Pero todos los fundamentos están cubiertos en este artículo, por lo que no habría ninguna dificultad en el raspado de otras páginas también.

Si busca servicios de proxy, no olvide echar un vistazo a ProxyScrapeproxies residenciales y premium.