欢迎访问宙启技术站
智能推送

了解Python中CrawlSpider()的原理和实现方式

发布时间:2023-12-23 20:36:56

CrawlSpider是Scrapy中的一个Spider派生类,它提供了一种基于规则的爬虫框架,用于开发一个可以跟踪链接的通用爬虫。CrawlSpider能够提取网页的链接,访问这些链接,并根据定义的规则来跟进链接。下面将详细介绍CrawlSpider的原理和使用方式,并给出一个使用实例。

原理:

CrawlSpider实现了一个系统,其组件包括一个Spider用于解析初始请求和提取链接,一个Rule对象用于定义链接提取规则,和一个LinkExtractor用于从网页中提取链接。当CrawlSpider发起一个请求后,它会将网页交给Spider进行解析。Spider使用Rule来提取链接,并将提取到的链接加入到调度队列中,CrawlSpider会通过LinkExtractor从网页中提取其他链接,然后继续进行爬取过程。

使用方式:

使用CrawlSpider首先需要导入相应的模块和类:

from scrapy.spiders import Rule, CrawlSpider
from scrapy.linkextractors import LinkExtractor

接下来,创建一个新的Spider类,并继承CrawlSpider类:

class MySpider(CrawlSpider):
    name = 'example'
    allowed_domains = ['example.com']
    start_urls = ['http://www.example.com']

    rules = (
        Rule(LinkExtractor(), callback='parse_item', follow=True),
    )

    def parse_item(self, response):
        # 解析网页内容
        pass

在上面的示例中,定义了一个名为MySpider的CrawlSpider类。name属性定义了爬虫的名称,allowed_domains属性指定了可以爬取的域名范围,start_urls属性指定了初始请求的URL列表。rules属性是一个包含Rule对象的元组,每个Rule对象定义了链接提取规则和回调函数。在本例中,使用LinkExtractor的默认参数提取链接,并将链接交给名为parse_item的回调函数进行处理。follow=True表示继续跟进链接。

最后,使用命令行运行爬虫:

scrapy crawl example

实例:

下面给出一个具体的使用实例,以爬取豆瓣电影Top250为例。首先,创建一个新的项目:

scrapy startproject douban

进入项目目录并创建一个新的Spider:

cd douban
scrapy genspider douban_spider movie.douban.com

打开生成的douban_spider.py文件,并修改为以下内容:

from scrapy.spiders import Rule, CrawlSpider
from scrapy.linkextractors import LinkExtractor
from douban.items import DoubanItem

class DoubanSpider(CrawlSpider):
    name = 'douban'
    allowed_domains = ['movie.douban.com']
    start_urls = ['https://movie.douban.com/top250']

    rules = (
        Rule(LinkExtractor(allow=r'top250\?start=\d+'), callback='parse_item', follow=True),
    )

    def parse_item(self, response):
        movies = response.xpath('//div[@class="info"]')
        for movie in movies:
            item = DoubanItem()
            item['title'] = movie.xpath('div[@class="hd"]/a/span/text()').get()
            item['rating'] = movie.xpath('div[@class="bd"]/div[@class="star"]/span[@class="rating_num"]/text()').get()
            item['quote'] = movie.xpath('div[@class="bd"]/p[@class="quote"]/span/text()').get()

            yield item

在示例中,首先导入所需的模块和类,然后定义了一个DoubanSpider类继承自CrawlSpider。在rules属性中使用LinkExtractor提取链接,并使用正则表达式筛选链接。在parse_item方法中,使用XPath提取需要的字段,并将其保存到DoubanItem对象中,最后通过yield返回item。

创建一个新的items.py文件,用于定义DoubanItem类:

import scrapy

class DoubanItem(scrapy.Item):
    title = scrapy.Field()
    rating = scrapy.Field()
    quote = scrapy.Field()

最后,在命令行中运行爬虫:

scrapy crawl douban

上述实例演示了使用CrawlSpider实现一个通用爬虫的基本原理和使用方式。通过定义规则和回调函数,我们可以轻松地构建一个可以跟踪链接的爬虫,并从网页中提取所需的信息。