Скраппинг данных LinkedIn с помощью API Proxycurl Jobs

Фотография на обложке Александр Шатов на Unsplash

Оглавление

  1. Обзор
  2. Предварительные условия
  3. Начало работы
  4. Получение списка заданий
  5. Получение информации о конкретной вакансии
  6. Ограничения LinkedIn Job API

Обзор

LinkedIn Jobs API — это один из богатого набора инструментов, предоставляемых Proxycurl API для работы с обработанными и структурированными данными LinkedIn в ваших приложениях. LinkedIn Jobs API, в частности, может использоваться для доступа к вакансиям, перечисленным компанией (через конечную точку Jobs Listing Endpoint) на LinkedIn, или для запроса компактной информации о конкретной вакансии (через конечную точку Jobs Profile Endpoint), такой как название вакансии, описание, тип занятости и т.д.

Предварительные условия

Этот учебник написан на JavaScript (ES6) и Node.js, поэтому я предполагаю, что вам удобно писать и понимать код на обоих языках.

Создайте новую директорию, cd в нее и запустите новый проект Node.js:

npm init -y
Войти в полноэкранный режим Выйти из полноэкранного режима

Далее нам нужно установить следующие пакеты для запуска нашего приложения.

Выполните следующий код для установки пакетов:

npm install express axios dotenv

or with Yarn

yarn add express axios dotenv
Войти в полноэкранный режим Выйти из полноэкранного режима

Начало работы

Чтобы начать использовать API Jobs, вам понадобится API-ключ для выполнения запросов к конечным точкам. Proxycurl дает бесплатно 10 кредитов для пробного использования, и каждый успешный запрос к API стоит 1 кредит. Вы можете получить дополнительные кредиты, пополнив свой счет через панель управления. В этом руководстве мы будем использовать бесплатные 10 кредитов для начала. Чтобы начать, перейдите сюда, чтобы получить бесплатный API-ключ.

Затем войдите в свою приборную панель и скопируйте API-ключ из вкладки API-ключ и биллинг.

Чтобы защитить ваш API Key, создайте файл .env в корневом каталоге вашего проекта и добавьте следующий код:

API_KEY = 'YOUR_API_KEY'
Вход в полноэкранный режим Выйти из полноэкранного режима

Наконец, добавьте следующий код, чтобы запустить наш сервер:

import express from 'express';
import axios from 'axios';
import dotenv from 'dotenv';

const app = express();

dotenv.config();

app.listen(8000, () => {
    console.log('App connected successfully!');
});
Войти в полноэкранный режим Выйти из полноэкранного режима

ПРИМЕЧАНИЕ: Не забудьте добавить "type": "module" в package.json, чтобы Node.js знал, что мы пишем код ES6.

Получение списка заданий

Допустим, нам зачем-то нужен список вакансий, опубликованных Twitter на LinkedIn. Ручной поиск таких данных может быть громоздким, но благодаря API Proxycurl мы можем легко получить эти данные.

Для выполнения этой задачи мы будем использовать конечную точку Jobs Listing для запроса вакансий, размещенных Twitter на LinkedIn, и конечную точку Company Profile для получения search_id. search_id — это числовая строка, возвращаемая в ответе конечной точки профиля компании, которую мы будем использовать в качестве параметра при запросе конечной точки списка вакансий.

Чтобы начать работу, добавьте следующий код прямо перед блоком кода app.listen():


// {...previous code omitted for brevity}

const TWITTER_URL = 'https://www.linkedin.com/company/twitter/';  // Line 1

const COMPANY_PROFILE_ENDPOINT = 'https://nubela.co/proxycurl/api/linkedin/company';

const JOBS_LISTING_ENDPOINT = 'https://nubela.co/proxycurl/api/v2/linkedin/company/job';

const JOB_PROFILE_ENDPOINT = 'https://nubela.co/proxycurl/api/linkedin/job';

const companyProfileConfig = {  // Line 2
    url: COMPANY_PROFILE_ENDPOINT,
    method: 'get',
    headers: {'Authorization': 'Bearer ' + process.env.API_KEY},
    params: {
    url: TWITTER_URL
  }
};

const getTwitterProfile = async () => {  // Line 3
    return await axios(companyProfileConfig);
}

const profile = await getTwitterProfile();

const twitterID = profile.data.search_id;

console.log('Twitter ID:', twitterID);


const jobListingsConfig = {
    url: JOBS_LISTING_ENDPOINT,
    method: 'get',
    headers: {'Authorization': 'Bearer ' + process.env.API_KEY},
    params: {
    search_id: twitterID // Line 4
    }
}

const getTwitterListings = async () => { // Line 5
     return await axios(jobListingsConfig);
}

const jobListings = await getTwitterListings();

const jobs = jobListings.data.job;

console.log(jobs);
Вход в полноэкранный режим Выход из полноэкранного режима

Давайте разберемся, что происходит в приведенном выше коде.

  1. Начиная со строки 1 выше, мы определили конечные точки API для API Proxycurl. Вы можете найти ссылки из документации API здесь.

  2. В строке 2 мы определили конфигурацию axios для конечной точки профиля компании. Поле url принимает url конечной точки профиля компании, поле headers принимает Authorization Bearer с нашим API-токеном, а поле params принимает linkedIn url компании, которую мы хотим запросить, что в нашем случае является переменной TWITTER_URL.

  3. В строке 3 мы создали функцию getTwitterProfile, которая использует axios и возвращает профиль нашей компании, используя companyProfileConfig.

  4. В строке 4 мы просто используем search_id, возвращенный из функции getTwitterProfile в качестве параметра в конфигурации axios для функции getTwitterListings .

  5. Наконец, в строке 5 мы определили функцию getTwitterListings для получения списка вакансий, размещенных в Twitter на LinkedIn, и прикрепили результат к переменной jobs, а затем занесли результат в журнал.

На данном этапе, если вы запустите npm dev, в консоль должен быть записан следующий ответ:

Twitter ID: 96622
[
  {
    company: 'Twitter',
    company_url: 'https://www.linkedin.com/company/twitter',
    job_title: 'Content Designer, Content Moderation (Canada)',
    job_url: 'https://www.linkedin.com/jobs/view/3135150334',
    list_date: null,
    location: 'Toronto, ON'
  },
  {
    company: 'Twitter',
    company_url: 'https://www.linkedin.com/company/twitter',
    job_title: 'Senior Machine Learning Engineer - Ads Predictions - Revenue',
    job_url: 'https://www.linkedin.com/jobs/view/3104474438',
    list_date: null,
    location: 'Canada'
  },
  {
    company: 'Twitter',
    company_url: 'https://www.linkedin.com/company/twitter',
    job_title: 'Sr. Software Engineer, Realtime Storage - Key Value Storage',
    job_url: 'https://www.linkedin.com/jobs/view/3135386201',
    list_date: null,
    location: 'Toronto, ON'
  },
  {
    company: 'Twitter',
    company_url: 'https://www.linkedin.com/company/twitter',
    job_title: 'Content Designer, Content Moderation (Canada)',
    job_url: 'https://www.linkedin.com/jobs/view/3135146767',
    list_date: null,
    location: 'Canada'
  },
  {
    company: 'Twitter',
    company_url: 'https://www.linkedin.com/company/twitter',
    job_title: 'Software Engineer - Content Health',
    job_url: 'https://www.linkedin.com/jobs/view/3169270490',
    list_date: null,
    location: 'Toronto, ON'
  },
  {
    company: 'Twitter',
    company_url: 'https://www.linkedin.com/company/twitter',
    job_title: 'Product Design Manager, Advertiser Experience',
    job_url: 'https://www.linkedin.com/jobs/view/3020369734',
    list_date: null,
    location: 'Toronto, ON'
  },
  {
    company: 'Twitter',
    company_url: 'https://www.linkedin.com/company/twitter',
    job_title: 'Engineering Manager - Content Health (Child Safety)',
    job_url: 'https://www.linkedin.com/jobs/view/3165908037',
    list_date: null,
    location: 'Toronto, ON'
  },
  {
    company: 'Twitter',
    company_url: 'https://www.linkedin.com/company/twitter',
    job_title: 'Senior Software Engineer - Observability',
    job_url: 'https://www.linkedin.com/jobs/view/3158647123',
    list_date: null,
    location: 'Toronto, ON'
  },
  {
    company: 'Twitter',
    company_url: 'https://www.linkedin.com/company/twitter',
    job_title: 'Outbound Sales Representative - Customer Success, Agency',
    job_url: 'https://www.linkedin.com/jobs/view/3109712849',
    list_date: null,
    location: 'Toronto, ON'
  },
  {
    company: 'Twitter',
    company_url: 'https://www.linkedin.com/company/twitter',
    job_title: 'Senior Software Engineer - Data Platform, Metadata Services (Permanently Remote!)',
    job_url: 'https://www.linkedin.com/jobs/view/2939759384',
    list_date: null,
    location: 'Toronto, ON'
  },
  {
    company: 'Twitter',
    company_url: 'https://www.linkedin.com/company/twitter',
    job_title: 'Client Account Manager',
    job_url: 'https://www.linkedin.com/jobs/view/3136650462',
    list_date: null,
    location: 'Toronto, ON'
  }
]
Вход в полноэкранный режим Выход из полноэкранного режима

Получение подробной информации о конкретном задании

Конечная точка Job Profile возвращает обработанную и компактную информацию о конкретной вакансии, размещенной компанией на LinkedIn. Чтобы увидеть это в действии, мы используем одну из вакансий, перечисленных Twitter, которую мы вернули из конечной точки Jobs Listing Endpoint в нашем предыдущем коде.

Добавьте следующий код в свой проект:

// {...previous code omitted for brevity}

const jobProfileConfig = {
    url: JOB_PROFILE_ENDPOINT,
    method: 'get',
    headers: { 'Authorization': 'Bearer ' + process.env.API_KEY },
    params: {
        url: jobs[0].job_url   // Line 1
    }
};

const getJobDetails = async () => {  // Line 2
    return await axios(jobProfileConfig);
};

const jobDetails = await getJobDetails(); 

console.log(jobDetails.data);  
Вход в полноэкранный режим Выйти из полноэкранного режима

Вот что мы делаем выше.

  1. В строке 1 мы добавили url первого задания в переменную jobs в качестве параметра к конфигурации axios в jobProfileConfig.

  2. В строке 2 мы определили функцию getJobDetails для получения подробностей первого задания в массиве jobs.

Выполнение этого кода выводит на консоль следующий ответ:

{
    "apply_url": null,
    "company": {
        "logo": "https://media-exp1.licdn.com/dms/image/C4D0BAQHiNSL4Or29cg/company-logo_400_400/0/1519856215226?e=1661385600u0026v=betau0026t=rUecQpduLPDavL3JswjLsJAUNgSu1Q2l3JS5sGp8nHk",
        "name": "Twitter",
        "url": "https://www.linkedin.com/company/twitter"
    },
    "employment_type": "Full-time",
    "industry": [
        "Internet"
    ],
    "job_description": "This role may also be remote. Note: By applying to this position you will have...",
    "job_functions": [],
    "linkedin_internal_id": "2400342303",
    "location": "Toronto, ON",
    "seniority_level": null,
    "title": "'Content Designer, Content Moderation (Canada)",
    "total_applicants": null
}
Вход в полноэкранный режим Выход из полноэкранного режима

ПРИМЕЧАНИЕ: Для краткости я сократил содержимое поля job_description.

Ограничения API LinkedIn Job

В нынешнем состоянии LinkedIn Job API имеет некоторые ограничения, которые ограничивают его использование. Вот некоторые из недостатков, с которыми может столкнуться пользователь при использовании API.

  1. API не предоставляет дату размещения вакансии.

  2. Он не предоставляет квалификацию или навыки, необходимые для работы.

Надеемся, что будущие обновления API будут включать значительные улучшения и обновления, которые ограничат вышеупомянутые недостатки.

Оцените статью
devanswers.ru
Добавить комментарий