Barcelona moved 10 points clear at the top of La Liga after a second El Clasico win in four days, Ivan Rakitic’s goal all but ending Real Madrid’s faint title hopes.
Rakitic kept his composure to beat Thibaut Courtois after a one-two with Sergi Roberto split Real’s defence.
Karim Benzema and Raphael Varane were denied towards the end but Real rarely looked like equalising at the Bernabeu.
They are third in the table, 12 points behind Barcelona with 12 games left.
Atletico Madrid, who are second, will cut Barca’s lead at the top to seven points if they win at Real Sociedad on Sunday (17:30 GMT).
Barcelona’s players formed a huddle as they celebrated on the pitch after the final whistle.
This was their 18th victory in 26 games in the league and, barring a disastrous set of results, they will retain the title they won by 14 points last season.
Having beaten Real in the Copa del Rey on Wednesday, Ernesto Valverde’s side inflicted further misery on their bitter rivals.
Barca showed their class all over the pitch. Croatia midfielder Rakitic raced clear of Sergio Ramos to score before Courtois produced a double save to keep out Luis Suarez and Lionel Messi.
At the back, Gerard Pique and Clement Lenglet were solid as Barca clocked up a fifth clean sheet in six games.
This will not go down as a classic but Barcelona emerged with their treble hopes intact.
Barca boss Valverde was not getting carried away though.
“We still have a whole world in front of us. We know Madrid can win a lot of consecutive games, Atletico Madrid are still there too,” he said.
“Until it is mathematically secure, we will keep battling. You have to keep fighting, if you think about it, you start losing.”
A few days ago Real Madrid were still in the hunt for the Copa del Rey, while victory over Barca on Saturday would have given them a fighting chance in the league.
Instead their season, at least domestically, lies in tatters after another disappointing home performance.
They lacked cutting edge. Gareth Bale replaced having made little impact but he was by no means alone.
Luka Modric wasted a good chance when he headed over on the stroke of half-time and Karim Benzema scuffed wide in front of an open goal early in the second half.
Meanwhile, Ramos’ arm connected with Messi’s face at the end of the first half in what was a niggly, rather than dirty, game.
This was Real’s third successive home defeat and the locals made their feelings clear at the final whistle.
Real’s next match is against Ajax in the last 16 of the Champions League on Tuesday, with the Spanish side 2-1 up from the first leg.
The European champions need to keep their season alive. Another defeat could be damaging for Santiago Solari and his players.
“The league is always important. The team will compete until the last date,” said Solari.
“We played as a team. It was a game hard fought and we matched them in almost everything. We looked for it in every way and we could not score.
“Football is pretty simple sometimes, it’s a good metaphor for life.”