Scrapy:针对同一URL运行多个嵌套搜索

时间:2014-02-26 14:43:38

标签: python scrapy

我是Python的新手,也是Scrapy的新手。我正在尝试构建一个蜘蛛,它将转到给定的URL并在该站点内运行多个嵌套搜索。例如,如果我正在搜索在线商店,我会先向http://www.mystore.com发送请求,然后在网站中搜索3个级别的子菜单,查找在运行时通过CSV输入文件指定的各种产品。在子菜单的每个级别,我正在寻找目标类别并启动获取该子类别的请求,直到我在解析查找特定项目的结果时达到第3级。

  • 商店基本网址 - >首页 - >厨房 - >设备:解析结果 寻找“搅拌机”。
  • 商店基本网址 - >首页 - >厨房 - >设备:解析结果 寻找“水壶”。
  • 商店基本网址 - >首页 - >电气 - >视频:解析结果 寻找“DVD播放器”。
  • 商店基本网址 - >首页 - >花园 - >工具:解析结果 为“strimmer”。
  • 商店基本网址 - >服装 - >男士 - >裤子:解析结果 寻找“牛仔布”。

我可以将搜索数据加载到我的CrawlSpider中并告诉Scrapy运行所有这些搜索,但是Scrapy看到起始URL是相同的,因此它只运行第一个请求并将所有其他请求视为重复。

我正在抓取的网站没有RESTful接口,因此我无法指定请求网址直接转到相关的子类别。相反,我必须查看每个级别的导航链接,以找到我想要抓取的下一个子类别。

我不想在蜘蛛周围传递整个搜索树,并继续检查我在树中的位置。搜索适用于单个搜索,例如对于上面的“搅拌机”,但我无法弄清楚如何说服Scrapy分别运行所有搜索。

有人可以指点我做一些这样的例子或其他文件吗?

3 个答案:

答案 0 :(得分:1)

告诉linkextractor不要过滤相同的网址:

  

unique(boolean) - 是一个布尔值,指定是否应对提取的链接应用重复过滤。

但是,从您的问题来看,您想要抓取的每个网站都需要一个单独的蜘蛛,而所有网站共享相同的管道等(经典的scrapy项目结构),您还应该考虑使用简单的Spider而不是CrawlSpider,请注意没有必要记住“整个搜索树”,根据需要简单地点击多个请求并让scrapy将它们排队并逐个调用它们的回调。

答案 1 :(得分:0)

@Guy:

搜索参数来自CSV文件中的行,但逻辑上它们将是这样的:

  • www.mystore.com - >找到" Home" - >找到"厨房" - >找到"家电" - >解析找到" blender"项目。
  • www.mystore.com - >找到" Home" - >找到"厨房" - >找到"家电" - >解析找"水壶"项目。
  • www.mystore.com - >找到" Home" - >找到"电气" - >找到"视频" - >解析找到" DVD播放器"项目。
  • www.mystore.com - >找到" Home" - >找到" Garden" - >找到"工具" - >解析找到" strimmer"项目。
  • www.mystore.com - >找"服装" - >找到"男人" - >找到"裤子" - >解析"牛仔布"项目。
  • www.anotherstore.com - >找到" Home" - >找到"厨房" - >找到"家电" - >解析找到" blender"项目。
  • ...等

所以搜索在逻辑上是一组嵌套查询,但我宁愿对上面的每一行进行单独的搜索,如果我能说服Scrapy忽略从www.mystore.com开始有几个搜索的事实。数据被存储为一组简单的CSV记录,即每个提取的项目一个。因此,除了我不知道如何通过Scrapy对相同的基本URL运行多个不同的搜索之外,没有必要构建一个树。

这有帮助吗?

答案 2 :(得分:0)

好的,我明白了。

  • 开始请求是基本网址,例如www.mystore.com
  • 从启动请求中解析响应然后只需运行所有搜索 基于从基页提取的顶级导航链接。

效率不高,如果数据量增加,我需要重新工作,但现在它似乎有效。

感谢您的建议。