Правильно ли я сделал парсер?
Нет, это не из-за GIL.
Создавать количество тредов по количеству страниц неправильно. Создание треда - трудоёмкая задача для ОС.И правильно ли я вообще делаю?
Не совсем правильно, правильнее использовать то, что уже есть.
Если scrapy тебя не устраивает, ты можешь использовать ThreadPool'ы, вместо того, чтобы вручную управлять lowlevel api тредов. Примерно так:from concurrent.futures import ThreadPoolExecutor
from requests import Session

session = Session()

urls = [
    'https://toster.ru/q/372757',
    'https://toster.ru/',
]

with ThreadPoolExecutor(7) as pool:  # 7 - количество тредов
    for response in pool.map(session.get, urls):
        do_something_with_response(response)
Почитайте про scrapy. Он делает всю грязную работу за вас, так что никаких проблем не будет.