scrapy蜘蛛的多重遗传

时间:2015-03-01 19:04:09

标签: python regex scrapy multiple-inheritance scrapy-spider

是否可以创建一个继承两个基本蜘蛛功能的蜘蛛,即SitemapSpider和CrawlSpider?

我一直在尝试从各个网站抓取数据,并意识到并非所有网站都列出了网站上的每个网页,因此需要使用CrawlSpider。但是CrawlSpider经历了很多垃圾页面并且有点过分。

我想做的是这样的事情:

  1. 启动我的Spider,它是SitemapSpider的子类并传递正则表达式 匹配对parse_products的响应以提取有用的 信息方法。

  2. 转到与产品页面匹配的正则表达式:/ reviews /的链接, 并将数据发送到parse_review函数    注意:" / reviews /"类型页面未在站点地图中列出

  3. 从/ reviews / page

  4. 中提取信息
  5. CrawlSpider主要用于递归抓取和抓取

  6. -------附加细节-------

    有问题的网站是www.flipkart.com 该网站列出了很多产品,每个页面都有自己的详细信息页面。 与详细信息页面一起,它们是相应的"评论"产品页面。审核页面的链接也可在产品详细信息页面上找到。

    注意:网站地图上未列出评论页面。

    class WebCrawler(SitemapSpider, CrawlSpider):
        name = "flipkart"
        allowed_domains = ['flipkart.com']
        sitemap_urls = ['http://www.flipkart.com/robots.txt']
        sitemap_rules = [(regex('/(.*?)/p/(.*?)'), 'parse_product')]
        start_urls = ['http://www.flipkart.com/']
        rules = [Rule(LinkExtractor(allow=['/(.*?)/product-reviews/(.*?)']), 'parse_reviews'),
                 Rule(LinkExtractor(restrict_xpaths='//div[@class="fk-navigation fk-text-center tmargin10"]'), follow=True)]
    
        def parse_product(self, response):
            loader = FlipkartItemLoader(response=response)
            loader.add_value('pid', 'value of pid')
            loader.add_xpath('name', 'xpath to name')
            yield loader.load_item()
    
        def parse_reviews(self, response):
            loader = ReviewItemLoader(response=response)
            loader.add_value('pid','value of pid')
            loader.add_xpath('review_title', 'xpath to review title')
            loader.add_xpath('review_text', 'xpath to review text')
            yield loader.load_item()
    

1 个答案:

答案 0 :(得分:2)

你走在正确的轨道上,唯一剩下的就是parse_product功能的结尾,你必须得到爬虫提取的所有网址

def parse_product(self, response):
    loader = FlipkartItemLoader(response=response)
    loader.add_value('pid', 'value of pid')
    loader.add_xpath('name', 'xpath to name')
    yield loader.load_item()

    # CrawlSpider defines this method to return all scraped urls.
    yield from self.parse(response)

如果您没有yield from语法,请使用

for req in self.parse(response):
    yield req