"Permanently remove this site from search results" seems like the absolute easiest "personalization" to implement.
The reason Google doesn't fight SEO spam (and just generally annoying/obnoxious behavior such as paywalls) more aggressively is because it doesn't want to bite the hand that feeds - all these spammy sites have ads or analytics that benefit Google.
If you recently started crawling you won't be able to detect which content was 'first', and if you don't crawl as frequently as google you are reliant on your crawl frequency being quicker than the 'content stealing' speed.
No problem there. If a page hasn't been crawled, it won't be a search result.
If a full crawl of the web takes 3 months and A steals content from B after 2 weeks, it may not be possible to easily infer that A has stolen from B rather than visa-versa.
If I crawl every week and see that A posted it on the first crawl, and B suddenly also had that content on the second crawl, I can infer that B stole from A.
On the downside I could see this being used by terrible people to delist actual information sources so that they would only ever be served conspiracy theory sites in their searches as well.
The issue with the python docs for this search is that it takes me to “built-in types”, and starts off with things totally irrelevant to what I want. I now have to go searching for string, then find the built-in method replace. Meanwhile, the other tutorial-esque websites almost all show an example of str.replace above the fold. If you’re Google and you’re trying to get people information faster, you’re going to promote the result that has more people not coming back to the search result page afterwards because it was hard to find the answer on that result.
I find this especially useful since I often otherwise find myself typing site:python.org (or similar things, like if I just want to see the MDN page instead of going through w3schools or blog posts for examples).
edit: in the particular example for str.replace, I found it buried in the results for "py replace", at the top of "py str.replace" (helps if you know what Python calls the type) and basically nowhere for "py string replace".