我用的是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从Parse获取2个值并将它们添加到队列中,然后从res_before_get发送2个请求。因此,我得到了重复的结果。
Post
Post
Get
Get我错过了什么?
这是asp.net网站。其逻辑如下:
。
这就是为什么维护秩序是很重要的。
现在我得到了POST1和POST2。由于sessionID与POST2相关联,所以GET1和GET2都返回相同的页面。
发布于 2019-10-17 04:36:02
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)...},
)https://stackoverflow.com/questions/58417237
复制相似问题