Zenit pip Spartak to third place
Russia midfielder Konstantin Zyryanov put Zenit ahead just before the break and Belgian international Nicolas Lombaerts made it 2-0 with a header five minutes after the re-start.
Spartak defender Malik Fathi pulled one back in the 83rd minute but Zenit, who had Hungarian midfielder Szabolcs Huszti sent off for a second yellow card late in the first half, held on to hand second-placed Spartak their third successive defeat.
The match in St Petersburg was marred by police attacking Spartak fans on their way to the stadium, the Russian FA said.
"Spartak fans were peacefully marching to the stadium when riot police attacked them. The fans were beaten up and taken to the police station," a spokesman for the Russian FA told news agency RIA without specifying how many fans had been involved.
Lokomotiv Moscow beat bottom team Khimki 3-1, with two goals coming from Russia striker Dmitry Sychev, to move level on 54 points with Zenit, but the St Petersburg side stayed third because of a better goal difference.
All matches in Russia began with a minute's silence after a bomb blast caused a train crash on Friday, killing dozens of people and injuring 100 more.
Rubin Kazan and Spartak Moscow finished first and second respectively to qualify for the Champions League.
Rubin, who sealed their second consecutive league title with a 0-0 draw against Zenit last week, crushed Kuban Krasnodar 3-0 to relegate their opponents along with Khimki, whose fate was decided more than a month ago.
First division winners Anji Makhachkala and Siberian side Sibir Novosibirsk will take their places next season.
CSKA Moscow, who had four coaching changes in a year, failed to match last year's runners-up finish, ending up fifth, two points behind Lokomotiv after a 3-0 win over Saturn Ramenskoye.
CSKA, coached by Leonid Slutsky after parting company with Valery Gazzayev, Brazilian Zico and Spaniard Juande Ramos in the past 12 months, still have a chance of reaching this season's Champions League knockout round.