首页 > 解决方案 > Scrapy 不尊重 LIFO

问题描述

我使用 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,然后我用它做 smth。然后另一个值从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 都返回相同的页面。

标签: python-3.xscrapy

解决方案


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)...},
        )

推荐阅读