Python 解析ajax响应以检索Scrapy中的最终url内容?

Python 解析ajax响应以检索Scrapy中的最终url内容?,python,ajax,screen-scraping,scrapy,web-crawler,Python,Ajax,Screen Scraping,Scrapy,Web Crawler,我有以下问题: 我的刮板从一个“基本”URL开始。这个页面包含一个下拉列表,它通过ajax调用创建另一个下拉列表,这个下拉列表将级联2-3次,直到它拥有到达“最终”页面所需的所有信息,在该页面中,我要获取的实际内容是 我使用页面公开的JSON API来模拟这种行为,而不是单击内容(并且必须使用Selenium或类似工具),因此,我不单击下拉菜单,而是发送一个请求并读取JSON响应,其中包含用于生成下一个下拉菜单内容的信息数组,并一直执行到获得一个项目的最终URL为止。这个URL将我带到我想要实际

我有以下问题:

我的刮板从一个“基本”URL开始。这个页面包含一个下拉列表,它通过ajax调用创建另一个下拉列表,这个下拉列表将级联2-3次,直到它拥有到达“最终”页面所需的所有信息,在该页面中,我要获取的实际内容是

我使用页面公开的JSON API来模拟这种行为,而不是单击内容(并且必须使用Selenium或类似工具),因此,我不单击下拉菜单,而是发送一个请求并读取JSON响应,其中包含用于生成下一个下拉菜单内容的信息数组,并一直执行到获得一个项目的最终URL为止。这个URL将我带到我想要实际解析的最后一个项目页面

我对如何使用Scrapy为每个下拉框组合获取“最终”url感到困惑。我使用urllib编写了一个爬虫程序,它使用了大量循环来迭代url的每个组合,但Scrapy似乎有点不同。我离开了urllib和lxml,因为Scrapy似乎是一个更易于维护的解决方案,更易于与Django项目集成

本质上,我试图强迫Scrapy采用我在读取json响应内容的过程中生成的特定路径,并且只真正解析链中的最后一页以获得真正的内容。它需要对每一个可能的页面都这样做,我很想将其并行化,这样事情才有效率(并使用Tor,但这些是后面的问题)

我希望我已经解释清楚了,如果你有任何问题,请告诉我。非常感谢你的帮助

编辑:添加了一个示例

[base url]/?location=120&section=240
返回:

<departments>
<department id="62" abrev="SIG" name="name 1"/>
<department id="63" abrev="ENH" name="name 2"/>
<department id="64" abrev="GGTH" name="name 3"/>
...[more]
</departments>
<courses>
<course id="1" name="name 1"/>
<course id="2" name="name 2"/>
</courses>
返回:

<departments>
<department id="62" abrev="SIG" name="name 1"/>
<department id="63" abrev="ENH" name="name 2"/>
<department id="64" abrev="GGTH" name="name 3"/>
...[more]
</departments>
<courses>
<course id="1" name="name 1"/>
<course id="2" name="name 2"/>
</courses>

这会一直持续到我得到了列表的实际链接为止

这本质上就是页面上的样子(尽管在我的例子中,表单上有一个最终的“提交”按钮,它将我发送到我想要解析的实际列表):


所以,我需要一些方法来清除下拉列表的每个组合,以便获得所有可能的列表页面。遍历ajax xml响应以生成最终列表URL的中间步骤把我搞砸了。

您可以从主回调函数开始使用一系列回调函数,假设您正在实现一个扩展BaseSpider的spider,请按如下方式编写解析函数:

...

def parse(self, response):
  #other code
  yield Request (url=self.baseurl, callback=self.first_dropdown)

def first_dropdown (self, response):
  ids=self.parse_first_response()   #Code for parsing the first dropdown content
  for (i in ids):
    req_url=response.url+"/?location="+i
    yield Request (url=req_url, callback=self.second_dropdown)

def second_dropdown (self, response):
  ids=self.parse_second_response()   #Code for parsing the second dropdown contents
  url=self.base_url
  for (i in ids):
    req_url=response.url+"&section="+i
    yield Request (url=req_url, callback=self.third_dropdown)

...
最后一个回调函数将包含提取数据所需的代码


小心,您要求尝试所有可能的输入组合,这可能会导致您很快收到大量请求。

您能提供代码(或基于代码的示例)来说明您的问题吗?这听起来很容易用Scrapy修复,但是我认为如果你提供一个例子,我们可以帮你最大的忙。我添加了一个例子,它非常类似于通过AJAX生成下一个下拉列表,我需要“遍历”AJAX响应以生成我的最终URL。谢谢!这就是我最终采用的解决方案。