Экспорт списка всех вакансий, на которые вы отозвались в LinkedIn в эксель с помощью bs4 и Python

LinkedIn как все остальные социальные сети пытается защитить информацию от веб-скрэйпинга, но тем не менее всё еще остаются способы её автоматизированного сбора и обработки. Сегодня мы поговорим о том, как достать HTML с информацией обо всех вакансиях, на которые вы откликнулись и экспортировать его в таблицу эксель.

На выходе мы получим файл со следующими столбцами:

  • Название вакансии (Job Title)
  • Адрес страницы вакансии (URL of the job offer page)
  • Название компании (Company Name)
  • Адрес страницы компании (URL of the Company page)
  • Город (Location)
  • Когда была подана и была ли просмотрена ваша заявка (Time you applied for the job (... ago))

Достаем HTML

Для начало нам потребуется открыть страницу https://www.linkedin.com/jobs/tracker/applied/ и прокрутить вниз настолько далеко, насколько позволит LinkedIn. Когда мы прогрузили страницу нас будет ждать сюрприз - если мы попытаемся сохранить страницу как HTML или нажать CTRL+U то файл будет содержать непонятную кашу вместо нужных нам HTML тегов. К счастью есть способ обойти: правый клик -> показать код элемента -> копировать внешний HTML -> вставить в новый текстовый файл.

HTML в XLSX

Всё, что нам осталось сделать - запустить вот этот код и на выходе получить файл Excel со всей информацией со страницы:

from bs4 import BeautifulSoup
import pandas as pd
import numpy as np

# Path to input file
in_file = "C:/input.txt"

f = open(in_file, "r", encoding="utf8")
soup = BeautifulSoup(f.read())

JobPostings = soup.find_all('div',class_="display-flex p0 flex-wrap ember-view")
print("Postings "+str(len(JobPostings)))

job_titles, company_names, loc,app_times = [],[],[],[]
jobs, jobURLs = [],[]
companyNames, companyURLs, locs,app_time = [],[],[],[]
df = pd.DataFrame()

for JobPosting in JobPostings:
   
    job_titles = JobPosting.find_all("a", class_="jobs-job-card-content__title ember-view")
    jobs.append(job_titles[0].string)
    jobURLs.append('https://linkedin.com'+job_titles[0]['href'])
    
    company_names= JobPosting.find("a", class_="t-black jobs-job-card-content__company-name t-14 t-normal ember-view")
    if company_names!=None:
        companyNames.append(company_names.string)
        companyURLs.append('https://linkedin.com'+company_names['href'])
    else:
        companyNames.append("NA")
        companyURLs.append("NA")
        
        
    loc=JobPosting.find('span', class_="t-12 t-black--light")
    if loc!=None:
        locs.append(loc.string)
    else:
        locs.append("NA")
    
    app_time=JobPosting.find('span', class_=["t-bold t-black t-black--light","jobs-job-card-content__bullet"])
    text=""
    for i in app_time:
            text = text +" "+ i.string
    app_times.append(text)
    
print(len(app_times))    
df['Job Title'] = np.array(jobs)
df['Job URL'] = np.array(jobURLs)
df['Company Name'] = np.array(companyNames)
df['Company URL'] = np.array(companyURLs)
df['Locations'] = np.array(locs)
df['AppTime'] = np.array(app_times)

print(df)

# Where to put excel file
df.to_excel("C:/output.xlsx")