Scrapy не уважает LIFO - PullRequest
       8

Scrapy не уважает LIFO

0 голосов
/ 16 октября 2019

Я использую Scrapy 1.5.1

Моя цель - пройти всю цепочку запросов для каждой переменной, прежде чем перейти к следующей переменной. По какой-то причине Scrapy принимает 2 переменные, затем отправляет 2 запроса, затем принимает еще 2 переменные и т. Д.

CONCURRENT_REQUESTS = 1

Вот мой пример кода:

def parsed ( self, response):
    # inspect_response(response, self)
    search = response.meta['search']

    for idx, i in enumerate(response.xpath("//table[@id='ctl00_ContentPlaceHolder1_GridView1']/tr")[1:]):

        __EVENTARGUMENT = 'Select${}'.format(idx)

        data = {

                      '__EVENTARGUMENT': __EVENTARGUMENT,

                  }

        yield scrapy.Request(response.url, method = 'POST', headers = self.headers, body = urlencode(data),callback = self.res_before_get,meta = {'search' : search}, dont_filter = True)     


def res_before_get ( self, response):
    # inspect_response(response, self)
    url = 'http://www.moj-yemen.net/Search_detels.aspx'
    yield scrapy.Request(url, callback = self.results, dont_filter = True)

Мое желаемое поведение: 1 значение от Parse отправляется на res_before_get, а затем я делаю что-то с ним. затем другие значения из Parse отправляются в res_before_get и т. д.

Post
Get
Post
Get

Но в настоящее время Scrapy принимает 2 значения из Parse и добавляет их в очередь, затем отправляет 2 запроса из res_before_get,Таким образом, я получаю повторяющиеся результаты.

Post
Post
Get
Get

Что мне не хватает?

PS Это сайт asp.net. Его логика следующая:

  1. делает запрос POST с полезной нагрузкой поиска.
  2. Сделайте GET-запрос для получения фактических данных.
  3. Оба запроса используют один и тот же sessionID

Вот почему важно сохранить заказ.

На данный момент я получаю POST1 и POST2. А поскольку sessionID связан с POST2, и GET1, и GET2 возвращают одну и ту же страницу.

1 Ответ

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

Scrapy работает асинхронно, поэтому вы не можете ожидать, что он будет соответствовать порядку ваших циклов или чему-либо еще.

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

def parse1(self, response):
    ...
    yield Request(..., callback=self.parse2, meta={...(necessary information)...})


def parse2(self, response):
    ...
    if (necessary information):
        yield Request(..., 
             callback=self.parse2, 
             meta={...(remaining necessary information)...},
        )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...