CoderCastrov logo
CoderCastrov
Парсер

CLI Проект? *Вздох* С чего начать!

CLI Проект? *Вздох* С чего начать!
просмотров
6 мин чтение
#Парсер

ЧТО ПЕРВЫМ ШАГОМ?

Продолжая смотреть на мой терминал Windows, я размышляю о времени, которое я потратил на изучение команд "cd" для перехода в папки, проверку "directory" и "delete" файлов, и я начинаю испытывать легкую панику. Затем я вспоминаю, что нужно просто записать свои задачи и разбить их на более мелкие, управляемые "компоненты".

Я начинаю с самого простого шага. Шаг 1: Создать папку для моего проекта с помощью команды "mkdir" в терминале Windows. К счастью, я провел много времени, изучая техники тестирования/разработки на YouTube и в видео Ави, чтобы получить больше ясности.

Следующий шаг - настроить мои файлы пакета. Давайте запустим - bundle gem "name" - чтобы создать стандартный шаблон. Это дает мне возможность просмотреть созданные файлы и получить представление о том, что ожидать при клонировании репозиториев на GitHub. Я благодарю разработчиков, которые сделали кодирование более эффективным для будущих разработчиков.

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

Поехали!!!

НАСТРОЙКА

У каждого класса должна быть одна задача:

  • Run <= Этот файл будет запускать мой файл Cli.rb, который содержит метод Cli.new.call - bin/run

  • Scraper.rb <= В этом файле будет содержаться весь парсинг, который будет реализован на сайте - lib/scraper.rb

  • Cli.rb <= Он отвечает за взаимодействие с пользователем с помощью puts/gets. - lib/Cli.rb

  • Body_Type.rb <= Будет содержать различные типы тела. - lib/Body_Type.rb

  • Environment file <= Содержит все файлы require/require_relative, необходимые для связи файлов и гемов. - lib/environment.rb

  • Module.rb <= Используется для объединения и структурирования моего кода для более чистого впечатления. - lib/module.rb

  • В моем файле run, расположенном в директории bin, я сначала подключаю мой файл environment.rb, необходимый для запуска приложения, затем вызываю объект Cli, набрав "Cli.new.call", чтобы он запускался при выполнении файла. Мой метод "call" содержит необходимые методы для запуска приложения.

  • В моем файле environment я загружаю все связанные файлы, такие как модули, парсер, Nokogiri, pry и другие гемы.

  • В моем файле Cli.rb есть класс Cli, который "включает" модуль BodyType, который я использовал для объединения и перемещения большинства созданных мной методов в модуль BodyType. Мне просто нужно было создать чистое ощущение в приложении.

  • Когда пользователь вводит тип тела, создается новый объект Body_Type, который принимает ввод в качестве имени. Он инициализируется с именем типа тела.

  • У Body_Type есть несколько методов экземпляра, которые будут основаны на имени типа тела. После создания с соответствующим именем он получает этот метод экземпляра, который будет сотрудничать с классом Scraper, создавая новый экземпляр Scraper. Этот класс содержит методы для документа, который требуется парсить.

  • Используя Nokogiri и Open-URI, я могу загрузить URL и изучить элементы страницы, чтобы найти элементы для парсинга, начиная с "@@doc = Nokogiri::HTML(open("https://www.bodybuilding.com/fun/becker3.htm"))"

  • Таким образом, когда пользователь запрашивает информацию/тренировочные методики, URL будет парсить абзацы, связанные с типом тела пользователя. Я создал это как метод класса, чтобы все методы имели доступ к URL. Это помогает с непрерывными вызовами для парсинга веб-сайта.

НЕСКОЛЬКО ТРУДНОСТЕЙ

Мне пришлось найти много разных способов для парсинга нужных абзацев, связанных с веб-сайтом. Мне удалось вспомнить использование диапазона массива для группировки нужных абзацев. О, и здесь я ДОЛЖЕН был стать еще лучше в использовании 'pry', который теперь является большой частью моего отладочного процесса для массивных строк пугающего кода. Если у меня есть 'pry', я не могу проиграть!

((ectomorph_info = puts "#{@@doc.search("#DPG p").children[4..8].text}")) <= "Я ПОНЯЛ"

Вы ищете документ и извлекаете дочерние элементы, которые являются тегами "<p>". Я беру текст с 5-го по 9-й абзацы. Этот метод парсинга использовался на протяжении всего приложения. Как только я смог немного изучить на Stack Overflow, моя нагрузка работы стала все меньше и меньше. Я не понял, сколько кода я выучил, пока мне не пришлось писать код без интернета во время 3,5-часового полета в Коста-Рику и обратно.

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

ИНФОРМАЦИЯ, ПОЛУЧЕННАЯ ЧЕРЕЗ 'PRY'


#(Element:0x43e3c18 { #name = “a”, #attributes = [ #(Attr:0x446b0dc { name = “href”, value = “https://www.bodybuilding.com/content/how-to-gain-weight.html" })], #children = [ #(Text “получение мышечной массы”)] #})

ИСПОЛЬЗОВАНИЕ ENUMERABLE ДЛЯ ПАРСИНГА НЕОБХОДИМОЙ ИНФОРМАЦИИ

def all_links links = @@doc.search(“#DPG p a”) links.each do | link | puts “#{link.children.text.capitalize}:” puts “#{link.attributes[“href”].value}” puts “**__________**__” end end

ЗАГРУЗИТЬ ВСЕ НА GITHUB

Мне удалось создать и инициализировать мой локальный репозиторий Git вместе со всеми остальными предварительными условиями для загрузки моих файлов в мой репозиторий GitHub. Частые коммиты помогают мне отслеживать изменения и помнят процесс перед загрузкой. Все медленно начинает сходиться. Я заканчиваю последние штрихи к своему проекту CLI, чтобы привести свой код в порядок. Этот проект буквально занял всего несколько дней бесконечного кодирования, чтобы усвоить концепции до такой степени, что они начинают объединяться!

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

ОБНОВЛЕНИЕ**

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

Например => def get_ectomorph

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

ОБНОВЛЕНИЕ*** У меня все еще есть небольшие проблемы с настройкой терминала для получения моих SSH-ключей, но это проблема на другой день! Сегодня мне удалось добавить дополнительные функции в свою программу. Я создал условное выражение if/else, которое будет перебирать различные типы тела и проверять, был ли уже спарсен тип тела. Чтобы быть на правильном пути, я продолжаю создавать заметки, которые помогут мне направить создание методов в будущем.

Нет необходимости продолжать парсить информацию, если она уже была спарсена :)


Опубликовано на https://rshield1.github.io_ 3 февраля 2020 года._