Scrapy多种蜘蛛

时间:2015-01-19 11:49:46

标签: python web-scraping scrapy

我定义了两个执行以下操作的蜘蛛:

蜘蛛A:

  1. 访问主页。
  2. 从页面中提取所有链接并将其存储在文本文件中。
  3. 这是必要的,因为主页上有一个更多结果按钮,可以生成更多不同产品的链接。

    蜘蛛B:

    1. 打开文本文件。

    2. 抓取各个页面并保存信息。

    3. 我正在尝试将两者结合起来并制作crawl-spider

      主页的URL结构类似于:

      http://www.example.com
      

      各个页面的URL结构类似于:

      http://www.example.com/Home/Detail?id=some-random-number
      

      文本文件包含将由第二个蜘蛛抓取的此类URL的列表。

      我的问题:

      如何组合两只蜘蛛,以便制作一只完成刮痧的蜘蛛?

1 个答案:

答案 0 :(得分:3)

来自scrapy documantation

  

在回调函数中,您parse响应(网页)并返回Item个对象,Request个对象或两者的可迭代对象。这些请求还将包含一个回调(可能相同),然后由Scrapy下载,然后由指定的回调处理它们的响应。

所以你真正需要做的是在解析方法中(yuo提取那里的链接,对于每个链接,产生一个新的请求,如:

yield self.make_requests_from_url(http://www.example.com/Home/Detail?id=some-random-number)

  • self.make_requests_from_url已在Spider
  • 中实施

这样的例子:

class MySpider(Spider):

    name = "my_spider"

    def parse(self, response):
        try:
            user_name = Selector(text=response.body).xpath('//*[@id="ft"]/a/@href').extract()[0]
            yield self.make_requests_from_url("https://example.com/" + user_name)
            yield MyItem(user_name)
        except Exception as e:
            pass

您可以使用不同的解析功能处理其他请求。通过返回Request对象并显式指定回调来实现(self.make_requests_from_url函数调用parse函数默认值)

Request(url=url,callback=self.parse_user_page)