Футболом начал заниматься в 9 лет в колпинской ДЮСШ «Ижорец». С 8 класса занимался футболом в училище олимпийского резерва № 1 Санкт-Петербурга. После 11 классов и 3 курсов училища поступил в Университет имени Лесгафта на заочное обучение. В 2010 году защитил диплом по специализации «Футбол».
В 2000 году в возрасте 17 лет попал в «Зенит-2», тренером которого был Лев Бурчалкин. Летом 2001 года стал привлекаться к основному составу команды. Первый матч за «Зенит» провёл 14 апреля 2001 года, выйдя на замену Александру Кержакову в матче против воронежского «Факела». Всего в дебютном сезоне в «Зените» Астафьев вышел на поле в 9 играх чемпионата России, в которых отметился 3 забитыми голами и помог команде завоевать бронзовые медали. В 2002 году вышел на поле в 12 матчах Премьер-лиги и забил 2 гола. В 2003 году стал реже попадать в состав команды, проведя лишь 4 матча в сезоне, в котором команде из Санкт-Петербурга удалось завоевать серебряные медали чемпионата. В основном же выступал в турнире дублёров РФПЛ'.
Летом 2004 года не имеющий игровой практики в «Зените» футболист перешёл в футбольный клуб «Луч-Энергия», выступавший в первом дивизионе. В 2005 году помог команде из Владивостока стать победителем турнира и выйти в Премьер-лигу. В 2006—2007 годах провёл за «Луч» 38 матчей в Премьер-лиге.
В январе 2008 года перешёл в «Ростов», в 2007 году проследовавший из Премьер-лиги в первый дивизион. В 2008 году Астафьев вместе с командой вернулся в элитный дивизион, став победителем первого дивизиона, а в 2009 году помог ростовчанам закрепиться в Премьер-лиге.
В 2010 году перебрался в стан дебютанта Премьер-лиги новосибирской «Сибири», вышедшей в финал Кубка России и пробившейся в Лигу Европы УЕФА. Сыграл в квалификации Лиги Европы 4 полных матча (против кипрского «Аполлона» и нидерландского ПСВ). По итогам сезона-2010 «Сибирь» вылетела из Премьер-лиги, а сам Астафьев сыграл в 24 матчах чемпионата России, в которых забил 3 гола. В сезоне-2011/12, выступая в составе команды из Новосибирска в первом дивизионе, отметился 16 голами в 46 матчах. Первую половину сезона-2012/13 также провёл в «Сибири», а 21 декабря 2012 года на полгода был арендован екатеринбургским «Уралом», с которым вышел в третий раз в карьере стал победителем первого дивизиона. При этом за клуб из Екатеринбурга Астафьев сыграл лишь в трёх играх, большую часть срока аренды пропустив из травмы.
Перед началом сезона 2013/14 отправился на просмотр в стан другой команды, завоевавшей по итогам сезона 2012/13 право выступать в элите российского футбола — «Томи», по итогам которого заключил однолетний контракт с клубом. Дебютировал в составе томской команды в 1-м туре чемпионата России 2013/14 в игре против «Амкара». Первый гол за «Томь» забил 30 октября 2013 года в матче 1/16 Кубка России против «Газовика». В 2014 году выступал за команду «Сибирь». 27 декабря 2014 подписал 1,5-летний контракт с ФК «Тосно». Перед сезоном 2016/17 перешёл в «Мордовию». В феврале 2017 был отдан в аренду до конца сезона в «СКА-Хабаровск». В августе 2018 подписал контракт с новообразованным клубом первенства ПФЛ «Ленинградец».
Первым российским футболистом, у которого диагностировали коронавирус, стал полузащитник тихвинского «Ленинградца» Максим Астафьев.
Анализ, который взяли у 37-летнего воспитанника петербургского «Зенита», показал положительный результат. Сейчас Астафьев находится в Боткинской больнице Санкт-Петербурга.
Ранее Астафьев был госпитализирован с повышенной температурой, как и его одноклубник защитник Илья Баннов, но у того подозрение на коронавирус не подтвердилось.
«Ленинградец» выступает в группе «Запад» второго дивизиона, где занимает 5‑е место.