2016-07-26 98 views
0

我想使用scrapy刮刮有一个搜索表单的网站,但它很难做并发请求给出它如何工作: 当您执行搜索时,它创建一个环绕搜索的会话,并且您不能同时进行多次搜索,否则无法再访问先前搜索的结果。如何刮scrapy中的搜索表格

例如:

启动带条件的搜索,它重定向到一个网页,一个ID和每个结果的细节重用此ID:

list.do?anchor=51edc79.0 
details.do?anchor=51edc79.0.0 
details.do?anchor=51edc79.0.1 

如果我开始一个新的搜索标准B,这是一个新的ID:

list.do?anchor=5200109.0 
details.do?anchor=5200109.0.0 
details.do?anchor=5200109.0.1 

但现在第一搜索的结果也不会显示内容:

details.do?anchor=51edc79.0.2 => cannot find 
details.do?anchor=51edc79.0.3 => cannot find 

我一次只能做一个请求,以确保第二次搜索不会开始,直到获取第一次搜索的所有结果,但我仍然想要并发请求以获得一个结果搜索更快。 所以这个想法将不会开始第二次搜索,直到搜索到所有搜索结果。

你会怎么做scrapy?

当我允许多个请求(CONCURRENT_REQUESTS)和使用的优先级,第二个搜索开始都是从第一个搜索页面中之前完成。

感谢

回答

1

通常会议只能靠饼干,所以你必须使用相同的蜘蛛来管理多个Cookie,并cookiejars are the solution here

只有透过不同的cookiejar每一个搜索请求时,记得要保持传球与所有相关请求的cookiejar。

为了控制从蜘蛛开始的饼干试试这个:

class MySpider(Spider): 
    name = "myspider" 

    number_of_sessions = 5 

    def start_requests(self): 
     for i in range(self.number_of_sessions): 
      yield Request(
       'homepage.com', 
       meta={'cookiejar': i}, 
       dont_filter=True, 
       callback=self.parse, 
      ) 

使用dont_filter参数,因此scrapy不会过滤那些为重复请求。

+0

感谢您的回复。我尝试过,但是我在搜索中看到的ID实际上并不是真正的会话,所以当我使用cookiejar中的新条件开始新搜索时,它会出错(服务器以500响应,因为我认为没有创建会话服务器)。看起来真正的会话是在访问主页时用起始url创建的。所以我必须在主页上使用cookiejar('Home - > Search - > Result')。这使得它变得复杂起来,因为我使用主页作为获取标准值的起点,然后才开始对每个标准进行搜索。 : -/ – Ted

+0

然后你必须控制自爬网开始以来的cookiejars,检查我更新的答案 – eLRuLL

+0

嗯,也许我错过了一些东西,但从我的理解,在每个会话中,我仍然有原始问题:在一个会话中,在取得所有结果之前,我不能移动到下一个搜索。我会看看我是否可以用不同的方式使用cookiejar。不管怎么说,还是要谢谢你。 – Ted