The win, which came courtesy of goals from Karim Benzema and Toni Kroos, saw Real go top of La Liga ahead of rivals Barcelona and Atletico Madrid, although Atletico has a chance to regain the top spot against Real Betis on Sunday.
Benzema’s deft backheel flick opened the scoring in the famous derby when he turned in Lucas Vazquez’s cross on 13 minutes.
Kroos doubled the home side’s lead later in the first half when his free-kick ricocheted off Sergino Dest and Jordi Alba was unable to clear the deflection off the line.
Federico Valverde’s shot cannoned off the post minutes later as Real looked for a third and Marc-Andre ter Stegen produced a sharp save to deny Vazquez’s follow-up attempt.
Lionel Messi then hit the post for Barcelona just before halftime with an audacious, swinging corner kick, but it wasn’t until the hour mark that Barca got on the scoresheet through Oscar Mingueza.
The stormy weather intensified in the second half as players battled tempestuous conditions. Real was denied by the post again shortly after Mingueza’s goal when Vinicius Jr’s cross deflected off Ronald Araujo.
As Barcelona pushed for an equalizer, Casemiro was sent off for a second yellow card and the visiting side came agonizingly close to leveling the scores in the final play of the game when Ilaix Moriba hit the crossbar.
“We had chances to get a third or even a fourth goal. We struggled at times because this game demanded an awful lot of us, just like the clash with Liverpool, but that’s what you come to expect against these teams. It’s a well-deserved Real Madrid win.”
The result means the La Liga title race is set for a thrilling conclusion with just a single point currently separating the top three teams.
Defeat is a huge blow for Barcelona, which also had a late penalty appeal turned down when Martin Braithwaite went down under a challenge from Ferland Mendy. The loss ended a run of 19 league games without defeat for Ronald Koeman’s side.