#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()
#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"
wd = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
wd.get(url_rh)
# 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
'''
#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")
#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)
999
##### 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é")
# 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)