One of my strongest recommendations for novice programmers who are starting to get a hang of their language of choice is to build a project using a medium or large dependency (Django, Flask, jQuery, Express, etc.) and, whenever you hit an issue, try to solve it by only reading the docs or tracing through the project's source code.
I see people recommend reading through other code as a way to become a better programmer, and this is absolutely right, but usually I see people take it as "Open up the GitHub repo and start reading" like it's a fuckin novel or something. I hate that. I've never done it.
Tracing back through from your own code into the library, on the other hand, is way easier. Not only do you have a concrete goal of figuring out how something works in order to fix a bug, but you start off from a familiar base of code that you wrote and can return back to it at any time to get your bearings or find another function call or entry point to trace back through.
This becomes even easier if you're familiar with using a debugger, which I strongly recommend. Even if you end up being someone who is faster with print debugging or prefers exploring in a repl (and you don't have to pick just one anyway), the process of learning how to use a debugger will directly improve your mental model of how a running program executes.
On a final note, the goal isn't to become so good that you never search the web for a solution, it's more just that solving these issues without external help is a very efficient exercise for your mental programming muscles. When you're programming to get something done rather than to learn, 100% search away, all that knowledge ain't out there to be ignored.