Научиться парсингу — с чего начать?
1) Нужно иметь представление, как загружаются и работают сайты. Тут необходимо иметь представление и о том, что полезный контент может появится на сайте и после загрузки через определенное время. 
2) Нужно иметь представление, как работает самый обычный способ получения контента - Curl. Попробуйте скопировать что то, поработать, представить в xml документ и тд. Тут вы определитесь с принципом работы парсера. 
 - парсер получает вводую информацию -> с учетом программы и вводных данных, парсер запрашивает определенные данные ->  парсер обрабатывает данные для пользователя -> при необходимости, парсер повторяет запрос (инициированный пользователем или рекурсий) -> конец
3) Далее вы дойдете до механизмов защиты от парсинга:
- ограничение запросов на 1 ip, на один клиент и тд
- подгузка информации после загрузки контента 
- дополнительный запрос на подгрузку контента с CSRF и другими способами
- блокирование ip 
Это откроет вам парсеры типа PhantomJs,  Научит пользоваться прокси, мимикрировать под популярные браузеры и тд. 
Так же вы дойдете до многопоточности работы парсера, и подумаете о переходе на C и подобный язык программирования. Общаясь с сайтом уже посредством api. 
А дальше, сталкиваяь с новыми проблемами, будете их решать.
(2) теоретически парсинг _любых_ текстовых форматов в самом общем смысле можно делать связкой flex/bison/C++:
1) прописывая регулярки для элементов языка входных данных (строки, числа, тэги,...), затем
2) на bison описываете грамматику входного языка (вложенные тэги, правила расстановки атрибутов, вложенные скобочные выражения и т.п.),
flex/bison генерит пару сишных/С++ файлов, выполняющих всю грязную работу по синтаксическому разбору формата, дергая для каждого определенного элемента _ваш_ кусок сишного кода. Что потом делать с этими данными (пихать с СУБД, генерировать AST для компилятора, просто вычленять нужные единичные данные,..) описываете сами на С++.
У этого подхода соотношение низкоуровневость*гемор/универсальность стремиться к бесконечности, но по мере наработки библиотеки С++ кода для ваших узких задач для каждой N+1 задачи все сводится к генерации типовых высокоуровневых объектов (символов, списков, деревьев и т.п.), и пары десятков строк кода именно для этой задачи.