Import et défintion des fonctions¶

In [ ]:
#Importer les bibliothèques utilisée

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
import time
import pandas as pd

from datetime import date

today = date.today()
In [ ]:
#Définition des urls à utiliser
#Le script utilise l'url nommé "url_analyse"

url = "https://www.linkedin.com/jobs/track/?geoId=105015875&keywords=%22Data%22%20%22Ressources%20Humaines%22&location=France"
url_analyse2 ="https://www.linkedin.com/jobs/track/?geoId=105015875&keywords=Analyse%20de%20donn%C3%A9es%20RH&location=France"

url_analyse_données_rh = "https://www.linkedin.com/jobs/search?keywords=Analyse%20donn%C3%A9es%20Ressources%20Humaines&location=France"

url_rh = "https://www.linkedin.com/jobs/search?keywords=Ressources%20humaines&location=France"

url_rh_24h = "https://www.linkedin.com/jobs/search?keywords=Ressources%20Humaines&location=France&locationId=&geoId=105015875&f_TPR=r86400"

url_rh_stage = "https://www.linkedin.com/jobs/search?keywords=Ressources%20Humaines&location=France&locationId=&geoId=105015875&f_TPR=&f_E=1"
url_rh_premier = "https://www.linkedin.com/jobs/search?keywords=Ressources%20Humaines&location=France&locationId=&geoId=105015875&f_TPR=&f_E=2"
url_rh_confirmé = "https://www.linkedin.com/jobs/search?keywords=Ressources%20Humaines&location=France&locationId=&geoId=105015875&f_TPR=&f_E=3&position=1&pageNum=0"
url_rh_manager = "https://www.linkedin.com/jobs/search?keywords=Ressources%20Humaines&location=France&locationId=&geoId=105015875&f_TPR=&f_E=4"
url_rh_directeur = "https://www.linkedin.com/jobs/search?keywords=Ressources%20Humaines&location=France&locationId=&geoId=105015875&f_TPR=&f_E=5"
In [ ]:
wd = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
wd.get(url_rh)
In [ ]:
# Obtenir le nombre de résultat du jour
# Cette fonction ne sert plus, le nombre de résultat est limité à 1000 de toutes façon

#no_of_jobs = wd.find_element_by_css_selector("h1>span").get_attribute("innerText")
'''
no_of_jobs = wd.find_element(By.CSS_SELECTOR,"h1>span").get_attribute("innerText")

no_of_jobs = int(no_of_jobs.replace(" ",""))

print(no_of_jobs)


# Obtenir le nombre de nouveau jobs
# Cette fonction n'est pas utilisée dans le script

no_new_jobs = wd.find_element(By.CLASS_NAME,"results-context-header__new-jobs").get_attribute("innerText")

import re

no_new_jobs = re.findall(r'\d+', no_new_jobs)

no_new_jobs = int(no_new_jobs[0])

no_new_jobs

'''

Itérations sur la page de résultats¶

In [ ]:
#Dérouler la page des résulats d'offre LinkedIn pour tous les afficher

t_scroll = 5

t_scroll_2 = 4

i = 0
while i <= int(44): 
    wd.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    i = i + 1
    print(i)
    try:
        wd.find_element(By.XPATH,"/html/body/div[3]/div/main/section[2]/button").click()
        time.sleep(t_scroll)
    except:
        pass
        time.sleep(t_scroll)


#Un dernier clique au cas où
try : 
    wd.find_element(By.XPATH,"/html/body/div[3]/div/main/section[2]/button").click()
    
except :
    print("ok")
In [ ]:
#Lister les offres affichées sur l'écran

jobs_lists = wd.find_element(By.CLASS_NAME,"jobs-search__results-list")
jobs = jobs_lists.find_elements(By.TAG_NAME,"li") # return a list
len(jobs)
Out[ ]:
999

Extraction résultats des recherches¶

In [ ]:
##### Récupération des données sur la page des résultats

#Créer les liste qui seront utilisées

link=[]
company=[]
job_name=[]
id_search=[]
id_track=[]
location=[]

i = 1

#nb_div = "1"
nb_div= "3"

while i <= len(jobs) :

    # ID search - sert à identifier la recherche. A priori la date devrait suffire
    #xpath_idsearch = "/html/body/div[3]/div/main/section[2]/ul/li[{}]/div".format(i)               
    #data_idsearch = wd.find_element_by_xpath(xpath_idsearch)
    #id_search0 = data_idsearch.get_attribute("data-search-id")
    #id_search.append(id_search0)
    
    try :

        # ID track
        xpath_idtrack = "/html/body/div["+nb_div+"]/div/main/section[2]/ul/li[{}]/div".format(i)
        data_idtrack = wd.find_elements(By.XPATH,xpath_idtrack)
        id_track0 = data_idtrack[0].get_attribute("data-tracking-id")
        id_track.append(id_track0)

    except :
        # ID track
        xpath_idtrack = "//html/body/div["+nb_div+"]/div/main/section[2]/ul/li[{}]/a".format(i)
        data_idtrack = wd.find_elements(By.XPATH,xpath_idtrack)
        id_track0 = data_idtrack[0].get_attribute("data-tracking-id")
        id_track.append(id_track0)


    try :
        # Lien de l'offre
        xpath_link = "/html/body/div["+nb_div+"]/div/main/section[2]/ul/li[{}]/div/a".format(i)
        data_link = wd.find_elements(By.XPATH,xpath_link)
        link0 = data_link[0].get_attribute("href")
        link.append(link0)

    except :
        # Lien de l'offre
        xpath_link = "/html/body/div["+nb_div+"]/div/main/section[2]/ul/li[{}]/a".format(i)
        data_link = wd.find_elements(By.XPATH,xpath_link)
        link0 = data_link[0].get_attribute("href")
        link.append(link0)


    try :
        # Intitulé du poste
        xpath_job_name = "/html/body/div["+nb_div+"]/div/main/section[2]/ul/li[{}]/div/div[2]/h3".format(i)
        data_job_name = wd.find_elements(By.XPATH,xpath_job_name)
        job_name0 = data_job_name[0].get_attribute("innerText")
        job_name.append(job_name0)

    except :
        # Intitulé du poste
        xpath_job_name = "/html/body/div["+nb_div+"]/div/main/section[2]/ul/li[{}]/a/div[2]/h3".format(i)
        data_job_name = wd.find_elements(By.XPATH,xpath_job_name)
        job_name0 = data_job_name[0].get_attribute("innerText")
        job_name.append(job_name0)


    try :
        # Nom de l'entreprise
        xpath_company = "/html/body/div["+nb_div+"]/div/main/section[2]/ul/li[{}]/div/div[2]/h4/a".format(i)
        data_company = wd.find_elements(By.XPATH,xpath_company)
        company0 = data_company[0].get_attribute("innerText")
        company.append(company0)

    except :
        # Nom de l'entreprise
        xpath_company = "/html/body/div["+nb_div+"]/div/main/section[2]/ul/li[{}]/a/div[2]/h4".format(i)
        data_company = wd.find_elements(By.XPATH,xpath_company)
        company0 = data_company[0].get_attribute("innerText")
        company.append(company0)


    try :
        # Localisation de l'offre
        xpath_location = "/html/body/div["+nb_div+"]/div/main/section[2]/ul/li[{}]/div/div[2]/div/span".format(i)
        data_location = wd.find_elements(By.XPATH,xpath_location)
        location0 = data_location[0].get_attribute("innerText")
        location.append(location0)

    except :
        # Localisation de l'offre
        xpath_location = "/html/body/div["+nb_div+"]/div/main/section[2]/ul/li[{}]/a/div[2]/div/span".format(i)
        data_location = wd.find_elements(By.XPATH,xpath_location)
        location0 = data_location[0].get_attribute("innerText")
        location.append(location0)

 
    print(i)

    i=i+1

#Création du fichier Excel de sortie
df = pd.DataFrame(list(zip(id_track, job_name, company,location, link)),columns=["id_track","Intitulé","Entreprise","Localisation","Link"])

df["date de recherche"]= today

name_file = "extractions/"+str(today) + " - linkedin jobs - synthétique.xlsx"
df.to_excel(name_file)

print("listing terminé")

Extraction offres en détail¶

In [ ]:
# Récupération des données sur la page de l'offre

# Ligne pour ouvrir le fichier précédent si besoin
# df = pd.read_excel("2022-07-22 - linkedin jobs - synthétique - Copie.xlsx")

# Création des listes pour recueillir les données

description =[]
duration = []
niveau= []
type = []
fonction = []
secteur = []
i=0

# Itération sur la liste des liens obtenus à partir de la recherche
for elements in df["Link"] :
    print(i)
    i=i+1

    # Ouverture d'une instance WebDriver
    wd1 = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
    wd1.get(elements)
    
    #Pause
    time.sleep(3)
    
    """
    #Déroulé du descriptif, la donnée est présente en HTML. inutile d'exécuter
    try :
        wd1.find_element_by_xpath("/html/body/main/section[1]/div/div[1]/section[1]/div/div/section/button[1]").click()
    except :
        wd1.find_element_by_xpath("/html/body/main/section[1]/div/div[1]/section[1]/div/div[2]/section/button[1]").click

    time.sleep(2)
    """          


    # Récupération de la desription générale du poste
    try :
        xpath_description = "/html/body/main/section[1]/div/div[1]/section[1]/div/div/section/div"
        data_description = wd1.find_element(By.XPATH,xpath_description)
        description0 = data_description.get_attribute("innerText")
        
    
    except :
        description0=""
    
    description.append(description0)
    
    # Récupération de la durée de mise en ligne

    try :
        xpath_duration = "/html/body/main/section[1]/div/section[2]/div/div[1]/div/h4/div[2]/span"
        data_duration = wd1.find_element(By.XPATH,xpath_duration)
        duration0 = data_duration.get_attribute("innerText")
        

    except :
        duration0=""
        
    duration.append(duration0)
    
    
    # Récupération du niveau
    try :
        xpath_niveau = "/html/body/main/section[1]/div/div[1]/section[1]/div/ul/li[1]/span"
        data_niveau = wd1.find_element(By.XPATH,xpath_niveau)
        niveau0 = data_niveau.get_attribute("innerText")
                
    except :
        niveau0=""

    niveau.append(niveau0)
    
    
    # Récupération du type
    try :
        xpath_type ="/html/body/main/section[1]/div/div[1]/section[1]/div/ul/li[2]/span"
        data_type = wd1.find_element(By.XPATH,xpath_type)
        type0 = data_type.get_attribute("innerText")
        
        
    except :
        type0=""
      
    type.append(type0)

    # Récupération de la fonction
    
    try :
        xpath_fonction = "/html/body/main/section[1]/div/div[1]/section[1]/div/ul/li[3]/span"
        data_fonction =wd1.find_element(By.XPATH,xpath_fonction)
        fonction0 = data_fonction.get_attribute("innerText")
        
        
    except :
        fonction0=""
    
    fonction.append(fonction0)

    #Récupération du secteur
    
    try :
        xpath_secteur = "/html/body/main/section[1]/div/div[1]/section[1]/div/ul/li[4]/span"
        data_secteur = wd1.find_element(By.XPATH,xpath_secteur)
        secteur0 = data_secteur.get_attribute("innerText")
        
        
    except :
        secteur0=""
    
    secteur.append(secteur0)
    
    #Fermer la fenêtre
    print(fonction0)
    wd1.close()

df1 = pd.DataFrame(list(zip(id_track,description, duration, niveau, type,fonction, secteur)),columns=["id_track","Description", "Durée", "Niveau", "Type","Fonction", "Secteur"])

name_file_detail = "extractions/"+str(today) + " - linkedin jobs - détail.xlsx"
df1.to_excel(name_file_detail)