Программируем специфику парсера на Python
Принцип программирования парсера/скрапера для разных сайтов в целом подразумевает создание статической неизменяемой части для обхода страниц со ссылками и специфических модулей, которые для каждого сайта собирают информацию из нужных тегов и управляют формированием адреса новой страницы.
Например, для рассматриваемых сайтов с объявлениями о продаже товаров либо итогами прошедших соревнований (см. подробнее здесь) одним из этапов является формирование нового url после прохождения по записям предыдущего. При этом, если для такого сайта, как Avito достаточно задать программе один раз адрес, а затем менять параметр 'p', регулирующий перебор страниц, то, например, для спортивных мероприятий это может представлять больше трудностей (на скриншоте ниже пример запроса для получения списка продаваемой недвижимости на Avito):
Например, для парсинга деталей проведенных организацией по смешанным единоборствам UFC поединков, нам потребуется сначала перейти на страницу со ссылками на события, затем на конкретный турнир/событие и только после на поединок. На скриншотах ниже мы перемещаемся с первого турнира на третьей странице (параметр 'page') к конкретному списку схваток:
В этом случае, чтобы не нарушать неизменную часть парсера, можно немного абстрагироваться и представить страницу для программы как объект, получаемый из текущей страницы UFC, ссылок на все заданные на ней турниры и значения текущего счетчика. Специфическая часть парсера для UFC поединков сама позаботиться о том, чтобы передавать по очереди ссылки на все турниры на заданной странице, затем по достижении последней перейти на следующую и передать ссылку на первый турнир.
Ниже привожу программную реализацию части класса UFCFightsParser - конструктора и метод get_next_url, получающий следующий адрес.
Некоторые используемые в UFCFightsParser методы реализованы в базовом классе ItemsParser (например, get_items_list_from2tags, подробнее здесь).