SEATTLE — After running for two touchdowns and helping San Francisco beat the rival Seahawks for a fourth straight time, Christian McCaffrey was going to enjoy his celebratory meal.
The fact it was a Thanksgiving feast on Seattle’s home field made it even more delicious.
“That was a satisfying turkey,” McCaffrey said.
And a satisfying win.
McCaffrey rushed for 114 yards and two scores in the first half, and the 49ers built a 21-point lead by halftime in rolling to a 31-13 victory over the Seahawks on Thursday night.
The 49ers (8-3) won their fourth straight against their division rivals and have a two-game lead in the NFC West over Seattle. San Francisco won its third in a row overall following a three-game losing streak and picked up its 10th consecutive victory against a division opponent.
McCaffrey was terrific, running through arm tackles and breaking off a handful of big plays. He rushed for touchdowns of 8 and 1 yards as the 49ers built a 24-3 halftime advantage.
Deebo Samuel ran for a 2-yard touchdown on San Francisco’s opening possession and Brock Purdy completed 15 of 20 passes in a nearly flawless first half for the 49ers.
“We had an advantage in the first half, but that third quarter was tough and gave them some life,” Niners coach Kyle Shanahan said.
Purdy threw an interception that was returned for a touchdown by Seattle's Jordyn Brooks early in the third quarter but avoided any other major miscues and put a capper on the victory with a 28-yard scoring pass to Brandon Aiyuk with 7:51 left that sent some Seahawks fans heading for the exits.
“Ice in his veins. He’s such a good player," McCaffrey said of Purdy. "He makes plays all over the field, and watching how consistent he is back in the huddle. He's never too high. He's never too low. Anytime he’s got the ball in his hands, if there is a play to be made he can make it."
Purdy finished 21 of 30 for 209 yards, and while he didn't have the perfect passer rating he did last week against Tampa Bay, he outplayed the quarterback on the other side.
Seattle’s Geno Smith was playing banged up after leaving last Sunday’s loss to the Los Angeles Rams in the second half with an injury to his right arm, near his elbow. He’ll have more bumps and bruises after the 49ers got finished with him.
Smith was 18 of 27 for 180 yards. He was sacked six times, threw an interception in the first half and nearly had a few more throws picked off. The Seahawks' first five possessions gained 15 total yards, and when Seattle tried to rally in the second half, Smith took a couple of untimely sacks.
“The first half of this game, we couldn’t get out of our own way enough,” Seattle coach Pete Carroll said.
Smith also ran to argue with an official after there was no flag for defensive holding or pass interference on a throw intended for Jaxon Smith-Njigba in the end zone that would have given the Seahawks first-and-goal late in the third quarter. Seattle settled for a field goal and never threatened again.
“From my vantage point, I could clearly see him getting held and it affected him being able to catch a touchdown right there,” Smith said.
Seattle’s last chance at a rally ended when Zach Charbonnet was stopped on fourth-and-1 at the San Francisco 21 with 4:14 remaining. The Seahawks (6-5) lost for the second time in five days and have dropped three of their last four.
Seattle has scored just three offensive touchdowns in the past four games and has only one in its last eight quarters.
“It’s been a tough stretch for us, but I believe that things will turn around,” Smith said.
SACK ATTACK
San Francisco's six sacks were spread around. Nick Bosa had two sacks to give him 7 1/2 for the season. Javon Hargrave had 1 1/2 sacks, while Tashaun Gipson and Arik Armstead each had one. Kevin Givens was also credited with a half-sack. The 49ers have 15 sacks in the past three games.
“It’s funny, after the game nobody has any idea what their stats are. That's a good problem to have,” Bosa said.
BENCHED
Seattle appeared to bench starting cornerback Riq Woolen in the first half, replacing him with Michael Jackson. Woolen was not announced as having an injury and remained in on special teams. Carroll said afterward there were concerns about Woolen still dealing with a sore shoulder and that's why the change was made. Woolen missed a couple of tackles early in the game.
INJURIES
Seattle right tackle Jason Peters left late in the first half with a shoulder stinger and was replaced by Stone Forsythe. Peters did not return.
San Francisco backup safety George Odum sustained a biceps injury and did not return. There is concern it's a torn biceps that could sideline Odum for a long period.
UP NEXT
49ers: At Philadelphia on Sunday, Dec. 3.
Seahawks: At Dallas next Thursday.
Watch more on ABC10