Правильно ли я сделал парсер?

Здравствуйте, сделал парсер для сайта конторы. Там может быть от 0 до 350 матчей. Чтобы загрузить данные для каждого матча, нужно запрашивать каждый раз страницу для этого матча. Как сделал я. Загружаю главную страницу и считываю какие есть матчи. Запоминаю их id. Дальше создаю соответствующие количество потоков и запускаю их. Поток загружает функцию с единственной командой. Которая загружает сайт и кладет его в массив.

Потом жду завершение всех потоков. И парсю эти данные. Когда около 100 матчей, время выполнение всех потоков в среднем 0.7 секунд.
Но иногда возникает ситуации, когда время доходит от 1,5 до 3 секунд при том же количестве матчей. Почему это может быть? Это из-за GIL? И правильно ли я вообще делаю? И реализовал ли я асинхронные запросы? Потому что я до сих пор не могу понять, что такое ачинхронныц запрос. Спасибо за помощь
  • Вопрос задан
  • 935 просмотров
Решения вопроса 2
@deliro
Нет, это не из-за 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)
Ответ написан
@lcd1232
Почитайте про scrapy. Он делает всю грязную работу за вас, так что никаких проблем не будет.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@bnytiki
Серверу отправляешь 100-300 запросов одновременно да еще с одного IP?
Я бы тебя вообще забанил.

Собирай понемножку.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы