2

我有以下问题:

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

我没有点击任何东西(并且必须使用 Selenium 或类似的东西),而是使用页面暴露的 JSON API 来模仿这种行为,所以我没有点击下拉菜单,而是简单地发送一个请求并读取包含用于生成下一个信息数组的 JSON 响应下拉列表的内容,并执行此操作,直到我获得一个项目的最终 URL。此 URL 将我带到我想要实际解析的最终项目页面。

我对如何使用 Scrapy 获取下拉框的每个组合的“最终”网址感到困惑。我使用 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>

然后我获取部门 ID,将其添加到 url,如下所示:

[base url]/?location=120&section=240&department_id=62

返回:

<courses>
<course id="1" name="name 1"/>
<course id="2" name="name 2"/>
</courses>

这种情况一直持续到我最终得到列表的实际链接。

这基本上就是页面上的样子(尽管在我的情况下,表单上有一个最终的“提交”按钮,可以将我发送到我想要解析的实际列表): http ://roshanbh.com.np /落下/

因此,我需要某种方式来抓取下拉列表的每个组合,以便获得所有可能的列表页面。遍历 ajax xml 响应以生成最终列表 URL 的中间步骤让我很困惑。

4

1 回答 1

1

您可以使用从主回调函数开始的回调函数链,假设您正在实现一个扩展 BaseSpider 的蜘蛛,这样编写您的解析函数:

...

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)

...

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

请注意,您要求尝试所有可能的输入组合,这可能会导致您非常快速地收到大量请求。

于 2013-06-20T23:58:13.837 回答