Вставьте параметр временной метки в запрос scrapy прямо перед его выполнением - PullRequest
0 голосов
/ 10 октября 2019

Я пытаюсь получить некоторые данные с сайта, основанного на ajax, где мне нужно получить открытую страницу и получить оттуда некоторые идентификаторы, чтобы я мог смоделировать запрос ajax к серверу.

Проблемадля второго запроса требуется параметр метки времени. Это выглядит примерно так:

    https://sub.domain.com/id/?z=9999999999

Где параметр z - это время UNIX с точностью до секунды. После некоторого тестирования выясняется, что запрос доступен только в течение нескольких секунд. Если отметка времени не находится в этом диапазоне, сервер выбрасывает 404.

Scrapy использует генератор для итерации по запросам, поэтому, если я создаю несколько десятков запросов, и в дополнение к этому у меня естьПараметр 'DOWNLOAD_DELAY' установлен для ожидания пары секунд между запросами, что означает, что запросы занимают некоторое время между созданием и тем, когда они фактически выполняются, так что к тому времени отметка времени уже истекла, и я получаю страницу ошибки.

Мой вопросЕсть ли способ добавить параметр прямо перед выполнением фактического запроса? или, альтернативно, можно ли выполнить запрос на месте, а не передавать его генератору?.

1 Ответ

1 голос
/ 12 октября 2019

Есть ли способ добавить параметр непосредственно перед выполнением фактического запроса?

Да, для этой цели предназначен пользовательский DownloaderMiddleware process_request

можно ли выполнить запрос на месте вместо передачи его генератору?

Да и нет;да, потому что это python, вы можете делать то, что вам нравится, но нет, потому что если вы просто используете urllib или requests или что-то еще, вы полностью обойдете все преимущества Scrapy, включая вышеупомянутую настройку DOWNLOAD_DELAY. Вы можете использовать priority= kwarg , чтобы сообщить Scrapy о временной чувствительности Request, но, в конечном счете, сможет ли он запланировать и выполнить Request в пределах временного окнавременная метка зависит от того, сколько из них находится в очереди.

Я бы попробовал ваш первый подход, переписав временную метку, а не пытаясь ускорить существующую, особенно если эти временные метки не имеют смыслана сервер (то есть все, что они делают, это now() - query.z для достоверности, а не select * from whatever where z = query.z)

...