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时:能提取所有页面

原文地址:https://www.cnblogs.com/yaya625202/p/10431660.html