0

我正在用scrapy抓取一个网站。该parse方法首先提取所有类别链接,然后发送一个带有回调的请求到parse_category.

问题是,如果任何类别有一个产品,它就会重定向到产品页面。我parse_category无法识别此页面。

现在如何使用产品页面解析器解析重定向的类别页面?

这是一个例子。

  1. parse找到 3 个类别页面。
    1. http://example.com/products/samsung
    2. http://example.com/products/dell
    3. http://example.com/products/apple
  2. pare_category调用所有这些页面。每个返回一个带有产品列表的 html 页面。但apple有一个单品iMac 27"。所以它重定向到http://example.com/products/apple/imac_27. 这是一个产品页面。类别解析无法解析它。

parse_product我需要在这种情况下调用产品解析方法。我怎么做?

我可以在我的 parse_category 方法中添加一些逻辑并调用 parse_product。我不想要它。我希望scrapy会做到。但是,是的,我会提供 url 模式或任何其他必要的信息。

这是代码。

class ExampleSpider(BaseSpider):
    name = u'example.com'
    allowed_domains = [u'www.example.com']
    start_urls = [u'http://www.example.com/category.aspx']

    def parse(self, response):
        hxs = HtmlXPathSelector(response)

        anchors = hxs.select('/xpath')
        for anchor in anchors:
            yield Request(urljoin(get_base_url(response), anchor), callback=self.parse_category)

    def parse_category(self, response):
        hxs = HtmlXPathSelector(response)

        products = hxs.select(products_xpath).extract()
        for url in products:
            yield Request(url, callback=self.parse_product)


    def parse_product(self, response):
        # product parsing ...
        pass
4

1 回答 1

1

您可以选择编写一个实现该方法的中间件。process_response每当您的响应是针对产品 URL 而不是类别时,请创建Request 对象的副本并将回调函数更改为您的产品解析器。

Request最后,从中间件返回新对象。注意:您可能需要设置dont_filterTruenewRequest以确保 DupeFilter 不会过滤请求。

于 2013-07-12T11:32:12.047 回答