Использование API результатов листинга вакансий Google от SerpApi

Что будет очищено

📌Примечание. Некоторые запросы могут отображать не все разделы. Вы можете проверить свой запрос в игровой площадке.

Зачем использовать API?

  • Нет необходимости создавать парсер с нуля и поддерживать его.
  • Обходите блокировки от Google: разгадывайте CAPTCHA или разгадывайте IP-блокировки.
  • Платите за прокси и решатели CAPTCHA.
  • Не нужно использовать автоматизацию браузера.

SerpApi обрабатывает все на бэкэнде с быстрым временем отклика менее ~ 2,5 секунд (~ 1,2 секунды со скоростью Ludicrous) на запрос и без автоматизации браузера, что становится намного быстрее. Время отклика и показатели статуса отображаются на странице Статус SerpApi.

Полный код

Если вам не нужны объяснения, посмотрите полный пример кода в онлайн-IDE.

from serpapi import GoogleSearch
import os, json


def extract_multiple_jobs():
    params = {
        # https://docs.python.org/3/library/os.html#os.getenv
        'api_key': os.getenv('API_KEY'),        # your serpapi api
        'engine': 'google_jobs',                # SerpApi search engine 
        'gl': 'us',                             # country of the search
        'hl': 'en',                             # language of the search
        'q': 'barista new york',                # search query
    }

    search = GoogleSearch(params)               # where data extraction happens on the SerpApi backend
    results = search.get_dict()                 # JSON -> Python dict

    return [job.get('job_id') for job in results['jobs_results']]


def scrape_google_jobs_listing(job_ids):
    data = []

    for job_id in job_ids:
        params = {
            # https://docs.python.org/3/library/os.html#os.getenv
            'api_key': os.getenv('API_KEY'),    # your serpapi api
            'engine': 'google_jobs_listing',    # SerpApi search engine 
            'q': job_id,                        # search query (job_id)
        }

        search = GoogleSearch(params)           # where data extraction happens on the SerpApi backend
        results = search.get_dict()             # JSON -> Python dict

        data.append({
            'job_id': job_id,
            'apply_options': results.get('apply_options'),
            'salaries': results.get('salaries'),
            'ratings': results.get('ratings')
        })

    return data


def main():
    job_ids = extract_multiple_jobs()
    google_jobs_listing_results = scrape_google_jobs_listing(job_ids)

    print(json.dumps(google_jobs_listing_results, indent=2, ensure_ascii=False))


if __name__ == '__main__':
    main()

Подготовка

Установить библиотеку:

pip install google-search-results

google-search-results — это пакет API SerpApi.

Код Пояснение

Импортировать библиотеки:

from serpapi import GoogleSearch
import os, json
  • GoogleSearchдля парсинга и парсинга результатов Google с помощью библиотеки веб-парсинга SerpApi.
  • osчтобы вернуть значение переменной среды (ключ SerpApi API).
  • jsonдля преобразования извлеченных данных в объект JSON.

Среда кода верхнего уровня

Функция extract_multiple_jobs() вызывается для получения всех значений job_id. Полученный список job_ids передается функции scrape_google_jobs_listing(job_ids) для получения необходимых данных. Объяснение этих функций будет в соответствующих заголовках ниже.

В этом коде используется общепринятое правило использования конструкции __name__ == "__main__":

def main():
    job_ids = extract_multiple_jobs()
    google_jobs_listing_results = scrape_google_jobs_listing(job_ids)

    print(json.dumps(google_jobs_listing_results, indent=2, ensure_ascii=False))


if __name__ == '__main__':
    main()

Эта проверка будет выполнена только в том случае, если пользователь запустил этот файл. Если пользователь импортирует этот файл в другой, то проверка не сработает.

Вы можете посмотреть видео Python Tutorial: if name == 'main для более подробной информации.

Извлечь несколько заданий

Функция возвращает список из job_id значений. Значение этого идентификатора будет использовано в следующей функции для создания запроса.

Эта функция предоставляет фрагмент кода для получения данных с первой страницы. Если вы хотите извлечь данные с помощью разбивки на страницы, вы можете увидеть это в блоге Очистить органические результаты Google Jobs с помощью Python.

В начале функции определяются параметры для генерации URL. Если вы хотите передать URL-адресу другие параметры, вы можете сделать это с помощью словаря params.

params = {
    # https://docs.python.org/3/library/os.html#os.getenv
    'api_key': os.getenv('API_KEY'),        # your serpapi api
    'engine': 'google_jobs',                # SerpApi search engine 
    'gl': 'us',                             # country of the search
    'hl': 'en',                             # language of the search
    'q': 'barista new york',                # search query
}
  • api_keyParameter определяет используемый закрытый ключ SerpApi.
  • engineУстановите для параметра значение google_jobs, чтобы использовать механизм Google Jobs API.
  • glПараметр определяет страну, используемую для поиска Google. Это двухбуквенный код страны. (например, us для США, uk для Великобритании или fr для Франции). Перейдите на страницу стран Google для получения полного списка поддерживаемых стран Google.
  • hlПараметр определяет язык, используемый для поиска вакансий Google. Это двухбуквенный код языка. (например, en для английского, es для испанского или fr для французского). Перейдите на страницу языков Google для получения полного списка поддерживаемых языков Google.
  • qПараметр определяет запрос, который вы хотите найти.

Затем мы создаем объект search, в котором данные извлекаются из серверной части SerpApi. В словаре results получаем данные из JSON:

search = GoogleSearch(params)   # where data extraction happens on the SerpApi backend
results = search.get_dict()     # JSON -> Python dict

Возвращает скомпилированный список всех job_id, используя понимание списка:

return [job.get('job_id') for job in results['jobs_results']]

Функция выглядит следующим образом:

def extract_multiple_jobs():
    params = {
        # https://docs.python.org/3/library/os.html#os.getenv
        'api_key': os.getenv('API_KEY'),        # your serpapi api
        'engine': 'google_jobs',                # SerpApi search engine 
        'gl': 'us',                             # country of the search
        'hl': 'en',                             # language of the search
        'q': 'barista new york',                # search query
    }

    search = GoogleSearch(params)               # where data extraction happens on the SerpApi backend
    results = search.get_dict()                 # JSON -> Python dict

    return [job.get('job_id') for job in results['jobs_results']]

Очистить список вакансий Google

Эта функция принимает список job_ids и возвращает список всех данных.

Объявление списка data, в который будут добавлены извлеченные данные:

data = []

Для каждого значения job_id в списке job_ids будут сделаны отдельные запросы и будут получены соответствующие данные:

for job_id in job_ids:
    # data extraction will be here

Далее пишем параметры для выполнения запроса:

params = {
    # https://docs.python.org/3/library/os.html#os.getenv
    'api_key': os.getenv('API_KEY'),    # your serpapi api
    'engine': 'google_jobs_listing',    # SerpApi search engine 
    'q': job_id,                        # search query (job_id)
}
  • api_keyParameter определяет используемый закрытый ключ SerpApi.
  • engineУстановите для параметра значение google_jobs_listing, чтобы использовать механизм Google Jobs Listing API.
  • Параметр q определяет строку job_id, которую можно получить из Google Jobs API.

Затем мы создаем объект search, в котором данные извлекаются из серверной части SerpApi. В словаре results получаем данные из JSON:

search = GoogleSearch(params)   # where data extraction happens on the SerpApi backend
results = search.get_dict()     # JSON -> Python dict

Затем мы можем создать структуру словаря из таких значений, как job_id, apply_options, salaries и ratings. Извлеченные данные записываются по соответствующим ключам. После этого словарь добавляется в список data:

data.append({
    'job_id': job_id,
    'apply_options': results.get('apply_options'),
    'salaries': results.get('salaries'),
    'ratings': results.get('ratings')
})

В конце функции возвращается список data с извлеченными данными для каждого job_id:

return data

Полная функция очистки всех данных будет выглядеть так:

def scrape_google_jobs_listing(job_ids):
    data = []

    for job_id in job_ids:
        params = {
            # https://docs.python.org/3/library/os.html#os.getenv
            'api_key': os.getenv('API_KEY'),    # your serpapi api
            'engine': 'google_jobs_listing',    # SerpApi search engine 
            'q': job_id,                        # search query (job_id)
        }

        search = GoogleSearch(params)           # where data extraction happens on the SerpApi backend
        results = search.get_dict()             # JSON -> Python dict

        data.append({
            'job_id': job_id,
            'apply_options': results.get('apply_options'),
            'salaries': results.get('salaries'),
            'ratings': results.get('ratings')
        })

    return data

Выход

[
  {
    "job_id": "eyJqb2JfdGl0bGUiOiJCYXJpc3RhIiwiaHRpZG9jaWQiOiJuc3Y1d1hyNXdFOEFBQUFBQUFBQUFBPT0iLCJnbCI6InVzIiwiaGwiOiJlbiIsImZjIjoiRXVJQkNxSUJRVUYwVm14aVFtcFdYMjl0V0ZadU9USTNWV0ZZUlZRek9XRTJPVlJtYUc1RVZtaGpaRk5WT1VFMlNYZFpaR2ROU0dzdFoyMVBkMmxmUTNKS2RUQnJjMWxFT0dZNFNHWnFXRUZNTjB4eFRWVmtMV1JRVVRWaVJGbFVSMVo1YmxsVWVuazVPRzlxVVVsTmVXcFJjRXhPVWpWbWMwdFlTMlo2V21SUU1XSkZZa2hTY2pKaGRYcEdlRzVxTVVWNGIwZ3lhVXd3UlZGVVZ6Tk5XSGRNYXpKbVYyVjNFaGQzYkhCeFdTMWZUMHhNTW01d2RGRlFNRGhwUW05QmF4b2lRVVJWZVVWSFpqSTJWMjF3TjBoU2FtNDRPSHB5WkVWTldVMVhVWGRTU1hwMVFRIiwiZmN2IjoiMyIsImZjX2lkIjoiZmNfMSIsImFwcGx5X2xpbmsiOnsidGl0bGUiOiIubkZnMmVie2ZvbnQtd2VpZ2h0OjUwMH0uQmk2RGRje2ZvbnQtd2VpZ2h0OjUwMH1BcHBseSBkaXJlY3RseSBvbiBDdWxpbmFyeSBBZ2VudHMiLCJsaW5rIjoiaHR0cHM6Ly9jdWxpbmFyeWFnZW50cy5jb20vam9icy80MTc4NjMtQmFyaXN0YT91dG1fY2FtcGFpZ249Z29vZ2xlX2pvYnNfYXBwbHlcdTAwMjZ1dG1fc291cmNlPWdvb2dsZV9qb2JzX2FwcGx5XHUwMDI2dXRtX21lZGl1bT1vcmdhbmljIn19",
    "apply_options": [
      {
        "title": "Apply on Trabajo.org",
        "link": "https://us.trabajo.org/job-1683-20221107-34e191c4eb8c8ca3ec69adfa55061df2?utm_campaign=google_jobs_apply&utm_source=google_jobs_apply&utm_medium=organic"
      },
      {
        "title": "Apply on Jobs",
        "link": "https://us.fidanto.com/jobs/job-opening/nov-2022/barista-1432712052?utm_campaign=google_jobs_apply&utm_source=google_jobs_apply&utm_medium=organic"
      },
      {
        "title": "Apply on Craigslist",
        "link": "https://newyork.craigslist.org/mnh/fbh/d/new-york-cafe-barista/7553733276.html?utm_campaign=google_jobs_apply&utm_source=google_jobs_apply&utm_medium=organic"
      },
      {
        "title": "Apply directly on Culinary Agents",
        "link": "https://culinaryagents.com/jobs/417863-Barista?utm_campaign=google_jobs_apply&utm_source=google_jobs_apply&utm_medium=organic"
      }
    ],
    "salaries": null,
    "ratings": null
  },
  ... other results
]

Ссылки

Первоначально опубликовано на SerpApi: https://serpapi.com/blog/using-google-jobs-listing-api-from-serpapi/

Присоединяйтесь к нам в Твиттере | "YouTube"

Добавьте Запрос функции💫 или Ошибку🐞