В наши дни поиск работы в значительной степени переместился на онлайн-платформы, что делает поиск вакансий проще, чем когда-либо. Однако с этим удобством приходит и проблема просеивания огромного количества информации, чтобы найти нужные списки вакансий. Вот где в игру вступает веб-скрапинг, мощный метод в мире извлечения данных.

Веб-скрапинг позволяет вам изменить подход к поиску работы, автоматизируя сбор и организацию данных. объявления о работе. Вместо того, чтобы тратить часы на ручной поиск по различным доскам объявлений и веб-сайтам, вы можете создать собственные скрипты веб-скрапинга для сбора, фильтрации и представления списков вакансий, соответствующих вашим предпочтениям. Это не только экономит ваше драгоценное время, но и гарантирует, что вы не упустите скрытые возможности трудоустройства, которые могут быть зарыты глубоко в сети.

В этом подробном руководстве мы рассмотрим, как использовать потенциал Indeed Scraper с помощью Crawlbase Crawling API для оптимизации процесса поиска работы на одном из самых известных сайтов с объявлениями о работе. Независимо от того, являетесь ли вы соискателем, который ищет идеальную возможность карьерного роста, или энтузиастом данных, заинтересованным в освоении методов веб-скрейпинга, эта пошаговая инструкция Питон руководство вооружит вас навыками автоматизации поиска работы и сделает его более эффективным и действенным. Присоединяйтесь к нам, и мы погрузимся в мир веб-скрейпинга и откроем бесчисленные возможности, которые он предлагает для упрощения вашего поиска работы на Indeed.

Что такое скрапер?

Сборщик вакансий — это часть программного обеспечения или кода, которая собирает объявления о вакансиях из разных онлайн-источников, таких как доски объявлений о вакансиях, сайты компаний или карьерные центры. Эти инструменты извлекают важные данные, такие как названия должностей, описания, требования и порядок подачи заявки. Люди часто используют собранные ими данные для изучения тенденций в сфере вакансий, исследования рынка труда или заполнения сайтов по поиску работы.

Веб-скрапинг играет решающую роль в упрощении и оптимизации процесса поиска работы. Вот как:

Роль веб-скрапинга в поиске работы
  1. Объединение списков вакансий: Веб-скрапинг позволяет вам объединять списки вакансий из различных источников и веб-сайтов в единый набор данных. Это означает, что вы можете получить доступ к широкому спектру вакансий в одном месте, экономя усилия на посещении нескольких веб-сайтов.

  2. Автоматизация извлечения данных: Вместо ручного копирования и вставки данных о работе, веб-скрапинг автоматизирует процесс извлечения данных. С правильным скриптом скрапинга вы можете извлекать названия должностей, названия компаний, описания должностей, местоположения и многое другое без повторяющихся ручных задач.

  3. Индивидуальные поисковые запросы: Веб-скрапинг позволяет вам настраивать поиск работы. Вы можете настроить определенные критерии поиска и фильтры для извлечения списков вакансий, которые соответствуют вашим предпочтениям. Этот уровень настройки помогает вам сосредоточиться на наиболее релевантных возможностях.

  4. Обновления в реальном времени: Планируя запуск скриптов веб-скрапинга с регулярными интервалами, вы можете получать обновления в режиме реального времени о новых вакансиях. Это гарантирует, что вы будете среди первых, кто узнает о вакансиях в нужной вам области.

В следующих разделах мы рассмотрим, как использовать веб-скрапинг, в частности, с помощью Crawlbase Crawling API, чтобы эффективно извлекать вакансии из Indeed. Это пошаговое руководство даст вам навыки автоматизации поиска работы и сделает его более эффективным и действенным.

Начало работы с Crawlbase Crawling API

На вашем пути к использованию возможностей веб-скрапинга для поиска работы на Indeed, понимание Crawlbase Crawling API имеет первостепенное значение. В этом разделе мы рассмотрим технические аспекты CrawlbaseAPI и снабдит вас знаниями, необходимыми для его беспрепятственной интеграции в ваш проект по сбору заданий Python.

Отправка запроса с Crawling API

CrawlbaseАвтора Crawling API разработан для простоты и удобства интеграции в ваши проекты веб-скрейпинга. Все URL-адреса API начинаются с базовой части: https://api.crawlbase.com. Сделать первый вызов API так же просто, как выполнить команду в терминале:

1
виться 'https://api.crawlbase.com/?token=YOUR_CRAWLBASE_TOKEN&url=https%3A%2F%2Fgithub.com%2Fcrawlbase%3Ftab%3Drepositories'

Здесь вы заметите token параметр, который служит вашим ключом аутентификации для доступа CrawlbaseВозможности веб-скрапинга. Crawlbase предлагает два типа токенов: обычный (TCP) токен и токен JavaScript (JS). Выберите обычный токен для сайтов, которые не сильно меняются, например, статические сайты. Но если вы хотите получить информацию с сайта, который работает только тогда, когда люди используют веб-браузеры с JavaScript, или если важные вещи, которые вам нужны, сделаны JavaScript на стороне пользователя, то вам следует использовать токен JavaScript. Как и в случае с Indeed, вам нужен токен JavaScript, чтобы получить то, что вы хотите.

Время и формат ответа API

При взаимодействии с Crawlbase Crawling API, важно понимать время отклика и как интерпретировать успех или неудачу. Вот более подробный взгляд на эти аспекты:

Время отклика: Обычно время ответа API находится в диапазоне от 4 до 10 секунд. Чтобы обеспечить бесперебойную работу и компенсировать возможные задержки, рекомендуется установить тайм-аут для вызовов не менее 90 секунд. Это гарантирует, что ваше приложение сможет обрабатывать изменения во времени ответа без прерываний.

Форматы ответов: При оформлении запроса Crawlbase, у вас есть возможность выбирать между форматами ответа HTML и JSON в зависимости от ваших предпочтений и требований к синтаксическому анализу. Вы можете передать параметр запроса «format» со значением «html» или «json», чтобы выбрать требуемый формат.

Если вы выберете формат ответа HTML (который используется по умолчанию), вы получите HTML-контент веб-страницы в качестве ответа. Параметры ответа будут добавлены в заголовки ответа для удобства доступа. Вот пример ответа:

1
2
3
4
5
6
7
Заголовки:
URL: протокол HTTPS://github.com/crawlbase?tab=репозитории
оригинальный_статус: 200
pc_status: 200

Тело:
HTML страницы

Если вы выберете формат ответа JSON, вы получите структурированный объект JSON, который можно легко проанализировать в вашем приложении. Этот объект содержит всю необходимую информацию, включая параметры ответа. Вот пример ответа:

1
2
3
4
5
6
{
"исходный_статус": "200",
"статус_ПК": 200,
"URL": "https%3A%2F%2Fgithub.com%2Fcrawlbase%3Ftab%3Drepositories",
«Тело»: "HTML страницы"
}

Заголовки ответа: Ответы HTML и JSON включают в себя важные заголовки, которые предоставляют ценную информацию о запросе и его результате:

  • url: Исходный URL, который был отправлен в запросе, или URL любых перенаправлений, которые Crawlbase последовало.
  • original_status: Ответ о состоянии, полученный Crawlbase при сканировании URL, отправленного в запросе. Это может быть любой действительный код статуса HTTP.
  • pc_status: Crawlbase (pc) код статуса, который может быть любым кодом статуса и является кодом, который в итоге оказывается действительным. Например, если веб-сайт возвращает original_status из 200 с CAPTCHA-тестом, pc_status может быть 503.
  • body (только JSON): этот параметр доступен в формате JSON и содержит содержимое веб-страницы, которая Crawlbase найдено в результате сканирования прокси-сервером URL-адреса, отправленного в запросе.

Эти параметры ответа позволяют вам оценить результаты ваших запросов и определить, была ли операция по веб-скрейпингу успешной.

Crawling API Параметры

Crawlbase предлагает полный набор параметров, которые позволяют разработчикам настраивать свои запросы на сканирование веб-страниц. Эти параметры позволяют точно настраивать процесс сканирования для удовлетворения конкретных требований. Например, вы можете указать форматы ответов, такие как JSON или HTML, используя параметр «format», или контролировать время ожидания страницы с помощью «page_wait» при работе с контентом, сгенерированным JavaScript.

Кроме того, вы можете извлекать файлы cookie и заголовки, устанавливать пользовательские агенты, делать снимки экрана и даже выбирать настройки геолокации с помощью таких параметров, как «get_cookies», «user_agent», «screenshot» и «country». Эти параметры обеспечивают гибкость и контроль над процессом сканирования веб-страниц. Например, чтобы получить файлы cookie, установленные исходным веб-сайтом, вы можете просто включить «&get_cookies=true» в свой запрос API и Crawlbase вернет файлы cookie в заголовках ответа.

Вы можете больше узнать о Crawlbase Crawling API параметры здесь.

Бесплатная пробная версия, стратегия тарификации и ограничение скорости

Crawlbase предоставляет бесплатную пробную версию, которая включает первые 1,000 запросов, позволяя вам изучить ее возможности перед совершением покупки. Однако важно максимально использовать этот пробный период, чтобы извлечь из него максимальную пользу.

Crawlbase работает по модели «плати за то, что используешь». Важно, Crawlbase только плата за успешные запросы, что делает его экономически эффективным и эффективным для ваших потребностей в веб-скрейпинге. Успешные запросы определяются путем проверки original_status и pc_status в параметрах ответа.

API имеет ограничение по скорости до 20 запросов в секунду на токен. Если вам требуется более высокий лимит скорости, вы можете связаться со службой поддержки, чтобы обсудить ваши конкретные потребности.

Crawlbase Библиотека Python

The Crawlbase Библиотека Python предлагает простой способ взаимодействия с Crawlbase Crawling API. Вы можете использовать этот легкий и не имеющий зависимостей класс Python в качестве оболочки для Crawlbase API. Для начала инициализируем Crawling API класс с вашим Crawlbase токен. Затем вы можете сделать запросы GET, указав URL, который вы хотите скопировать, и любые желаемые параметры, такие как пользовательские агенты или форматы ответов. Например, вы можете скопировать веб-страницу и получить доступ к ее содержимому следующим образом:

1
2
3
4
5
6
7
8
9
от база сканирования Импортировать CrawlingAPI

# Инициализируем класс CrawlingAPI
api = CrawlingAPI({ токен: 'ВАШ_ТОКЕН_БАЗЫ_КРАНА' })

# Сделайте запрос GET для очистки веб-страницы
ответ = api.get('https://www.example.com')
if ответ['status_code'] == 200:
Распечатать(ответ['тело'])

Эта библиотека упрощает процесс извлечения веб-данных и особенно полезна для сценариев, где динамический контент, ротация IP-адресов и другие расширенные функции Crawlbase API обязательны.

Собирайте данные Indeed, например, объявления о вакансиях

Чтобы эффективно извлекать информацию о вакансиях из Indeed, важно понимать структуру его веб-сайта и то, как организованы списки вакансий.

Страница поиска работы Indeed

Домашняя страница: Когда вы впервые попадаете на домашнюю страницу Indeed, вы сталкиваетесь с простой строкой поиска, в которую вы можете ввести ключевые слова, названия должностей или названия компаний. Эта функция поиска является вашим шлюзом для поиска определенных списков вакансий. Вы также можете указать данные о местоположении, чтобы сузить поиск до определенного города, штата или страны.

Результаты поиска: После ввода критериев поиска и нажатия кнопки «Поиск» Indeed отображает список вакансий, соответствующих вашему запросу. Эти списки обычно организованы в обратном хронологическом порядке, причем самые последние публикации отображаются вверху. В каждом списке указаны основные сведения, такие как должность, название компании, местоположение и краткое описание работы.

Фильтры: Indeed предлагает различные фильтры в левой части страницы результатов поиска. Эти фильтры позволяют вам еще больше сузить поиск. Вы можете фильтровать списки вакансий по типу работы (например, полный рабочий день, неполный рабочий день), оценке заработной платы, местоположению, компании и т. д. Использование этих фильтров может помочь вам найти вакансии, которые точно соответствуют вашим критериям.

Пагинация: Если есть несколько объявлений о работе, соответствующих вашему поиску, Indeed реализует пагинацию. Вы заметите, что на каждой странице отображается только ограниченное количество объявлений о работе. Чтобы получить доступ к большему количеству объявлений, вам нужно будет нажать на номера страниц или кнопку «Далее» в нижней части результатов поиска. Понимание того, как работает пагинация, имеет решающее значение для парсинга нескольких страниц объявлений о работе.

Настройка среды разработки

Прежде чем вы сможете погрузиться в веб-скрапинг объявлений Indeed с помощью Python, вам нужно настроить среду разработки. Это включает установку необходимых инструментов и библиотек и выбор правильной интегрированной среды разработки (IDE) для ваших задач по кодированию.

Установка Python

Python — это основной язык программирования, который мы будем использовать для веб-скрапинга. Если Python еще не установлен в вашей системе, выполните следующие действия:

  1. Скачать Питон: Посетите официальный сайт Python python.org и загрузите последнюю версию Python. Выберите подходящий установщик для вашей операционной системы (Windows, macOS или Linux).

  2. Установка: Запустите загруженный установщик и следуйте инструкциям по установке. Во время установки обязательно отметьте опцию, которая добавляет Python в PATH вашей системы. Этот шаг имеет решающее значение для запуска Python из командной строки.

  3. Проверьте установку: Откройте командную строку или терминал и введите следующую команду, чтобы проверить правильность установки Python:

1
python --version

Вы должны увидеть установленную версию Python.

Установка необходимых библиотек

Python предлагает богатую экосистему библиотек, которые упрощают веб-скрапинг. Для этого проекта вам понадобится библиотека crawlbase для выполнения веб-запросов с Crawlbase API и библиотека Beautiful Soup для разбора HTML-контента. Для установки этих библиотек используйте следующие команды:

  1. Crawlbase: The crawlbase библиотека представляет собой оболочку Python для Crawlbase API, который позволит нам эффективно выполнять веб-запросы.
1
pip установить crawlbase
  1. Прекрасный суп: Beautiful Soup — библиотека для анализа HTML и XML-документов. Она особенно полезна для извлечения данных из веб-страниц.
1
Пип установить BeautifulSoup4

Установив эти библиотеки, вы получите инструменты, необходимые для загрузки веб-страниц с помощью Crawlbase API и анализировать их содержимое в процессе сбора данных.

Выбор правильной среды разработки IDE

Интегрированная среда разработки (IDE) предоставляет среду кодирования с такими функциями, как подсветка кода, автодополнение и инструменты отладки. Хотя вы можете писать код Python в простом текстовом редакторе, использование IDE может значительно улучшить ваш опыт разработки.

Вот несколько популярных IDE для Python, которые стоит рассмотреть:

  1. PyCharm: PyCharm — это надежная IDE с бесплатной версией Community Edition. Она предлагает такие функции, как анализ кода, визуальный отладчик и поддержку веб-разработки.

  2. Код Visual Studio (код VS): VS Code — бесплатный редактор кода с открытым исходным кодом, разработанный Microsoft. Он имеет обширную библиотеку расширений, что делает его универсальным для различных задач программирования, включая веб-скрапинг.

  3. Jupyter Notebook: Jupyter Notebook отлично подходит для интерактивного кодирования и исследования данных. Он широко используется в проектах по науке о данных.

  4. Spyder: Spyder — это IDE, разработанная для научных и связанных с данными задач. Она предоставляет такие функции, как проводник переменных и интерактивная консоль.

Выберите IDE, которая лучше всего подходит вашим предпочтениям и рабочему процессу. После установки Python, настройки необходимых библиотек и готовности выбранной IDE вы готовы приступить к созданию своего Indeed job scraper на Python.

Создание вашего Indeed Job Scraper

В этом разделе мы проведем вас через процесс создания мощного Indeed job scraper с помощью Python. Этот scraper позволит вам собирать списки вакансий, обрабатывать пагинацию на страницах поиска вакансий, извлекать подробную информацию со страниц объявлений о вакансиях и эффективно сохранять эти данные в базе данных SQLite.

Парсинг списков вакансий

Чтобы начать скрейпинг вакансий с Indeed.com, нам нужно понять, как делать запросы на сайт и анализировать результаты. Если вы посетите домашнюю страницу Indeed и отправите запрос на поиск работы, вы заметите, что сайт перенаправляет вас на URL-адрес поиска с определенными параметрами, например:

1
https://www.indeed.com/jobs?q=Web+Developer&l=Virginia

Здесь мы ищем вакансии веб-разработчика в Вирджинии, и URL-адрес включает такие параметры, как q=Web+Developer для запроса работы и l=Virginia для местоположения. Чтобы воспроизвести это в вашем коде Python, используя Crawlbase библиотеку, вы можете использовать следующий пример:

1
2
3
4
5
6
7
8
от база сканирования Импортировать CrawlingAPI

api = CrawlingAPI({токен: 'ВАШ_ТОКЕН_JS_CRAWL'})

ответ = api.get(«https://www.indeed.com/jobs?Web+Developer&l=Вирджиния»)
if ответ['status_code'] == 200:
# Обработайте страницу со списком вакансий здесь
Распечатать(ответ['тело'])

Этот фрагмент кода демонстрирует, как отправить запрос GET на страницу поиска работы Indeed. Получив HTML-контент страницы списка вакансий, вы можете проанализировать его, чтобы извлечь списки вакансий.

Мы могли бы проанализировать HTML-документ с помощью селекторов CSS или XPath, но есть более простой способ: мы можем найти все данные о списке вакансий, спрятанные глубоко в HTML, в виде документа JSON:

Мы можем использовать регулярные выражения для эффективного извлечения этих данных JSON. Давайте обновим предыдущий пример для обработки скрапинга списков вакансий.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Импортировать re
Импортировать JSON
от база сканирования Импортировать CrawlingAPI

api = CrawlingAPI({токен: 'ВАШ_ТОКЕН_JS_CRAWL'})

# Функция для анализа HTML страницы поиска
защиту parse_search_page_html(HTML: ул):
данные = re.findall(r'window.mosaic.providerData\["mosaic-provider-jobcards"\]=(\{.+?\});', HTML)
данные = json.loads(данные[0])
возвращают {
"полученные результаты": данные["метаданные"]["mosaicProviderJobCardsModel"]["полученные результаты"],
"мета": данные["метаданные"]["mosaicProviderJobCardsModel"]["tierSummaries"],
}

ответ = api.get(«https://www.indeed.com/jobs?Web+Developer&l=Вирджиния», {'страна': 'НАС'})
if ответ['status_code'] == 200:
# Извлеченный HTML-контент после декодирования байтовых данных
html_content = ответ['тело'].decode('латинский1')

# Вызов функции parse_job_listings с HTML-страницей списка вакансий
job_listings = parse_search_page_html(html_content)
Распечатать(json.dumps(job_listings, отступ=2))

Функция, parse_search_page_html, используется для извлечения данных о списке вакансий из исходного кода HTML страницы поиска вакансий Indeed. Он использует регулярные выражения для поиска определенной переменной JavaScript mosaic-provider-jobcards содержащую структурированную информацию о списке вакансий в формате JSON. Затем она анализирует эти данные JSON, извлекая два основных компонента: «results», который содержит списки вакансий, и «meta», который содержит метаданные о списках вакансий, такие как количество результатов в различных категориях. Функция возвращает эти структурированные данные в виде словаря Python для дальнейшей обработки.

Пример вывода:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
{
"полученные результаты": [
{
"adBlob": "...",
"adId": "419399410",
"advn": "7790245867719370",
"примененоИлиБольше": ложный,
"clickLoggingUrl": "...",
"компания": «Гостиница в Литл-Вашингтоне»,
"АтрибутыБрендаКомпании": {
"headerImageUrl": "https://d2q79iu7y748jz.cloudfront.net/s/_headerimage/1960x400/d9ca093411583ed06046ab18078e777d",
"logoUrl": "https://d2q79iu7y748jz.cloudfront.net/s/_squarelogo/256x256/1b781c60efb593aa39cd69478346b673"
},
"companyIdEncrypted": "30de376f4842f806",
"Обзор компанииСсылка": "/cmp/Inn-At-Little-Washington",
"companyOverviewLinkCampaignId": "serp-linkcompanyname-content",
"компанияРейтинг": 3.1,
"companyReviewCount": 30,
"companyReviewLink": "/cmp/Inn-At-Little-Washington/отзывы",
"companyReviewLinkCampaignId": "cmplinktst2",
"d2iEnabled": ложный,
"displayTitle": «Агент ресепшена»,
"dradisJob": ложный,
"employerAssistEnabled": ложный,
"работодательОтзывчивый": ложный,
"зашифрованныйFccompanyId": "11dc5e49b00978a6",
"зашифрованныерезультирующиеданные": "VwIPTVJ1cTn5AN7Q-tSqGRXGNe2wB2UYx73qSczFnGU",
"enhancedAttributesModel": {},
"заманщики": [],
"истекший": ложный,
"extractTrackingUrls": "",
"extractedSalary": {
"макс": 22,
"мин": 22,
"тип": "ежечасно"
},
"fccompanyId": -1,
"featuredCompanyAttributes": {},
"избранный работодатель": ложный,
"избранныйРаботодательКандидат": ложный,
"feedId": 297995,
"formattedLocation": "Вашингтон, Вирджиния 22747",
"отформатированноеОтносительноеВремя": "20 дня назад",
"скрытьМетаДанные": ложный,
"highVolumeHiringModel": {
"highVolumeHiring": ложный
},
"наймEventJob": ложный,
"homepageJobFeedSectionId": "0",
"indeedApplyEnabled": правда,
"действительноПрименимо": правда,
"isJobVisited": ложный,
"isMobileThirdPartyApplyable": ложный,
"isNoResumeJob": ложный,
"isSubsidiaryJob": ложный,
"jobCardRequirementsModel": {
"ДополнительныеТребованияКоличество": 0,
"требованияЗаголовокПоказан": ложный
},
"jobLocationCity": "Вашингтон",
"jobLocationPostal": "22747",
"jobLocationState": "ВА",
"Типы заданий": [],
"jobkey": "72ed373141879fd4",
"jsiEnabled": ложный,
"связь": "...",
"locationCount": 1,
"мобтк": "1hasil75vimhq800",
"moreLocUrl": "/jobs?q=&l=Virginia&radius=35&jtid=5bdc6c9a550a63f1&jcid=30de376f4842f806&grp=tcl",
"mouseDownHandlerOption": {
"adId": 419399410,
"advn": "7790245867719370",
"extractTrackingUrls": [],
"от": "vjs",
"jobKey": "72ed373141879fd4",
"связь": "...",
"тк": "1hasil75vimhq800"
},
"новая работа": ложный,
"нормЗаголовок": «Агент ресепшена»,
"openInterviewsInterviewsOnTheSpot": ложный,
"openInterviewsJob": ложный,
"открытыеИнтервьюПредложенияНаМесте": ложный,
"открытоИнтервьюТелефонРабота": ложный,
"organicApplyStartCount": 19,
"переопределитьInDeedApplyText": правда,
"точнаяМодельРасположения": {
"запутатьРасположение": ложный,
"переопределитьJCMPreciseLocationModel": правда
},
"pubDate": 1693458000000,
"rankingScoresModel": {
"делать ставку": 219074,
"eApply": 0.00094590354,
"eQualified": 0
},
"перенаправить на сторонний сайт": ложный,
"удалённоеРасположение": ложный,
"resumeMatch": ложный,
"salarySnippet": {
"валюта": "ДОЛЛАР США",
"salaryTextFormatted": ложный,
"источник": «ИЗВЛЕЧЕНИЕ»,
"текст": «22 доллара в час»
},
"сохранено": ложный,
"сохраненноеПриложение": ложный,
"screenerQuestionsURL": "https://gateway.harri.com/dispatcher/api/v1/indeed/jobs/1064851/screening_questions",
"поискUID": "1hasil75vimhq800",
"showAttainabilityBadge": ложный,
"showCommutePromo": ложный,
"showEarlyApply": ложный,
"showJobType": ложный,
"showRelativeDate": правда,
"showSponsoredLabel": ложный,
"showStrongerAppliedLabel": ложный,
"smartFillEnabled": ложный,
"smbD2iEnabled": ложный,
"фрагмент": "...",
"sourceId": 38357,
"спонсируемый": правда,
"taxoAttributes": [],
"taxoAttributesDisplayLimit": 3,
"taxoLogAttributes": [],
"таксономияАтрибуты": [
{
"атрибуты": [
{
"метка": "Гибкий график",
"суид": "WZ9TD"
},
{
"метка": «Реферальная программа»,
"суид": "YDH5H"
}
],
"метка": "динамические-атрибуты"
},
...
],
"thirdPartyApplyUrl": "...",
«Уровень»: {
"совпадающие предпочтения": {
"longMatchedPreferences": [],
"stringMatchedPreferences": []
},
"тип": "ПО УМОЛЧАНИЮ"
},
"заглавие": «Агент ресепшена»,
"translatedAttributes": [],
"translatedCmiJobTags": [],
"truncatedCompany": «Гостиница в Литл-Вашингтоне»,
"срочноНанимаем": ложный,
"viewJobLink": "...",
"vjИзбранныйРаботодательКандидат": ложный,
"workplaceInsights": []
},
...
],
"мета": [
{
"jobCount": 198731,
«Уровень»: 0,
"тип": "ПО УМОЛЧАНИЮ"
},
{
"jobCount": 1371,
«Уровень»: 1,
"тип": "ПО ВСЕЙ СТРАНЕ"
}
]
}

Обработка нумерации страниц

Результаты поиска вакансий Indeed обычно разбиваются на страницы. Чтобы управлять разбиением на страницы и собирать несколько страниц списков вакансий, вы можете изменить параметры URL и отправить дополнительные запросы. Чтобы извлечь несколько страниц, вы можете настроить URL start параметр или извлечение информации о пагинации из HTML.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
Импортировать JSON
Импортировать re
от urllib.parse Импортировать урленкод
от база сканирования Импортировать CrawlingAPI

# Функция для анализа HTML страницы поиска
защиту parse_search_page_html(HTML: ул):
данные = re.findall(r'window.mosaic.providerData\["mosaic-provider-jobcards"\]=(\{.+?\});', HTML)
данные = json.loads(данные[0])
возвращают {
"полученные результаты": данные["метаданные"]["mosaicProviderJobCardsModel"]["полученные результаты"],
"мета": данные["метаданные"]["mosaicProviderJobCardsModel"]["tierSummaries"],
}

# Функция для извлечения списков вакансий
защиту scrape_indeed_search(API, запрос: ул, расположение: ул, макс_результаты: Int = 50):
защиту создать_url_страницы_поиска(смещение):
параметры = {"к": запрос, «Л»: расположение, "фильтр": 0, "Начало": компенсировать}
возвращают f"https://www.indeed.com/jobs?{urlencode(параметры)}"

результаты = []

Распечатать(f"Скрапинг первой страницы поиска: query={запрос}, местоположение={расположение}")
response_first_page = api.get(make_search_page_url(0), {'страна': 'НАС'})

if ответ_первая_страница['status_code'] == 200:
# Извлеченный HTML-контент после декодирования байтовых данных
html_content = ответ_первая_страница['тело'].decode('латинский1')

data_first_page = parse_search_page_html(html_content)
результаты = data_first_page["полученные результаты"]
всего_результатов = сумма(категория["jobCount"] для Каталог in данные_первая_страница["мета"])

if общее_количество_результатов > максимальное_количество_результатов:
всего_результатов = макс_результатов

Распечатать(f"Соскребая оставшиеся {итого_результатов // 10} страницы")

# Соберите URL-адреса других страниц
другие_страницы = [make_search_page_url(смещение) для смещение in ассортимент(10, всего_результатов, 10)]

для URL in другие_страницы:
ответ = api.get(url, {'страна': 'НАС'})
if ответ['status_code'] == 200:
результаты.расширить(анализ_страницы_поиска_html(ответ.текст))

возвращают Результаты

защиту main():
api = CrawlingAPI({токен: 'ВАШ_ТОКЕН_JS_CRAWL'})
search_data = scrape_indeed_search(api, query="Веб-разработчик", местоположение=«Вирджиния»)
Распечатать(json.dumps(search_data, отступ=2))

if __имя__ == "__основной__":
Основной ()

The scrape_indeed_search Функция начинается с создания начального запроса к странице поиска Indeed с использованием предоставленного запроса и местоположения. Затем она проверяет код статуса ответа, чтобы убедиться, что запрос был успешным (код статуса 200). В случае успеха она переходит к анализу данных о списке вакансий из HTML первой страницы.

Для обработки пагинации код вычисляет общее количество доступных списков вакансий для данного запроса и местоположения. Он также определяет, сколько страниц необходимо очистить, чтобы достичь максимального предела результатов, установленного пользователем. Для сбора URL-адресов оставшихся страниц он генерирует список URL-адресов страниц, каждый с инкрементным смещением для извлечения следующего набора результатов.

Затем он начинает Crawling API запрос для каждого из сгенерированных URL-адресов страниц. По мере загрузки каждой страницы ее списки вакансий извлекаются и добавляются в results list. Такой подход гарантирует, что скрипт сможет без проблем обрабатывать пагинацию, извлекая все соответствующие списки вакансий и эффективно управляя извлечением нескольких страниц.

Извлечение данных со страницы вакансии

После того, как у вас есть списки вакансий, вы можете захотеть извлечь больше подробностей, извлекая полные страницы с объявлениями о вакансиях. Результаты поиска вакансий охватывают почти всю информацию о вакансиях, за исключением некоторых деталей, таких как полное описание вакансии. Чтобы извлечь эту недостающую информацию, нам требуется идентификатор вакансии, удобно расположенный в поле jobkey в наших результатах поиска:

1
2
3
{
"jobkey": "6a45faa5d8d817fa"
}

Используя этот jobkey, мы можем отправить запрос на страницу с полными сведениями о работе. Подобно нашему первоначальному поиску, мы можем анализировать встроенные данные вместо структуры HTML:

Эти данные спрятаны в переменной _initialData, и мы можем извлечь их с помощью простого шаблона регулярного выражения. Вот как это можно сделать:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
Импортировать JSON
Импортировать re
от база сканирования Импортировать CrawlingAPI

# Функция для анализа HTML страницы размещения вакансии
защиту анализ_страницы_задания_html(HTML):
данные = re.findall(r"_initialData=(\{.+?\});", HTML)
данные = json.loads(данные[0])
возвращают данные["jobInfoWrapperModel"]["jobInfoModel"]

# Функция для извлечения данных о работе со страниц работ
защиту scrape_indeed_jobs(API, job_keys):
URL-адреса = [f"https://www.indeed.com/m/basecamp/viewjob?viewtype=embedded&jk={job_key}" для job_key in job_keys]
скопировано = []

для URL in URL-адреса:
ответ = api.get(url, {'страна': 'НАС'})
if ответ['status_code'] == 200:
# Извлеченный HTML-контент после декодирования байтовых данных
html_content = ответ['тело'].decode('латинский1')
очистил.append(parse_job_page_html(html_content))

возвращают скобления

# Пример использования
защиту main():
api = CrawlingAPI({токен: 'ВАШ_ТОКЕН_JS_CRAWL'})
job_keys = ["6a45faa5d8d817fa" #, "другой_ключ_работы"
]
job_details = scrape_indeed_jobs(api, job_keys)
Распечатать(json.dumps(job_details, отступ=2))

if __имя__ == "__основной__":
Основной ()

Пример вывода:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
[
{
"appliedStateBannerModel": нуль,
"commuteInfoModel": нуль,
"expiredJobMetadataModel": нуль,
"hideCmpHeader": ложный,
"isSmbD2iEnabled": ложный,
"jobDebugInfoModel": нуль,
"jobDescriptionSectionModel": нуль,
"jobInfoHeaderModel": {
"a11yNewtabIconActive": правда,
"companyImagesModel": {
"ejiBannerAsBackground": ложный,
"enhancedJobDescription": правда,
"избранный работодатель": правда,
"headerImageUrl": "https://d2q79iu7y748jz.cloudfront.net/s/_headerimage/1960x400/54cdc45f26b1795da078ef999c776400",
"логотипAltText": "Логотип TSA (Управление транспортной безопасности)",
"logoImageOverlayLower": правда,
"logoUrl": "https://d2q79iu7y748jz.cloudfront.net/s/_squarelogo/256x256/bfc3ae8c1b80ebe9aeb76708e8b8bf7c",
"showBannerTop": правда,
"showEnhancedJobImp": правда,
"showIconInTitle": ложный
},
"Название компании": «TSA (Управление транспортной безопасности)»,
"Обзор компанииСсылка": "https://www.indeed.com/cmp/TSA-(transportation-Security-Administration)?campaignid=mobvjcmp&from=mobviewjob&tk=1haso8g6sgsqe800&fromjk=6a45faa5d8d817fa",
"companyReviewLink": "https://www.indeed.com/cmp/TSA-(transportation-Security-Administration)/reviews?campaignid=mobvjcmp&cmpratingc=mobviewjob&from=mobviewjob&tk=1haso8g6sgsqe800&fromjk=6a45faa5d8d817fa&jt=Uniformed+Advisor",
"компанияОбзорМодель": {
"Название компании": «TSA (Управление транспортной безопасности)»,
"desktopCompanyLink": "https://www.indeed.com/cmp/TSA-(transportation-Security-Administration)/reviews?campaignid=viewjob&cmpratingc=mobviewjob&from=viewjob&tk=1haso8g6sgsqe800&fromjk=6a45faa5d8d817fa&jt=Uniformed+Advisor",
"mobileCompanyLink": "https://www.indeed.com/cmp/TSA-(transportation-Security-Administration)/reviews?campaignid=mobvjcmp&cmpratingc=mobviewjob&from=mobviewjob&tk=1haso8g6sgsqe800&fromjk=6a45faa5d8d817fa&jt=Uniformed+Advisor",
"navigableContainerModel": {
"contentHtml": нуль,
"hasBorderBottom": правда,
"hasBorderTop": правда,
href: нуль,
"isRTL": ложный
},
"ratingsModel": {
"ariaContent": "3.1 из 5 звезд. Ссылка на 2,866 отзывов о компании (откроется в новой вкладке)",
«Рассчитывать»: 2866,
"countContent": "2,866 отзывов",
"descriptionContent": «Прочитайте, что говорят люди о работе здесь».,
"рейтинг": 3.1,
"showCount": правда,
"showDescription": правда,
"размер": нуль
}
},
"работодательДеятельность": нуль,
"employerResponsiveCardModel": нуль,
"зашифрованныйFccCompanyId": нуль,
"formattedLocation": "Спрингфилд, Вирджиния",
"скрытьРейтинг": ложный,
"isDesktopApplyButtonSticky": ложный,
"isSimpleVjImproveActive": правда,
"isSimplifiedHeader": ложный,
"jobNormTitle": нуль,
"должность": «Советник в форме»,
"Типы заданий": нуль,
"расположение": нуль,
"mobileStickyVjHeaderActive": ложный,
"openCompanyLinksInNewTab": ложный,
"parentCompanyName": «Правительство США»,
"точнаяМодельРасположения": нуль,
"ratingsModel": нуль,
"последнийПоиск": нуль,
"удалённоеРасположение": ложный,
"remoteWorkModel": нуль,
"зарплатаВалюта": нуль,
"salaryMax": нуль,
"зарплатаМин": нуль,
"salaryType": нуль,
"субтитр": «TSA (Управление транспортной безопасности) — Спрингфилд, Вирджиния»,
"tagModels": нуль,
"таксономияАтрибуты": нуль,
"viewJobDisplay": "DESKTOP_EMBEDDED",
"workplaceInsightsModel": нуль
},
"jobMetadataHeaderModel": {
"Тип_задания": ""
},
"jobTagModel": нуль,
"резюмеРезультатОценки": нуль,
"sanitizedJobDescription": " \н \н \н \н \н \н \н Обзор \н Советник в униформе \н Даты открытия и закрытия \н \n 09 — 15\n \н Шкала и класс оплаты \н \n СВ Г\n \н Тип назначения \н \н Зарплата \н \n $2023 до $09 PA\n \н График работы \н \н \н \н \н \н Расположение \н \n Спрингфилд, Вирджиния\n \н \н \н \н \н Обязанности \н Краткое содержание \н \n Обеспечение безопасности путешествий, защита людей - в Управлении транспортной безопасности вы будете служить в условиях высоких ставок, чтобы защищать американский образ жизни. В городах по всей стране вы будете обеспечивать безопасность аэропортов, морских портов, железных дорог, автомагистралей и/или систем общественного транспорта, тем самым защищая транспортную инфраструктуру Америки и обеспечивая свободу передвижения людей и торговли.\n \н \н \н \н \н \н \н \n Номер объявления\n \н \n HQ-ADM-29-2023\n \н \n Контрольный номер\n \н \n78,592.00\n \н \н \н \н \н \н ",
"screenerRequirementsModel": нуль,
"showExpiredHeader": ложный,
"tagModels": нуль,
"viewJobDisplay": "DESKTOP_EMBEDDED"
}
]

Сохранение данных в базе данных SQLite

Для хранения извлеченных данных о вакансиях можно использовать базу данных SQLite. Вот пример кода создания базы данных, таблицы для вакансий и вставки в нее данных.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
Импортировать JSON
Импортировать re
Импортировать sqlite3
от база сканирования Импортировать CrawlingAPI

# Функция для инициализации базы данных SQLite
защиту инициализировать_базу_данных():
conn = sqlite3.подключить('indeed_jobs.db')
курсор = conn.cursor ()
курсор.выполнить('' 'Окно выдачи
СОЗДАТЬ ТАБЛИЦУ, ЕСЛИ НЕ СУЩЕСТВУЕТ вакансии (
job_title ТЕКСТ,
компания ТЕКСТ,
местоположение ТЕКСТ,
job_description ТЕКСТ
)
'' 'Окно выдачи)
конн.коммит()
возвращают конн, курсор

# Функция сохранения сведений о задании в базе данных SQLite
защиту сохранить_в_базу_данных(курсор, работа):
курсор.выполнить('' 'Окно выдачи
ВСТАВИТЬ В вакансии (название_вакансии, компания, местоположение, описание_вакансии)
ЦЕННОСТИ (?, ?, ?, ?)
'' 'Окно выдачи, (работа["должность"], работа["компания"], работа["расположение"], работа["Описание работы"]))
курсор.соединение.коммит()

# Функция для анализа HTML страницы размещения вакансии
защиту анализ_страницы_задания_html(HTML):
данные = re.findall(r"_initialData=(\{.+?\});", HTML)
данные = json.loads(данные[0])
job_info = данные["jobInfoWrapperModel"]["jobInfoModel"]
возвращают {
"должность": job_info["jobInfoHeaderModel"]["должность"],
"компания": job_info["jobInfoHeaderModel"]["Название компании"],
"расположение": job_info["jobInfoHeaderModel"]["formattedLocation"],
"Описание работы": job_info.get("sanitizedJobDescription", "")
}

# Функция для извлечения данных о задании со страниц заданий и сохранения их в базе данных
защиту скребок_и_сохранить(API, job_key, курсор):
URL = f"https://www.indeed.com/m/basecamp/viewjob?viewtype=embedded&jk={job_key}"
ответ = api.get(url, {'страна': 'НАС'})
if ответ['status_code'] == 200:
# Извлеченный HTML-контент после декодирования байтовых данных
html_content = ответ['тело'].decode('латинский1')

# Разбираем HTML
задание = анализ_страницы_задания_html(html_content)

# Сохранение сведений о задании в базе данных
сохранить_в_базу_данных(курсор, задание)

Распечатать(f"Данные о задании сохранены для ключа задания: {job_key}")

# Пример использования
защиту main():
# Инициализируем базу данных
conn, курсор = initialize_database()

api = CrawlingAPI({токен: 'ВАШ_ТОКЕН_JS_CRAWL'})
job_keys = ["6a45faa5d8d817fa", "другой_ключ_работы"]

# Соберите и сохраните данные о задании для каждого ключа задания
задачи = [scrape_and_save(api, job_key, курсор) для job_key in job_keys]

# Закрыть соединение с базой данных
conn.close ()

if __имя__ == "__основной__":
Основной ()

Этот код начинается с инициализации структуры базы данных, создания таблицы с именем «jobs» для хранения информации, такой как должности, названия компаний, местоположения и описания должностей. initialize_database Функция инициализирует базу данных SQLite и возвращает как соединение, так и курсор. save_to_database Функция отвечает за вставку сведений о задании в эту таблицу.

Фактический процесс веб-скрейпинга происходит в scrape_and_save функция, которая принимает ключ вакансии (уникальный идентификатор для каждой вакансии) и курсор SQLite в качестве входных данных. Эта функция создает URL для конкретной вакансии, отправляет HTTP-запрос на веб-сайт Indeed, извлекает HTML-контент страницы вакансии, а затем анализирует его с помощью parse_job_page_html функция. Эти проанализированные данные, включая должность, название компании, местоположение и описание работы, затем сохраняются в базе данных SQLite с помощью save_to_database функции.

The main Функция управляет всем процессом. Она инициализирует соединение с базой данных и Crawling API экземпляр, определяет список ключей заданий для скрапинга и запускает задачи скрапинга и сохранения для каждого ключа задания. После того, как все детали задания были скрапированы и сохранены, соединение с базой данных закрывается.

Выполнив эти подробные шаги, вы сможете создать комплексный парсер вакансий Indeed на Python, который будет собирать списки вакансий, обрабатывать пагинацию, извлекать данные со страниц объявлений о вакансиях и сохранять данные в базе данных SQLite для дальнейшего анализа или использования.

Оптимизируйте свой Indeed Scraper с помощью Python и Crawlbase

Онлайн-платформы находятся на передовой для соискателей работы, предлагая множество возможностей прямо под рукой. Однако эта простота сопряжена с пугающей задачей просеивания океана информации. Веб-скрапинг — это игра-смена для сбора данных, которая меняет наши стратегии поиска работы.

Используя веб-скрапинг, мы можем произвести революцию в том, как мы ищем работу. Он автоматизирует утомительный процесс сбора и сортировки списков вакансий с различных порталов. Вам больше не нужно тратить бесчисленные часы на ручной поиск на разных досках объявлений. С помощью специально разработанных скриптов веб-скрапинга вы можете легко собирать, классифицировать и отображать вакансии, которые соответствуют вашим предпочтениям. Это экономит время и гарантирует, что ни одно потенциальное предложение о работе, каким бы неясным оно ни было, не ускользнет от внимания.

В нашем подробном руководстве описываются возможности веб-скрейпинга с помощью Crawlbase Crawling API, сосредоточившись на его применении для известного сайта по поиску работы Indeed. Независимо от того, ищете ли вы идеальную карьеру или являетесь энтузиастом технологий, стремящимся освоить методы парсинга, это руководство по Python предоставляет инструменты для автоматизации и улучшения вашего поиска работы. Путешествуйте с нами, и мы покажем, как парсинг веб-страниц может упростить и оптимизировать ваш поиск идеальной работы на Indeed.

FAQ

Возможно ли скопировать Indeed?

Вы можете скрейпить объявления о вакансиях с Indeed, но это противоречит их правилам. Indeed пытается остановить скрейпинг и использует такие вещи, как CAPTCHA и ограничения на то, как часто вы можете заходить на их сайт, чтобы предотвратить автоматизированный скрейпинг. Если вы нарушите эти правила, у вас могут возникнуть юридические проблемы или ваш IP-адрес будет заблокирован. Вместо скрейпинга Indeed предлагает API или другие способы получить свои данные для одобренных партнеров, что является более честным способом доступа к тому, что у них есть.

Как извлечь лиды из Indeed?

Если вы решили собирать объявления о вакансиях или потенциальных клиентов с Indeed (хотя это и рискованно), вот основные шаги, которые вам следует предпринять:

  1. Выберите целевые URL-адреса: определите, с каких объявлений о вакансиях или страниц поиска на Indeed вы хотите собирать данные.
  2. Посмотрите, как устроен сайт: используйте инструменты разработчика вашего браузера, чтобы найти HTML-теги, содержащие названия должностей, описания, названия компаний и местоположения. 3. Создайте программу для сбора данных: используйте язык программирования, например Python, с такими инструментами, как BeautifulSoup и Scrapy, чтобы извлечь информацию из этих HTML-тегов.
  3. Разберитесь с CAPTCHA и ограничениями: придумайте способы обойти CAPTCHA и замедлить свои запросы, чтобы сайт вас не заблокировал.
  4. Сохраните информацию: сохраните собранные данные в базе данных или CSV-файле, чтобы можно было работать с ними позже.

Какой скребок лучше всего подходит для работы?

Лучший скрейпер заданий зависит от ваших конкретных потребностей, таких как платформа, на которую вы ориентируетесь, и масштаб сбора данных. Для комплексного и надежного решения, Crawlbase выделяется как один из лучших вариантов для скрапинга рабочих мест.

Crawlbase Crawling API предлагает такие инновационные функции, как:

  1. Универсальные параметры: Crawlbase предоставляет богатый набор параметров, позволяя разработчикам точно настраивать свои запросы API. Такие параметры, как «format», «user_agent», «page_wait» и другие, позволяют настраивать под конкретные потребности сканирования.
  2. Управление форматом ответа: Разработчики могут выбирать между форматами ответов JSON и HTML в зависимости от своих предпочтений и требований к обработке данных. Эта гибкость упрощает извлечение и обработку данных.
  3. Обработка файлов cookie и заголовков: Благодаря возможности извлекать файлы cookie и заголовки с исходного веб-сайта с помощью таких параметров, как «get_cookies» и «get_headers», разработчики могут получить доступ к ценной информации, которая может иметь решающее значение для определенных задач веб-скрапинга.
  4. Динамическая обработка контента: Crawlbase отлично справляется с обработкой динамического контента, что делает его пригодным для сканирования страниц, отображаемых JavaScript. Такие параметры, как «page_wait» и «ajax_wait», позволяют разработчикам гарантировать, что API захватывает полностью отображаемый контент, даже если для его загрузки требуется время или он включает запросы AJAX.
  5. Ротация IP: Crawlbase предлагает возможность ротации IP-адресов, обеспечивая анонимность и снижая риск блокировки веб-сайтами. Эта функция обеспечивает более высокий уровень успеха для задач веб-сканирования.
  6. Параметры геолокации: Разработчики могут указать страну для геолокационных запросов с помощью параметра «country». Это особенно полезно для сценариев, где требуются данные из определенных географических регионов.
  7. Поддержка сети Tor: Для сканирования onion-сайтов через сеть Tor можно включить параметр «tor_network», что повысит конфиденциальность и доступ к контенту в даркнете.
  8. Снимок экрана: API может делать снимки экрана веб-страниц с помощью параметра «снимок экрана», предоставляя визуальный контекст для просканированных данных.
  9. Сбор данных с помощью скреперов: Crawlbase предлагает возможность использовать предопределенные скраперы данных, оптимизируя извлечение определенной информации из веб-страниц. Это упрощает извлечение данных для общих случаев использования.
  10. Асинхронное сканирование: В случаях, когда требуется асинхронное сканирование, API поддерживает параметр «async». Разработчики получают идентификатор запроса (RID) для извлечения просканированных данных из облачного хранилища.
  11. Автопарсинг: Параметр «autoparse» упрощает извлечение данных, возвращая проанализированную информацию в формате JSON, что снижает необходимость в обширной постобработке HTML-контента.