I've written a script that pulls data from my school's website and I'm having some trouble with execution time. 
There are over 20 campuses, each with data for three semesters. The script looks up those school names, then the semesters available for each school, then the subjects/departments that are offering classes each semester. Then the script  searches for the classes per department and then I do things with that data. 
I timed the execution of the script on just one campus, and it ran for over three minutes. When I ran it for all 24 campuses it took over an hour. I'm using the "requests" library, which runs each HTTP request in synchronously. I'm using the "requests" library, primarily because it handles sessions nicely.
I'm looking for ways to bring down the time the script takes to run, by making the various requests for each semester run in parallel. I suspect that if I run three semesters asynchronously, then each school should take a minute, instead of three. Then, I can run all schools in parallel and achieve the same minute for all of the data. A minute is a lot less than an hour and a quarter!

Am I wrong in my guess that multithreading/processing will bring down the execution time so drastically? What Python libraries should I be using for threads or processes? 
Once I've got each school being processed on a  thread, how do I consolidate the data from all the schools into one place? I know that it's considered poor practice for threads to alter global state, but what's the alternative here?
In python you want multiprocessing over multithreading. Threads don't do well in Python beacause of the GIL.
Performance Improvements with Processes or Threads