Як я автоматизував пошук роботи, створивши веб-сканер з нуля

Історія про те, як це почалося

Була північ у п’ятницю, мої друзі гарно проводили час, і все ж я був прибитий до екрану комп’ютера, набираючи текст.

Як не дивно, я не відчував себе осторонь.

Я працював над чимось, що, на мій погляд, було справді цікавим та чудовим.

Я відразу закінчив коледж, і мені потрібна була робота. Коли я виїжджав до Сіетла, у мене був рюкзак, повний підручників коледжу та трохи одягу. Я міг помістити все, чим я володів, у багажнику мого Honda Civic 2002 року випуску.

Тоді я не любив багато спілкуватися, тому вирішив вирішити цю проблему пошуку роботи найкращим чином, як я знав. Я намагався створити програму, яка зробить це для мене, і ця стаття розповідає про те, як я це зробив. ?

Початок роботи з Craigslist

Я сидів у своїй кімнаті, люто розробляючи програмне забезпечення, яке допоможе мені зібрати та відповісти людям, які шукали програмних інженерів у Craigslist. Craigslist - це, по суті, ринок Інтернету, куди ви можете зайти і знайти речі для продажу, послуги, публікації в спільноті тощо.

На той момент я ніколи не створював повноцінного додатка. Більшість речей, над якими я працював у коледжі, - це академічні проекти, які передбачали побудову та синтаксичний аналіз двійкових дерев, комп’ютерну графіку та прості моделі обробки мови.

Я був цілком “новаком”.

Тим не менш, я завжди чув про цю нову «гарячу» мову програмування під назвою Python. Я мало знав Python, але хотів забруднити руки та дізнатись більше про це.

Тож я склав два і два разом і вирішив створити невеликий додаток, використовуючи цю нову мову програмування.

Подорож до побудови (робочого) прототипу

У мене був вживаний ноутбук BenQ, який мені подарував мій брат, коли я поїхав до коледжу, і використовував його для розвитку.

Це не найкраще середовище для розвитку, за будь-яким показником. Я використовував Python 2.4 і старішу версію тексту Sublime, проте процес написання програми з нуля був справді захоплюючим досвідом.

Я ще не знав, що мені потрібно робити. Я пробував різні речі, щоб побачити, що застрягло, і моїм першим підходом було з’ясувати, як я легко отримую доступ до даних Craigslist.

Я шукав Craigslist, щоб з’ясувати, чи є у них загальнодоступний REST API. На моє розчарування, вони цього не зробили.

Однак я знайшов наступне найкраще.

Craigslist мав стрічку RSS, яка була загальнодоступною для особистого користування. Потік RSS - це, по суті, зручний для читання комп’ютером звіт про оновлення, які розсилає веб-сайт. У цьому випадку стрічка RSS дозволить мені підбирати нові списки вакансій, коли б вони були опубліковані. Це було ідеально для моїх потреб.

Далі мені потрібен був спосіб прочитати ці RSS-канали. Я не хотів сам переглядати RSS-канали вручну, тому що це могло б зменшитись у часі, і це нічим не відрізнялося б від перегляду Craigslist.

Приблизно в цей час я почав усвідомлювати силу Google. Ходить жарт, що розробники програмного забезпечення проводять більшу частину свого часу, шукаючи відповіді. Я думаю, що в цьому точно є якась правда.

Трохи погугливши, я знайшов цю корисну публікацію на StackOverflow, де описано, як шукати в RSS-каналі Craiglist. Це була якась функція фільтрації, яку Craigslist надав безкоштовно. Мені потрібно було лише передати певний параметр запиту із ключовим словом, яке мене зацікавило.

Я був зосереджений на пошуку роботи, пов’язаної з програмним забезпеченням, у Сіетлі. З цим я набрав цю конкретну URL-адресу, щоб шукати списки в Сіетлі, що містять ключове слово «програмне забезпечення».

//seattle.craigslist.org/search/sss?format=rss&query=software

І вуаля! Це працювало красиво .

Найкрасивіший суп, який я коли-небудь пробував

Однак я не був переконаний, що мій підхід спрацює.

По-перше, кількість списків була обмежена . Мої дані не містили всіх доступних оголошень про роботу в Сіетлі. Повернуті результати були лише підмножиною цілого. Я прагнув зробити якомога ширшу мережу, тому мені потрібно було знати всі доступні списки вакансій.

По-друге, я зрозумів, що стрічка RSS не містить жодної контактної інформації . Це було облом. Я міг знайти списки, але я не міг зв’язатись із плакатами, якщо не прокрутив ці списки вручну.

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

Це був тупик. Але це було не кінець.

Безперервна ітерація

З моєї першої невдалої спроби я дізнався, що Craigslist мав RSS-канал, який я міг відфільтрувати, і кожна публікація мала посилання на власне розміщення.

Ну, якби я міг отримати доступ до фактичного розміщення, то, можливо, я міг би зішкребти з нього електронну адресу? ? Це означало, що мені потрібно було знайти спосіб отримати адреси електронної пошти з оригінальних публікацій.

Ще раз я підібрав довірену компанію Google і шукав "способи синтаксичного аналізу веб-сайту".

Трохи погугливши, я знайшов класний маленький інструмент Python під назвою «Красивий суп». По суті, це чудовий інструмент, який дозволяє аналізувати ціле Дерево DOM і допомагає зрозуміти структуру веб-сторінки.

Мої потреби були простими: мені потрібен був простий у використанні інструмент, який дозволив би мені збирати дані з веб-сторінки. BeautifulSoup позначив обидва поля, і замість того, щоб витрачати більше часу на вибір найкращого інструменту , я вибрав інструмент, який працював і рухався далі. Ось список альтернатив, які роблять щось подібне.

Примітка: Я знайшов цей приголомшливий підручник, який розповідає про те, як скребувати веб-сайти за допомогою Python та BeautifulSoup. Якщо вам цікаво навчитися вишкрібати, я рекомендую прочитати це.

За допомогою цього нового інструменту мій робочий процес був налаштований.

Тепер я був готовий вирішити наступне завдання: викреслювати адреси електронної пошти з фактичних публікацій.

Ось крута річ щодо технологій з відкритим кодом. Вони безкоштовні і чудово працюють! Це як отримати безкоштовне морозиво в спекотний літній день і свіжоспечене печиво з шоколадною стружкою.

BeautifulSoup дозволяє шукати певні HTML-теги або маркери на веб-сторінці. І Craigslist структурував їхні списки таким чином, що було дуже просто знайти адреси електронної пошти. Тег був щось на зразок "посилання на електронну пошту-відповідь", що в основному вказує на те, що доступне посилання на електронну пошту.

Відтоді все було легко. Я покладався на вбудовану функціональність, яку надає BeautifulSoup, і лише за допомогою деяких простих маніпуляцій мені вдалося досить легко вибрати адреси електронної пошти з постів Craigslist.

Складаючи речі

Протягом години або близько того, я провів перший MVP. Я побудував веб-скрепер, який міг збирати адреси електронної пошти та відповідати людям, які шукають програмних інженерів у радіусі 100 миль від Сіетла.

Я додав різні доповнення поверх оригінального сценарію, щоб значно полегшити життя. Наприклад, я зберег результати на сторінці CSV та HTML, щоб швидко їх проаналізувати.

Звичайно, бракувало багатьох інших помітних функцій, таких як:

  • можливість реєстрації електронних адрес, які я надіслав
  • правила втоми, щоб запобігти надмірному надсиланню електронних листів людям, з якими я вже звертався
  • особливі випадки, такі як деякі електронні листи, що вимагають Captcha перед тим, як вони відображатимуться для стримування автоматизованих ботів (якими я був)
  • Craigslist не дозволяв скрепери на своїй платформі, тому мені заборонять, якщо я запускаю сценарій занадто часто. (Я намагався переключатися між різними VPN, щоб спробувати "обдурити" Craigslist, але це не спрацювало), і
  • Я все ще не міг отримати всі публікації на Craigslist

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

Весь досвід був схожий на гру в тетріс. Я знав, якою є моя кінцева мета, і моїм справжнім завданням було зібрати потрібні шматки для досягнення цієї конкретної кінцевої мети. Кожен фрагмент головоломки привів мене в іншу подорож. Це було складно, але тим не менше приємно, і я дізнавався щось нове на кожному кроці.

Вивчені уроки

Це було вражаюче враження, і я в підсумку дізнався трохи більше про те, як працює Інтернет (і Craigslist), як різні різні інструменти можуть працювати разом, щоб вирішити проблему, а також у мене є крута маленька історія, якою я можу поділитися з нею друзі.

Певним чином, це дуже схоже на те, як сьогодні працюють технології. Ви знаходите велику, волохату проблему, яку вам потрібно вирішити, і не бачите жодного негайного, очевидного рішення її. Ви розбиваєте велику проблему з волохатими на кілька різних керованих шматків, а потім вирішуєте їх по одному шматку за раз.

Озираючись назад, моя проблема полягала в наступному: як я можу використовувати цей приголомшливий каталог в Інтернеті, щоб швидко зв’язатися з людьми, що цікавляться певними інтересами ? На той час мені не було відомих продуктів чи рішень, тому я розбив їх на кілька частин:

  1. Знайдіть усі списки на платформі
  2. Зберіть контактну інформацію щодо кожного списку
  3. Надішліть їм електронний лист, якщо контактна інформація існує

Це все було. Технологія лише діяла як засіб для досягнення цілі . Якби я міг використати електронну таблицю Excel, щоб зробити це за мене, я б замість цього скористався. Однак я не гуру Excel, і тому я пішов із таким підходом, який для мене на той час мав найбільший сенс.

Області вдосконалення

Було багато напрямків, у яких я міг би вдосконалитися:

  • Для початку я вибрав мову, з якою я був не дуже знайомий, і спочатку була крива навчання. Це було не надто жахливо, адже Python дуже легко підібрати. Я настійно рекомендую будь-яким початківцям любителям програмного забезпечення використовувати цю мову як першу мову.
  • Надто покладаючись на технології з відкритим кодом. Програмне забезпечення з відкритим кодом також має свої власні проблеми . Було кілька бібліотек, якими я вже не активно займався, тому я рано стикався з проблемами. Я не міг імпортувати бібліотеку, інакше бібліотека зазнала б невдачі з, здавалося б, нешкідливих причин.
  • Самостійне вирішення проекту може бути цікавим, але також може спричинити багато стресу . Вам знадобиться великий імпульс, щоб щось відправити. Цей проект був швидким і простим, але мені довелося зайняти кілька вихідних, щоб додати вдосконалення. З продовженням проекту я почав втрачати мотивацію та імпульс. Знайшовши роботу, я повністю відмовився від проекту.

Ресурси та інструменти, якими я користувався

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

DailyCodingProblem: це послуга, яка щодня надсилає проблеми з кодуванням на вашу електронну пошту та містить деякі найновіші проблеми програмування від найвищих технічних компаній. Використовуйте мій купонний код, zhiachong, щоб отримати знижку в 10 доларів!

BeautifulSoup - чудовий утилітний інструмент, який я використовував для створення веб-сканера

Веб-скрапінг за допомогою Python - корисний посібник для вивчення того, як працює веб-скрапінг за допомогою Python.

Lean Startup - Я дізнався про швидке створення прототипів та створення MVP для перевірки ідеї з цієї книги. Я думаю, що ідеї тут застосовні у багатьох різних сферах, а також допомогли мені завершити проект.

Evernote - Я використовував Evernote, щоб скласти свої думки для цього допису. Дуже рекомендую - я використовую це в основному для всього, що я роблю.

Мій ноутбук - це мій поточний домашній ноутбук, створений як робоча станція. Працювати набагато, набагато простіше, ніж із старим ноутбуком BenQ, але обидва вони працювали б лише для загального програмування.

Кредити:

Брендону О'браєну, моєму наставнику та доброму другу, за читання коректури та надання цінних відгуків про те, як покращити цю статтю.

Леон Тагер, мій колега по роботі та друг, який викладає та обдаровує мене необхідною фінансовою мудрістю.

Ви можете підписатись на новини галузі, випадкові лакомічки та бути першим, хто дізнається, коли я публікую нові статті, зареєструвавшись тут.

Zhia Chong - інженер-програміст у Twitter. Він працює в команді з вимірювання реклами в Сіетлі, вимірюючи вплив реклами та рентабельність інвестицій для рекламодавців. Команда наймає !

Ви можете знайти його в Twitter та LinkedIn .