• CrawlSpider


    编辑本随笔

    CrawlSpider概念:CrawlSpider就是Spider的一个类,功能更加强大。包含链接提取器,规则解析器。

    代码:

    1. 创建一个工程
      scrapy startproject crawlSpiderPro
    2. 创建一个基于CrawlSpider的爬虫文件
      scrapy genspider -t crawl chouti dig.chouti.com
    3. 创建了一个spider模板
      # -*- coding: utf-8 -*-
      import scrapy
      from scrapy.linkextractors import LinkExtractor
      from scrapy.spiders import CrawlSpider, Rule
      
      class ChoutiSpider(CrawlSpider):
          name = 'chouti'
          # allowed_domains = ['dig.chouti.com']
          start_urls = ['https://dig.chouti.com/']
          #实例化链接提取器
          link=LinkExtractor(allow=r'Items/')
          rules = (
              #实例化一个规则解析器对象
              Rule(link, callback='parse_item', follow=True),
          )
      
          def parse_item(self, response):
              item = {}
              #item['domain_id'] = response.xpath('//input[@id="sid"]/@value').get()
              #item['name'] = response.xpath('//div[@id="name"]').get()
              #item['description'] = response.xpath('//div[@id="description"]').get()
              return item
      View Code

    问题:如果我们想要对某一个网站进行全站爬取?

    解决方案:

    1. 通过手动发送请求
    2. CrawlSpider(推荐)

    链接提取器:根据正则表达式在页面中提取指定规则的链接,提取到的链接全部交给规则解析器,

    规则解析器:规则解析器接收链接提取器发送的链接后,就会对这些链接发送请求,获取链接对应的页面内容,根据回掉函数对指定内容进行解析

    follow参数是否将链接提取器继续作用于链接提取器请求回的内容中,即递归爬取。scrapy会自动做去重操作

    # -*- coding: utf-8 -*-
    import scrapy
    from scrapy.linkextractors import LinkExtractor
    from scrapy.spiders import CrawlSpider, Rule
    
    class ChoutiSpider(CrawlSpider):
        name = 'chouti'
        # allowed_domains = ['dig.chouti.com']
        start_urls = ['https://dig.chouti.com/']
        #实例化链接提取器
        #链接提取器:根据正则表达式在页面中提取指定规则的链接
        link=LinkExtractor(allow=r'/all/hot/recent/d+')
        rules = (
            #实例化一个规则解析器对象
            #规则解析器接收链接提取器发送的链接后,就会对这些链接发送请求,获取链接对应的页面内容,由callback回掉函数解析数据
            #follow参数:是否将链接提取器继续作用于链接提取器请求回的内容中,即递归
            Rule(link, callback='parse_item', follow=False),
        )
    
        def parse_item(self, response):
            item = {}
            #数据解析,和普通的spider一样
            print(response)
            #item['domain_id'] = response.xpath('//input[@id="sid"]/@value').get()
            #item['name'] = response.xpath('//div[@id="name"]').get()
            #item['description'] = response.xpath('//div[@id="description"]').get()
            return item

    follow参数为False时:

    当follow参数为True时:能提取所有页面

  • 相关阅读:
    [Linux]-Nginx平滑升级
    [Linux]-部署PXE网络装机
    [Linux]--构建DR模式的LVS群集
    [Linux]--构建NAT模式的LVS群集
    [Linux]-Apache,awstats部署
    [Linux]-部署Nginx Apache动静分离
    [Linux]-Rsync同步
    Vue.js内部运行机制(一)
    JS类数组对象及如何转变为真正的数组
    JS、TS中的符号表达式
  • 原文地址:https://www.cnblogs.com/yaya625202/p/10431660.html
Copyright © 2020-2023  润新知