Работа с госзакупками: Работа специалистом по госзакупкам в Москве

Специалист по закупкам, работа специалистом по закупкам, вакансии специалист по закупкам в Санкт-Петербурге

Сегодня в 11:04

Специалист отдела закупок

до 50 000 ₽/месяц

Добавить в избранное

ГСР Энерго

Санкт-Петербург

Обработка поручений на закупку. Работа с поставщиками. Организация и проведение тендеров по 223 ФЗ. Работа на площадках ЕИС и ЕЭТП
Умение работать в 1С. Хорошее знание Excel

Смотрят

1

 

человек

Скрыть

Специалист по государственным закупкам

60 000 — 70 000 ₽/месяц

Добавить в избранное

Санкт-Петербургское государственное бюджетное профессиональное образовательное учреждение «Академия реставрации и дизайна»

Санкт-Петербург

Автово

Кировский завод

Закрытие контрактов, размещение отчетов отдельных этапов контрактов. Осуществление закупок по 44-ФЗ. Формирование технического задания для осуществления закупок товаров/работ/услуг

Высшее профессиональное образование (экономическое/юридическое)

Смотрят

3

 

человека

Скрыть

28 апреля

Специалист по государственным закупкам / Специалист по госзакупкам

70 000 — 80 000 ₽/месяц

Добавить в избранное

СПБ ГБУЗ «Городская поликлиника №107»

Санкт-Петербург

Подготовка … осуществлении закупок путем … изделий. Работа в соответствии с Федеральными законами 44-ФЗ, 223-ФЗ. Подготовка…
Высшее образование (юридическое будет преимуществом). Дополнительное…

Смотрят

3

 

человека

Скрыть

Разместите резюме, и мы подберем вам подходящие вакансии

28 апреля

Главный специалист отдела муниципальных закупок

56 700 — 69 900 ₽/месяц

Добавить в избранное

Местная администрация внутригородского муниципального образования города федерального значения Санкт-Петербурга муниципальный округ Гражданка

Санкт-Петербург

Академическая

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

Смотрят

1

 

человек

Скрыть

28 апреля

Инженер по закупкам / специалист по закупкам

до 60 000 ₽/месяц

Добавить в избранное

Индустриальные и Морские Проекты

Санкт-Петербург

14 минутКрестовский остров

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

Смотрят

2

 

человека

Скрыть

Хотите получать новые вакансии первым?

Лучшие вакансии закрываются быстрее остальных. Подпишитесь на новые актуальные вакансии

В Telegram

28 апреля

Специалист отдела размещения информации о закупках

58 000 — 64 000 ₽/месяц

Добавить в избранное

ФГБОУ ВО Санкт-Петербургский государственный университет

Санкт-Петербург

Подготовка … осуществлении закупок, документаций … осуществления закупок в … 223. Взаимодействие с работниками других подразделений по вопросам, связанным с подготовкой документаций и проектов договоров/контрактов
Образование высшее

Смотрят

4

 

человека

Скрыть

28 апреля

Специалист по закупкам

50 000 — 55 000 ₽/месяц

Добавить в избранное

ГБОУ СОШ № 89

Санкт-Петербург

Гражданский Проспект

Осуществление … цикла закупок со … и закупок у ед. поставщика. Участие в приемке исполнения контрактов, размещение информации и документов о приемке / исполнении контрактов, электронное актирование, претензионная работа
Опыт работы в сфере закупок…

Смотрят

1

 

человек

Скрыть

28 апреля

Специалист отдела государственных закупок

55 000 — 65 000 ₽/месяц

Добавить в избранное

Арктический и антарктический НИИ

Санкт-Петербург

Приморская

Работа с закупками у единственного поставщика (согласование, контроль, регистрация). Внесение предложений на закупку в электронный…
Образование: высшее, желательно юридическое. Наличие дополнительного…

Смотрят

2

 

человека

Скрыть

28 апреля

Специалист по закупкам

от 40 000 ₽/месяц

Добавить в избранное

Центр технического творчества Адмиралтейского района Санкт-Петербурга

Санкт-Петербург

Технологический институт 1

Технологический институт 2

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

Высшее профессиональное…

Смотрят

1

 

человек

Скрыть

28 апреля

Специалист по закупкам

75 000 — 80 000 ₽/месяц

Добавить в избранное

Российские железные дороги

Санкт-Петербург

Владимирская

 и ещё 3 станции

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

Смотрят

4

 

человека

Скрыть

28 апреля

Специалист отдела закупок

47 000 ₽/месяц

Добавить в избранное

Российский государственный гидрометеорологический университет

Санкт-Петербург

Разработка … протоколов закупки; формирование … контрактов. Работа в ЕИС, торговыми площадками. Подготовка и размещение ежемесячного…
Высшее образование. Стаж работы по аналогичной деятельности не менее 1 года

Смотрят

4

 

человека

Скрыть

27 апреля

Специалист по закупкам

30 000 — 40 000 ₽/месяц

Добавить в избранное

Санкт-Петербургская детская школа искусств им.

Д. С. Бортнянского

Санкт-Петербург

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

Скрыть

27 апреля

Специалист по закупкам

По договорённости

Добавить в избранное

СПБ ГБУ ЦЕНТР СОДЕЙСТВИЯ СЕМЕЙНОМУ ВОСПИТАНИЮ № 12

Санкт-Петербург

Опыт не нужен

Формирование начальной (максимальной) цены закупки, описание объекта закупки и требований, предъявляемых…
Наличие дополнительного образования в сфере закупок. Знание … сфере закупок товаров, работ, услуг … сфере закупок товаров, работ, услуг

Смотрят

3

 

человека

Скрыть

27 апреля

Специалист по закупкам

до 56 000 ₽/месяц

Добавить в избранное

СПб ГУП «Горэлектротранс»

Санкт-Петербург

Оперативное … договоров поставки, осуществление … номенклатурной поставки ТМЦ
Высшее (техническое или инженерно-экономическое) профессиональное образование. Опыт работы в должности инженера 1 категории не менее 3-х лет

Смотрят

4

 

человека

Скрыть

27 апреля

Специалист по государственным закупкам

от 60 000 ₽/месяц

Добавить в избранное

УМВД России по Калининскому району

Санкт-Петербург

Отклик без резюме

Подготовка, организация и проведение закупок товаров, работ, услуг для обеспечения государственных нужд. Обработка, формирование и хранение данных, информации, документов, в том числе полученные от поставщиков (подрядчиков, исполнителей)

Необходим…

Смотрят

4

 

человека

Скрыть

27 апреля

Специалист по закупкам

от 45 000 ₽/месяц

Добавить в избранное

Санкт-Петербург

15 минутВолковская

11 минутОбводный канал

Подготовка плана закупок и плана-графика закупок на год и их корректировка. Обеспечение … от поставщиков, уровню … т.д
Уверенное знание 44-ФЗ, опыт работы по закупкам в бюджетной сфере от 1 года. Наличие сертификата о повышении квалификации…

Смотрят

4

 

человека

Скрыть

27 апреля

Специалист по государственным закупкам

55 000 ₽/месяц

Добавить в избранное

ГБУК Дом Народного Творчества

Санкт-Петербург

Площадь Ленина

 и ещё 2 станции

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

Скрыть

27 апреля

Специалист по государственным закупкам

от 60 000 ₽/месяц

Добавить в избранное

Детская клиническая больница

Санкт-Петербург

Осуществлять подготовку и размещение в единой информационной системе извещений об осуществлении закупок, проекта контракта, описания объекта закупок и обоснования НМЦК. Работать в системе АЦК-ГЗ Ленинградской области
Наличие высшего образования…

Смотрят

4

 

человека

Скрыть

27 апреля

Специалист по закупкам

от 50 000 ₽/месяц

Добавить в избранное

ГБУЗ ЛО «Сертоловская городская больница»

Санкт-Петербург

Парнас

 и ещё 2 станции

Работа с программой АЦК-Госзаказ. Передача информации по исполнению контрактов в ЕИС (Единая информационная система, актирование)
Знание ФЗ 44. Диплом или удостоверение о повышении квалификации о прохождении обучения по ФЗ 44

Смотрят

1

 

человек

Скрыть

27 апреля

Специалист по закупкам

от 60 000 ₽/месяц

Добавить в избранное

СПБ ГБУ ЦФКС И З КРАСНОСЕЛЬСКОГО РАЙОНА

Санкт-Петербург

Проспект Ветеранов

Ленинский проспект

Претензионная работа, взаимодействие с ФАС. Отчетность. Бюджетирование (создание ПФХД на основе заявок, поступающих от структурных…
Высшее образование. Опыт работы в программе АИСГЗ, в ЕИС, Торговые электронные площадки

Скрыть

27 апреля

Экономист (Специалист по закупкам)

от 47 000 ₽/месяц

Добавить в избранное

СПб ГБУ «КЦСОН Выборгского района»

Санкт-Петербург

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

Смотрят

2

 

человека

Скрыть

26 апреля

Специалист по закупкам

от 25 000 ₽/месяц

Добавить в избранное

ГБДОУ детский сад № 104 Московского района Санкт-Петербурга

Санкт-Петербург

Осуществление … цикла закупок со … и закупок у единственного поставщика. Участие в приемке исполнения контрактов, размещение информации и документов о приемке (исполнение контрактов, актирование, претензионная работа)
Опыт работы в сфере закупок…

Скрыть

26 апреля

Специалист по закупкам

до 40 000 ₽/месяц

Добавить в избранное

Государственное бюджетное общеобразовательное учреждение гимназия № 42

Санкт-Петербург

Осуществление … выполненной работы ее … также отдельных этапов … контрактов. Обработка … товары, работы, услуги; … определению поставщиков подрядчиков, … мониторинга поставщиков подрядчиков, … сфере закупок
Обязательное обучение по ФЗ — 44

Скрыть

Разместите резюме, и мы подберем вам подходящие вакансии

26 апреля

Специалист по государственным закупкам

По договорённости

Добавить в избранное

ФГБУ СЗОНКЦ (ранее Клиническая больница №122)

Санкт-Петербург

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

Скрыть

26 апреля

Специалист по закупкам

от 30 000 ₽/месяц

Добавить в избранное

Санкт-Петербург

Опыт не нужен

Работа в соответствии с 44-ФЗ, работа в АИСГЗ, ЕИС. Подготовка аукционной и конкурсной документации
Удостоверение о повышении квалификации или диплом о профессиональной переподготовке в сфере закупок. Знание норм Федерального…

Смотрят

4

 

человека

Скрыть

26 апреля

Специалист по закупкам

от 70 000 ₽/месяц

Добавить в избранное

ГБУЗ «Санкт-Петербургский клинический научно-практический центр специализированных видов медицинской помощи (онкологический)»

Санкт-Петербург

Подготовка извещения об осуществлении закупки на поставку лекарственных средств. Осуществление закупок лекарственных средств. Работа по 44-ФЗ
ОБЯЗАТЕЛЕН ОПЫТ В ЗАКУПКЕ ЛЕКАРСТВЕННЫХ СРЕДСТВ. Высшее…

Скрыть

26 апреля

Специалист по закупкам

от 60 000 ₽/месяц

Добавить в избранное

СПБ ГБУЗ «Детская городская поликлиника № 17»

Санкт-Петербург

Организует … контракта отдельного этапа … системе. Обеспечивает … графика закупок, при … плана. Осуществляет … товары, работы, услуги. Подготавливает … определения поставщика подрядчика, исполнителя

Скрыть

26 апреля

Специалист по закупкам

30 000 — 35 000 ₽/месяц

Добавить в избранное

СШ «Ленинградец»

Санкт-Петербург

11 минутЧернышевская

Прием и обработка заявок от отделов учреждения. Работа с договорами от заключения до срока окончания. Взаимодействие с подразделениями…
Высшее профессиональное образование. Опыт работы от 3 лет

Смотрят

1

 

человек

Скрыть

26 апреля

Специалист по закупкам

48 000 — 58 000 ₽/месяц

Добавить в избранное

Президентская библиотека им. Б.Н. Ельцина

Санкт-Петербург

Садовая

9 минутАдмиралтейская


Высшее, дополнительное профессиональное образование по программам повышения квалификации или программам профессиональной переподготовки в сфере закупок. Требуемый опыт работы — не менее 4 лет

Смотрят

2

 

человека

Скрыть

26 апреля

Главный специалист отдела закупок СПб ГКУ ГМЦ

от 55 000 ₽/месяц

Добавить в избранное

СПб ГКУ «Городской мониторинговый центр»

Санкт-Петербург

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

Скрыть

26 апреля

Специалист по закупкам

до 60 000 ₽/месяц

Добавить в избранное

Северо-Западный институт повышения квалификации ФНС России

Санкт-Петербург

Московская

Закупка товаров, работ, услуг по 44-ФЗ. Подготовка и размещение документации, проектов контрактов. Работа на торговых площадках…
Опыт работы в аналогичное должности. Высшее образование

Смотрят

2

 

человека

Скрыть

26 апреля

Специалист отдела закупок

60 000 — 70 000 ₽/месяц

Добавить в избранное

Северо-Западный государственный медицинский университет имени И. И. Мечникова

Санкт-Петербург

8 минутЧернышевская

Подготовка … на закупку товаров/ работ /услуг, … товаров, работ, услуг … на закупку товаров/ работ /услуг, … О закупках товаров, работ, услуг … ФЗ. Размещение … выполненной работе или … осуществленная поставка товара, выполненная работа или…

Смотрят

3

 

человека

Скрыть

25 апреля

Специалист по государственным закупкам

от 60 000 ₽/месяц

Добавить в избранное

СПб ГБУ «Центр содействия семейному воспитанию №13»

Санкт-Петербург

15 минутПионерская

 и ещё 2 станции

Организация … на поставку товаров, выполнение работ, оказание … заказчика. Формирование … товаров/ работ /услуг: … сфере закупок). Организация процедур заключения контракта по результатам конкурентных процедур и с единственным поставщиком
Высшее…

Смотрят

2

 

человека

Скрыть

25 апреля

Специалист отдела маркетинга и закупок

40 000 — 50 000 ₽/месяц

Добавить в избранное

Санкт-Петербургский политехнический университет Петра Великого

Санкт-Петербург

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

Скрыть

25 апреля

Специалист по государственным закупкам 44-ФЗ

60 000 — 70 000 ₽/месяц

Добавить в избранное

СПБ ГКУЗ Хоспис № 4

Санкт-Петербург

Академическая

 и ещё 2 станции

Участие в подготовке плана-графика закупок, внесение в него изменений. Исполнение контрактов, в т.ч. работа с реестром документов об исполнении контракта в ЕИС
Высшее образование. Знание норм Федерального закона от 05.04.2013…

Смотрят

2

 

человека

Скрыть

25 апреля

Специалист по закупкам (44 ФЗ)

от 45 000 ₽/месяц

Добавить в избранное

Всеволожская КМБ

7.2

Санкт-Петербург

Обеспечение … выполнения отдельных функций … определению поставщика. Разработка плана закупок и осуществление подготовки изменений для внесения в план закупок. Согласование … заказчиком отдельным видам товаров, работ, услуг … размещение
Свободное…

Смотрят

1

 

человек

Скрыть

25 апреля

Специалист по закупкам

36 000 — 40 000 ₽/месяц

Добавить в избранное

ВО ЖДТ России

Санкт-Петербург

Работа по 223 ФЗ. Работа с документацией. Размещение закупочных процедур и исполнений на ЭТП
Опыт работы на ЭТП. Высшее образование

Смотрят

2

 

человека

Скрыть

25 апреля

Специалист по закупкам

от 35 000 ₽/месяц

Добавить в избранное

Академия цифровых технологий

Санкт-Петербург

14 минутПетроградская

 и ещё 2 станции

Подготавливает … контракта отдельного этапа … контракта. В … графика закупок, при … порядке. Осуществляет … товары, работы, услуги. Подготавливает … единственному поставщику подрядчику, исполнителю
Опыт в сфере закупок от 3 лет

Смотрят

3

 

человека

Скрыть

25 апреля

Специалист по закупкам

от 30 000 ₽/месяц

Добавить в избранное

ГБОУ Лицей №373 Московского района Санкт-Петербурга

Санкт-Петербург

Планирование закупок. Подготовка и проведение определений поставщиков (подрядчиков, исполнителей) конкурентными/неконкурентными способами
Опыт работы в сфере государственных закупок. Знание и применение в своей деятельности Федерального закона…

Смотрят

3

 

человека

Скрыть

25 апреля

Специалист по закупкам

50 000 — 57 500 ₽/месяц

Добавить в избранное

Санкт-Петербургская государственная консерватория имени Н. А. Римского-Корсакова

Санкт-Петербург

Адмиралтейская

 и ещё 2 станции

Осуществление закупок в соответствии с 44-ФЗ. Работа в составе единой комиссии. Направление запросов поставщикам, контроль сроков подготовки и анализ коммерческих предложений
Опыт работы в сфере госзакупок от 1 года

Смотрят

1

 

человек

Скрыть

Попробуйте поискать вакансии по похожим запросам

Специалист по государственным закупкам

Контрактный управляющий

Специалист по тендерам

Ведущий специалист по закупкам

Менеджер по закупкам

44 фз

Специалист по закупкам 44 фз

Снабженец

Закупщик

Начальник отдела закупок

Категорийный менеджер

Менеджер по снабжению

223 фз

Закупки

Специалист по снабжению

Ещё 5 вариантов

123Дальше

туториал со скрепером / Хабр

Недавно пришлось познакомиться тесно с порталами государственных закупок Казахстана и Узбекистана в рамках Школы Данных. Мы (авторка поста, разработчик скрепера и журналисты) исследовали тему «доступной среды» (удобная инфраструктура для людей с инвалидностью) и столкнулись с необходимиостью написать скрепер, которые бы скачивал данные по ключевым словам.

Итоговый текст по нашей задаче тут.

Вот ссылки на источники, с которыми мы работали: 

В Узбекистане публикуются тендеры (и другие формы) и корпоративных заказчиков, и бюджетных заказчиков. Эту информацию можно прочитать в левом верхнем угле страниц. 

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

Перед работой стоит наверняка ознакомиться с законодательством и понять, что и где должно быть. В каждом из этих своих видов свои правила, и наши предметы мы находили только в конкретных категориях. Эта проблемы вылезла боком после того, как мы начали искать и скачивать данные для Узбекистана. Пандусов в “тендерах” не оказалось, их можно было найти в “конкурсах”. К счастью, структура страниц оказалась одинаковой и изменения (в уже написанный скрепер) много времени не заняли.

Код на гитхабе подойдет для поиска любых других госзакупок. Просто сделайте замену ключевых слов. Количетсво тем, с которыми можно работать, необъятное и ограничивается только фантазией. Можно скачать все тендеры, где упоминались закупки по COVID, можно анализировать ремонт дорог, строительство и прочее.

Техническая часть мануала. Разбор кода 

Код на Github

Скрепер для госзакупок Узбекистана и Казахстана

В ходе разработки программы возникло несколько проблем:

У сайта госзакупок Казахстана существует публичное API, но для его использования нужно получить токен у распорядителя реестра. Для этого, нужно было отправить письмо с указанием цели получения доступа. Мы этого не делали. К счастью, у сайта существует внутреннее API в формате GET-запроса с параметрами. Подставляя необходимые параметры, можно эмулировать поиск по ключевому слову и дальше скрепить результаты.

У сайта госзакупок Казахстана оказалась достаточно сложная для скрепинга структура. Так, например, оказалось, что структура страниц отличается в случаях когда лот состоит из одной части и из нескольких. Кроме того, полная информация о лоте показывалась с помощью Javascript при нажатии на лот, что делало эту информацию невозможной к получению при использовании классического подхода скрепинга статических страниц.

У сайта госзакупок Узбекистана публичное API отсутствовало. Но был поиск, работающий по такому же принципу, как и у Казахстана. Однако, в отличии от Казахстана, поиск по ключевым словам не работал. Поэтому здесь пришлось искать все тендеры за максимально разрешённый 90-дневный период, а уже затем отдельно искать среди них искомые запросы.

Скреперы написаны в формате утилит командной строки. Для их использования не требуется знания языков программирования. Код и подробная инструкция по запуска есть в репозитории на Github. Всё, что необходимо — интерпретатор Python версии не ниже 3.6 с установленными модулями из файла requirements.txt. Рекомендуется использовать виртуальное окружение Python во избежания конфликта зависимостей. Установка интерпретатора и модулей может отличаться в зависимости от используемой операционной системы. На Linux это:

python3 -m venv venv
source venv/bin/activate
pip3 install -r requirements.txt

Установив все необходимое, запускаем скрепер. Для Узбекистана это будет выглядеть так:

python3 uzbekistan_scraper.py tender 01.01.2021 31.01.2021

где tender — раздел, по которому ищем. Ещё можем искать по конкурсам – тогда вместо tender пишем competitive. Две даты в формате dd.mm.YYYY – это начало и конец промежутка поиска. Он может быть не больше 90 дней. Если нужно искать в промежутке больше, разделите его на несколько по 90 дней. Кроме того, есть ограничение в 5000 результатов поиска на запрос.

Результатом работы скрепера будет три сущности:

    • purchase_type_date.csv — сводная таблица с общей информацией о закупках. Включает в себя поля номера лота, названия, стоимости лота, региона проведения закупки; 

    • purchase_typedetaileddate.csv — сводная таблица с подробной информацией по каждой закупке;

    • отдельные каталоги для каждой закупки с таблицей с детальной информацией и архивом с тендерными документами. 

Для Казахстана запуск будет выглядеть так:

python3 kazakhstan_scraper.py "доступная среда"

Если поисковый запрос состоит из нескольких слов, возьмите их в кавычки. Поиск будет происходить по словосочетанию. Количество результатов поиска здесь имеет ограничение в 2000 единиц.

Результатом работы скрепера будут три сущности:

    • tenders_query.csv — сводная таблица с основной информацией по искомым тендерам. Включает в себя поля наименований объявления, лота, количество и сумму, способ закупки, её статус;

    • tenders_detailed_query. csv — сводная таблица с детальной информацией по искомым тендерам. Кроме основной информации включает в себя дополнительную характеристику лота, заказчика, цену за единицу и другое; 

    • отдельные каталоги, в каждом из которых находится таблица с информацией по объявлению, аналогичной той, что в сводной таблице.

В файле requirements.txt находится список модулей, необходимых для установки пакетным менеджером pip. Если установка модуля вызывает ошибку, попробуйте удалить версию модуля, скачав таким образом, самую последнюю. Файл log.txt перезаписывается при запуске программы — в него записывается прогресс выполнения. README.md – это документация, аналогичная той, что выше.

Основные переменные находятся в файлах settings.py. Это CSS-селекторы, используемые модулем BeautifulSoup для парсинга HTML-страниц, регулярные выражения для парсинга текста и названия полей в будущих сводных таблицах. Если скрепер перестанет выдавать содержимое той или иной колонки, в первую очередь стоит смотреть именно на используемый селектор. По большому счёту, мелкие изменения редизайна сайта могут быть решены только за счёт исправлений в файле настроек.

Перейдём к непосредственной логике программы, файл kazakhstan_scraper.py. Чтение кода стоит начать с последних двух строк:

if __name__ == '__main__':
	main()

значит, что при запуске скрипта как программы, будет вызвана функция main.

def main(): # объявляем функцию
    urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) #отключаем показ ошибки о проверку сертификатов сайта. Просто чтобы не раздражало.
	logging.basicConfig(level=logging.INFO, format='%(levelname)s:%(message)s', filename='log.txt', filemode='w') #включаем логгирование в сответствующий файл с перезаписью
	if len(sys.argv) != 2:
    	raise ValueError('Usage: python3 kazakhstan_tenders.py [search_word]. If your search query consists of two and more words, take them into quotes.')

 Так как программа задумана как консольная утилита, добавляем базову проверку — если число аргументов включая название программы не равно 2, прерываем выполнение с показом справки по запуску.

search_word = sys.argv[1] #присваем переменной значения введённого посикового запроса
	start_time = time() #активируем таймер чтобы знать, сколько времени заняло выполнение
	print('Start downloading') #выводим сообщение о начале работы
	logging.info('Start downloading') #пишем его в лог
	url_list = get_general_table(search_word) #запускаем первую функцию для получения общей таблицы, её результат записываем
	tenders_info = get_detailed_table(url_list)# запускаем вторую функцию для получения подробных таблиц, её результат записываем
	get_csv_with_tenders_info(tenders_info, search_word)# формируем и сохраняем финальную сводную таблицу
	end_time = time() #останавливаем таймер
	print(f'Download for {search_word} completed in {end_time - start_time:.2f} seconds.') #выводим сообщение об успешно завершённой загрузке за время
	logging.info(f'Download for {search_word} completed in {end_time - start_time:.2f} seconds.') #дублируем эту запись в файл

перейдём теперь к отдельным функциям, но сначала импорты:

import logging  #модуль логирования
import os       #модуль работы с системой
import pandas   #модуль для работы с данными и таблицами
import requests #модуль работы с веб-страницами
import sys      #модуль для работы с аргументами командной строки
import urllib3  #нужен только для отключения записи об ошибке сертификата
from bs4 import BeautifulSoup       #главный модуль для парсинга веб-страниц
from collections import OrderedDict #сортированный словарь, который мы используем для создания двумерного массива.  Обычный словарь в Python расставит колонки в случайном порядке, нам это не подходит.
from datetime import datetime       #модуль работы с датой
from time import time               #модуль таймера
from kazakhstan_settings import *   #загружаем все переменные из файла настроек
 
def get_general_table(search_word): #объявляем функцию
	start_time = time() #таймер
	kazakhstan_entrypoint = f'{ENTRY_POINT}/ru/search/lots?filter%5Bname5D={search_word}&count_record=2000&search' \
                    	    f'=&filter%5Bnumber%5D' \
                        	f'=&filter%5Bnumber_anno%5D=&filter%5Benstru%5D=&filter%5Bcustomer%5D=&filter' \
                        	f'%5Bamount_from%5D=&filter%5Bamount_to%5D=&filter%5Btrade_type%5D=&filter%5Bmonth%5D' \
                        	f'=&filter%5Bplan_number%5D=&filter%5Bend_date_from%5D=&filter%5Bend_date_to%5D=&filter' \
                        	f'%5Bstart_date_to%5D=&filter%5Byear%5D=&filter%5Bitogi_date_from%5D=&filter' \
                        	f'%5Bitogi_date_to%5D=&filter%5Bstart_date_from%5D=&filter%5Bmore%5D=' #формируем адрес поискового запроса, который мы будем совершать, подставляя в словосочетание, которое мы ищем.  Ещё может быть интересен параметр count_record — количество получаемых результатов. 2000 должно хватить в большинстве случаев.
	response = requests.get(kazakhstan_entrypoint, headers=HEADERS, verify=False) #получаем HTML-страницу, подставляя заголовки, чтобы выглядеть как реальный человек и игнорировать проверку сертификата. Казахстанская цензура требует всех устанавливать государственные сертфикаты, блокируемые разработчиками браузеров.
	soup = BeautifulSoup(response.content, 'html.parser') #парсим полученную страницу
	urls_list = [f"{ENTRY_POINT}{url['href']}?tab=lots" for url in soup.select(SELECT_GENERAL_URLS)] #получаем список всех ссылок на лоты
	general_table = list() #создаём список для будущей общей таблицы
	general_table_dict = OrderedDict() #создаём сортированный словарь для будущей общей таблицы
	general_table_dict[LOT_ID] = [soup.select(SELECT_LOT_ID)[idx].get_text().strip() for idx, _ in enumerate(soup.select(SELECT_LOT_ID))] #создаём колонку с название из переменной LOT_ID и содержимым в виде списка значений содержимого селектора.  Тут и дальше стоит отметить, что мы получаем список, а для прохода по списку используем функцию enumerate. Она подходит лучше обычного for в ситуациях, когда нам нужно получать и индекс итерируемого объекта и его значение.
	general_table_dict[ANNOUNCE_NAME] = [soup.select(SELECT_ANNOUNCE_NAME)[idx].get_text().strip() for idx, _ in enumerate(soup.select(SELECT_ANNOUNCE_NAME))] #создаём колонку с название из переменной ANNOUNCE_NAME и содержимым в виде списка значений содержимого селектора
	general_table_dict[LOT_CUSTOMER] = [idx.next_sibling.strip() for idx in soup.find_all(SELECT_LOT_CUSTOMER, text=SELECT_LOT_CUSTOMER_SIBLING)] #в отличии от других колонок, здесь мы не можем получить необходимый текст только селектором, поэтому мы ищем соседний текст, а уже затем получаем соседний ему и нужный нам
	general_table_dict[LOT_NAME] = [soup.select(SELECT_LOT_NAME)[idx].get_text().strip() for idx, _ in enumerate(soup.select(SELECT_LOT_NAME))]
	general_table_dict[LOT_NUMBER] = [soup.select(SELECT_LOT_NUMBER)[idx]. get_text().strip() for idx, _ in enumerate(soup.select(SELECT_LOT_NUMBER))]
	general_table_dict[LOT_PRICE] = [soup.select(SELECT_LOT_PRICE)[idx].get_text().strip().replace(' ', '') for idx, _ in enumerate(soup.select(SELECT_LOT_PRICE))] #здесь, вдобавок к обычным действиям, производим автозамену запятой на ничего
	general_table_dict[LOT_PURCHASE_METHOD] = [soup.select(SELECT_LOT_PURCHASE_METHOD)[idx].get_text().strip() for idx, _ in enumerate(soup.select(SELECT_LOT_PURCHASE_METHOD))]
	general_table_dict[LOT_STATUS] = [soup.select(SELECT_LOT_STATUS)[idx].get_text().strip() for idx, _ in enumerate(soup.select(SELECT_LOT_STATUS))]
	record_general_table(general_table_dict, search_word) #вызываем функцию для сохранения общей таблицы
    general_table.append(pandas.DataFrame(general_table_dict)) #превращаем наш словарь в объект DataFrame и добавляем его в список общей таблицы. Тем самым мы дописываем в неё ещё одну строку со всеми колонками.
	end_time = time() #останавливаем таймер
	print(f'Urls from general table for {search_word} and the table have been downloaded in {end_time - start_time:. 2f} seconds.') # сообщаем о завершенной работе
	logging.info(f'Urls from general table for {search_word} and the table have been downloaded in {end_time - start_time:.2f} seconds.') #и записываем это в файл
	return urls_list# возвращаем список с ссылками на страницы с объявлениями
 
def record_general_table(general_table_dict, search_word): #передаём функции упорядоченный словарь и поисковое словосочетание
	if not os.path.exists(PATH_TO_LOCATION):
    	os.makedirs(PATH_TO_LOCATION) #проверяем, существует ли каталог kazakgstan/, если нет, создаём его
    pandas.DataFrame(general_table_dict).to_csv(PATH_TO_LOCATION + f'tenders_{search_word}.csv') #записываем в него общую таблицу
 
def get_detailed_table(urls_list): #передаём функции список с загружёнными ссылками на объявления
	detailed_table = list()        #создаём список, будущую сводную таблицу
	for url in urls_list:          #будем обходить этот список по ссылке за раз
    	try:                       # здесь мы делаем всё по тому же алгоритму, что и в функции выше
        	start_time = time() старт таймера
        	response = requests. get(url, headers=HEADERS, verify=False)
        	soup = BeautifulSoup(response.content, 'html.parser')
        	detailed_table_dict = OrderedDict()
        	detailed_table_dict[ANNOUNCE_ID] = soup.find_all(SELECT_ANNOUNCE_HEADER)[0]['value']
        	detailed_table_dict[ANNOUNCE_NAME] = soup.find_all(SELECT_ANNOUNCE_HEADER)[1]['value']
            detailed_table_dict[ANNOUNCE_STATUS] = soup.find_all(SELECT_ANNOUNCE_HEADER)[2]['value']
            detailed_table_dict[ANNOUNCE_PUBLICATION_DATE] = soup.find_all(SELECT_ANNOUNCE_HEADER)[3]['value']
        	detailed_table_dict[ANNOUNCE_START_DATE] = soup.find_all(SELECT_ANNOUNCE_HEADER)[4]['value']
            detailed_table_dict[ANNOUNCE_END_DATE] = soup.find_all(SELECT_ANNOUNCE_HEADER)[5]['value']
        	try: #внешний вид страницы может отличаться в зависимости от количества лотов в объявлении. Мы обрабатываем этот случай, делая поиск не по соседнему тексту, а используя селектор.
            	detailed_table_dict[LOT_ID] = soup.find(SELECT_LOT_HEADER,
                                                        text=SELECT_LOT_ID_DETAILED_SIBLING). next_sibling.strip()
            	detailed_table_dict[LOT_NAME] = soup.find(SELECT_LOT_HEADER,
                                                          text=SELECT_LOT_NAME_DETAILED_SIBLING).next_sibling.strip()
                detailed_table_dict[LOT_DESCRIPTION] = soup.find(SELECT_LOT_HEADER,
                                                                 text=SELECT_LOT_DESCRIPTION_SIBLING).next_sibling.strip()
            	detailed_table_dict[LOT_DESCRIPTION_DETAILED] = soup.find(SELECT_LOT_HEADER,
                                                                          text=SELECT_LOT_DESCRIPTION_DETAILED_SIBLING).next_sibling.strip()
        	except AttributeError:
            	detailed_table_dict[LOT_ID] = [soup.select(SELECT_LOT_ID_DETAILED)[idx].get_text().strip() for
                                           	idx, _ in
                                           	enumerate(soup.select(SELECT_LOT_ID_DETAILED))]
            	detailed_table_dict[LOT_NAME] = [soup.select(SELECT_LOT_NAME_DETAILED)[idx]. get_text().strip() for
                                                 idx, _ in
                                                 enumerate(soup.select(SELECT_LOT_NAME_DETAILED))]
      	      detailed_table_dict[LOT_DESCRIPTION] = ''
            	detailed_table_dict[LOT_DESCRIPTION_DETAILED] = ''
        	detailed_table_dict[LOT_CUSTOMER_NAME] = [soup.select(SELECT_LOT_CUSTOMER_NAME)[idx].get_text().strip() for
                                                      idx, _ in
                                                      enumerate(soup.select(SELECT_LOT_CUSTOMER_NAME))]
            detailed_table_dict[LOT_CHARACTERISTICS_FULL] = [
                soup.select(SELECT_LOT_CHARACTERISTICS_FULL)[idx].get_text().strip() for idx, _ in
            	enumerate(soup.select(SELECT_LOT_CHARACTERISTICS_FULL))]
            detailed_table_dict[LOT_PRICE_PER_ONE] = [
                soup.select(SELECT_LOT_PRICE_PER_ONE)[idx].get_text().strip().replace(' ', '') for
            	idx, _ in
            	enumerate(soup. select(SELECT_LOT_PRICE_PER_ONE))]
        	detailed_table_dict[LOT_NUMBER] = [soup.select(SELECT_LOT_NUMBER_DETAILED)[idx].get_text().strip() for
                                           	idx, _ in
                                           	enumerate(soup.select(SELECT_LOT_NUMBER_DETAILED))]
            detailed_table_dict[LOT_MEASUREMENT] = [soup.select(SELECT_LOT_MEASUREMENT)[idx].get_text().strip() for
                                                    idx, _ in
                                                    enumerate(soup.select(SELECT_LOT_MEASUREMENT))]
            detailed_table_dict[LOT_PLANNED_TOTAL] = [
                soup.select(SELECT_LOT_PLANNED_TOTAL)[idx].get_text().strip().replace(' ', '') for
            	idx, _ in
            	enumerate(soup.select(SELECT_LOT_PLANNED_TOTAL))]
            detailed_table_dict[LOT_TOTAL_1_YEAR] = [soup.select(SELECT_LOT_TOTAL_1_YEAR)[idx].get_text().strip() for
                                                     idx, _ in
                     	                            enumerate(soup. select(SELECT_LOT_TOTAL_1_YEAR))]
            detailed_table_dict[LOT_TOTAL_2_YEAR] = [soup.select(SELECT_LOT_TOTAL_2_YEAR)[idx].get_text().strip() for
                                                     idx, _ in
                                                     enumerate(soup.select(SELECT_LOT_TOTAL_2_YEAR))]
            detailed_table_dict[LOT_TOTAL_3_YEAR] = [soup.select(SELECT_LOT_TOTAL_3_YEAR)[idx].get_text().strip() for
                              	                   idx, _ in
                                                     enumerate(soup.select(SELECT_LOT_TOTAL_3_YEAR))]
        	detailed_table_dict[LOT_STATUS] = [soup.select(SELECT_LOT_STATUS_DETAILED)[idx].get_text().strip() for
      	                                     idx, _ in
                                           	enumerate(soup.select(SELECT_LOT_STATUS_DETAILED))]
            record_detailed_table(detailed_table_dict, detailed_table_dict[ANNOUNCE_ID]) #записываем подробную таблицу для каждого объявления
            detailed_table. append(pandas.DataFrame(detailed_table_dict)) #превращаем наш словарь в объект DataFrame и добавляем его в список общей таблицы. Тем самым мы дописываем в неё ещё одну строку со всеми колонками.
	        end_time = time() # конец таймера
        	print(f'Lot {detailed_table_dict[ANNOUNCE_ID]} info has been downloaded in {end_time - start_time:.2f} seconds.')# выводим за сколько секунд была загружена информация об объявлении
        	logging.info(
            	f'Lot {detailed_table_dict[ANNOUNCE_ID]} info has been downloaded in {end_time - start_time:.2f} seconds.')  # дублируем её в файл
    	except IndexError: обрабатываем ошибку когда ссылка на объявление есть, а такой страницы нету
        	print('Page is not found. Probably, it wad deleted.')         #выводим сообщение об ошибке
        	logging.error('Page is not found. Probably, it was deleted.') #пишем в лог
        	continue #переходим к следующей ссылке
	return detailed_table
 

В скрепере для Узбекистана логика работы такая же, за исключением нескольких моментов:

def main():
	if len(sys. argv) != 4:# здесь мы проверяем наличие уже четырёх аргументов
    	raise ValueError('Usage: python3 uzbekistan_scraper.py [tender|competitive] [start_date] [end_date]')
purchase_type = verify_purchase_type(sys.argv[1]) #для Узбекистана мы можем искать по конкурсам или по тендерам. Здесь мы проверяем, какой вариант был задан.
start_date = sys.argv[2] #присваеваем первую временную границу
end_date = sys.argv[3]# присваиваем вторую временную границу
verify_date(start_date, end_date) #проверяем, что промежуток между первой и второй датами не превышает 90 дней
 
def verify_purchase_type(purchase_type):
	if purchase_type == 'tender': #если при запуске ввели это значение, то
    	purchase_type = 'tender2' #подставляем в будущий запрос это
	elif purchase_type == 'competitive':# если такое, то это
    	pass
	else:# иначе выдаём ошибку
    	logging.error('Purchase type can be only tender or competitive.')
    	raise ValueError('Purchase type can be only tender or competitive.')
	return purchase_type
 
def verify_date(start_date, end_date):
	start_date = datetime. strptime(start_date, '%d.%m.%Y') #превращаем строку с датой в специальный формат
	end_date = datetime.strptime(end_date, '%d.%m.%Y')
	if abs((end_date - start_date).days) > 90: #сравниваем их и выдаём ошибку, если промежуток составляет больше 90 дней
    	logging.error("Difference between dates shouldn't be more than 90 days.")
    	raise ValueError("Difference between dates shouldn't be more than 90 days.")

Дальше отличия заключаются только в названиях полей и селекторах, за исключением сохранения архива с тендерной документацией.

def record_detailed_table(detailed_table_dict, lot_id, lot_documents_url):
	lot_location = f'{PATH_TO_LOCATION}/{lot_id}/'
	if not os.path.exists(lot_location):
    	os.makedirs(lot_location)
	pandas.DataFrame(detailed_table_dict).to_csv(lot_location + lot_id + '.csv')
	response = requests.get(lot_documents_url, headers=HEADERS, verify=False) #кроме того, что мы сохраняем таблицу, мы ещё сохраняем архив с документацией
	try:
    	with open(f"{lot_location}{lot_id}. {lot_documents_url.split('.')[-1]}", 'wb') as f: #название архива на сайте было сгенерировано автоматически, мы переназываем его соответственно к номеру закупки
        	f.write(response.content)
	except FileNotFoundError:# если архива на странице нету, выдаём об этом предупреждение и продолжаем
    	logging.error("Archive with purchase documentation hasn't been found on the page.")
    	return
 
uzbekistan_entrypoint = f'{ENTRY_POINT}/ru/ajax/filter?LotID=&PriceMin=&PriceMax=&RegionID=&TypeID=&DistrictID=&INN=&CategoryID=&EndDate={end_date}&PageSize=5000&Src=AllMarkets&PageIndex=1&Type={purchase_type}&Tnved=&StartDate={start_date}' поисковый запрос тоже, конечно, будет другим. Здесь мы подставляем две даты, тип раздела, по которому ищем. Интерес может представлять параметр PageSize. На сайте максимальное количество результатов 2000, в запросе можно подставить любое число. 5000 должно быть достаточно, учитывая временное ограничение в 90 дней.  Чем больше результатов, тем больше времени нужно на обработку запроса, учитываю загрузку тяжёлых документов. Кроме того, архивы с документами могут занимать много места на диске.

Если какой-то функционал не работает или нужно добавить что-то новое, пишите в Issues проекта на Github.

Почему государственные закупки? – Jobs to Move America

Соединенные Штаты балансируют на краю обрыва.

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

Чтобы решить эти проблемы с блокировкой, нам нужно сначала понять, как мы сюда попали. И эрозия движения промышленных рабочих — одна из важнейших, но часто упускаемая из виду часть истории.

Как мы сюда попали?

За последние полвека фабрики, которые были основой нового среднего класса в послевоенный период, начали закрываться и переезжать в низкооплачиваемые районы, оставляя за собой безработицу и нищету. К 1990-м годам производственные цепочки поставок в США стали настолько глобальными, что эксперты по всему миру провозгласили силу американских промышленных рабочих «умирающей» или «мертвой».

По мере того, как рабочие места на производстве становились все более ненадежными и низкооплачиваемыми, иммигранты и чернокожие рабочие из Миссисипи в Калифорнию начали объединяться, чтобы иметь право голоса на рабочем месте, но столкнулись с репрессиями и угрозами, что фабрики закроются и переедут в другое место. В результате заработная плата и условия труда в производственном секторе США резко упали. Когда-то являвшийся источником стабильной семейной карьеры с низкими образовательными барьерами для входа, производственный сектор США стал крупнейшим пользователем временной рабочей силы в стране: 36% всех временных работников заняты на производстве и в промышленности без какой-либо защиты на рабочем месте. .

Какое отношение восстановление власти промышленных рабочих имеет к построению справедливой экономики и более здоровых сообществ?

Много.

Прямо сейчас примерно 20% всех промышленных товаров в США закупаются нашими правительствами и государственными учреждениями. Каждый год федеральные, государственные и местные органы власти тратят почти 2 триллиона долларов из наших государственных долларов на покупку промышленного оборудования — всего, от школьных автобусов до поездов и мусоровозов. Это государственные закупки, и они подпитывают огромную часть нашей экономики.

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

Так быть не должно.

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

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

Это видение — то, что заставляет нас двигаться вперед в Jobs to Move America. Вот как это выглядело бы, если бы наши общественные блага были наибольшим общественным благом.

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

Исследования показывают, что 2 триллиона долларов, которые мы ежегодно тратим на государственные закупки, могли бы создать до 20 миллионов хороших рабочих мест, если бы города и штаты приняли нашу модель «общественных благ для самого общественного блага».

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

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

Узнайте больше о работе, которую мы делаем, чтобы это произошло.

2000+ вакансий в области государственных закупок в США (143 новых)

Перейти к основному содержанию

  • За последние 24 часа (143)

    Прошлая неделя (640)

    Прошлый месяц (2 129)

    В любое время (2545)

  • Командование морских систем ВМС (NAVSEA) (12)

    Штат Колорадо (10)

    ТехАрмия, ООО (2)

    Федеральные организации защитников (2)

    Биогенсис (2)

  • 40 000 долларов США+ (635)

    60 000 долларов США+ (594)

    $80 000+ (531)

    100 000 долларов США+ (465)

    $120 000+ (412)

  • Нью-Йорк, штат Нью-Йорк (114)

    Денвер, Колорадо (46)

    Сан-Антонио, Техас (21)

    Дальгрен, Вирджиния (4)

    Голливуд, Флорида (3)

  • Полный рабочий день (2196)

    Неполный рабочий день (52)

    Контракт (215)

    Временный (7)

    Волонтер (3)

  • Стажировка (8)

    Начальный уровень (617)

    Ассоциированный (195)

    Средний-старший уровень (1348)

    Директор (127)

  • На месте (1990)

    Гибрид (391)

    Удаленный (98)

Получайте уведомления о новых вакансиях Public Procurement в United States .

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *