python-3.x - 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网站。其逻辑如下:
- 使用搜索有效负载发出 POST 请求。
- 发出 GET 请求以获取实际数据。
- 两个请求共享相同的 sessionID
这就是为什么保持秩序很重要。
目前我得到 POST1 和 POST2。由于 sessionID 与 POST2 相关联,因此 GET1 和 GET2 都返回相同的页面。
解决方案
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)...},
)
推荐阅读
- amazon-web-services - 使用 boto3 无法使用 AWS 个性化服务
- powershell - 在 powershell 中获取已启用且未锁定的 Active Directory 用户列表
- python - EAST 文本检测 -215:断言失败(OpenCV Python)
- ninject - 使用 WhenInjectedExactlyInto 和默认绑定时,绑定顺序是否重要?
- tensorflow - 在张量流中找不到 device_util
- javascript - 具有两个输入字段的 iframe 的动态过滤器
- windows - 在 Windows 上安装 apache thrift
- r - R rlang:在 map() 中使用 .x 和 quosure?
- javascript - 我想在向下滚动时显示背景
- amazon-web-services - 无法连接到远程 AWS 服务器