Scrapy框架CrawlSpiders的介绍以及使用详解

Scrapy框架CrawlSpiders介绍

Scrapy是一个高效的Python爬虫框架,它采用异步IO模式,具有强悍的异步网络通信能力,在爬取大规模数据时表现出色。CrawlSpiders是Scrapy框架提供的一种方便易用的爬虫机制,它基于规则匹配和提取,可以便捷的完成数据爬取和处理。CrawlSpiders拥有灵活的爬取方式,可以通过url的正则表达式、xpath、css等方式进行爬取。在使用CrawlSpiders时,我们通常要设置一些规则,用于告诉爬虫如何进行爬取。

使用CrawlSpiders的步骤

1. 创建CrawlSpider

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

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

    rules = (
        Rule(LinkExtractor(allow='/page/\d+/'), follow=True),
        Rule(LinkExtractor(allow='/post/'), callback='parse_item'),
    )

    def parse_item(self, response):
        pass

在这个代码中,我们首先导入了CrawlSpider和Rule类,同时也导入了用于提取url的LinkExtractor类。然后定义了我们的MyCrawlerSpider类,设置了name、allowed_domains、start_urls等属性,指定了爬虫的基本信息。接着,设置了两个规则,第一个规则是用于提取类似http://www.example.com/page/2/这样的url,用于继续爬取下一页,这里使用了follow=True,表示该url可以被爬虫继续跟进,后面的规则则是用于处理http://www.example.com/post/xxx.html这样的url,同时指定了处理函数,用于对该url响应回来的数据进行处理。

2. 定义处理函数

在CrawlSpider中,我们一般会定义一个parse_item()函数来对响应进行处理。这个函数的输入是响应对象response,我们可以利用response进行数据提取和处理,并生成Item对象进行返回,示例代码如下:

from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
from myproject.items import MyItem

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

    rules = (
        Rule(LinkExtractor(allow='/page/\d+/'), follow=True),
        Rule(LinkExtractor(allow='/post/'), callback='parse_item'),
    )

    def parse_item(self, response):
        item = MyItem()
        item['url'] = response.url
        item['title'] = response.xpath('//title/text()').extract_first().strip()
        item['content'] = response.css('div.content').extract_first().strip()
        return item

3. 运行爬虫

在完成CrawlSpider和处理函数后,我们需要启动爬虫,并将数据存储到文件中。我们可以在Scrapy项目文件夹下的终端中使用以下命令启动爬虫:

scrapy crawl my_crawler -o items.json

这条命令将启动我们的爬虫,并将爬取到的数据以json格式存储到items.json文件中。

示例1: 使用正则表达式提取url

我们可以使用CrawlSpider和LinkExtractor类基于正则表达式提取url,以下是一个示例,用于爬取豆瓣电影的top250的电影信息。

from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
from myproject.items import DoubanMovieItem

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

    rules = (
        Rule(LinkExtractor(allow='/subject/\d+/'), callback='parse_item'),
        Rule(LinkExtractor(allow='?start=\d+&filter='), follow=True),
    )

    def parse_item(self, response):
        item = DoubanMovieItem()
        item['url'] = response.url
        item['title'] = response.xpath('//h1/span/text()').extract_first().strip()
        item['director'] = response.xpath('//div[@id="info"]/span[1]/span[@class="attrs"]/a/text()'
                                            '|//div[@id="info"]/span[1]/span[2]/a/text()').extract()
        item['scriptwriter'] = response.xpath('//div[@id="info"]/span[2]/span[@class="attrs"]/a/text()'
                                            '|//div[@id="info"]/span[2]/span[2]/a/text()').extract()
        item['actor'] = response.xpath('//div[@id="info"]/span[3]/span[@class="attrs"]/a/text()'
                                            '|//div[@id="info"]/span[3]/span[2]/a/text()').extract()
        item['type'] = response.xpath('//div[@id="info"]/span[@property="v:genre"]/text()'
                                            '|//div[@id="info"]/span[@class="pl"][contains(text(),"类型:")]/following-sibling::span/text()').extract()
        item['producer_country'] = response.xpath('//div[@id="info"]/span[@property="v:initialReleaseDate"]/following-sibling::text()'
                                            '|//div[@id="info"]/span[@class="pl"][contains(text(),"制片国家/地区:")]/following-sibling::text()').extract()
        item['language'] = response.xpath('//div[@id="info"]/span[@property="v:language"]/following-sibling::text()'
                                            '|//div[@id="info"]/span[@class="pl"][contains(text(),"语言:")]/following-sibling::text()').extract()
        item['release_date'] = response.xpath('//div[@id="info"]/span[@property="v:initialReleaseDate"]/text()'
                                            '|//div[@id="info"]/span[@class="pl"][contains(text(),"上映日期:")]/following-sibling::span/text()').extract()
        item['run_time'] = response.xpath('//div[@id="info"]/span[@property="v:runtime"]/text()'
                                            '|//div[@id="info"]/span[@class="pl"][contains(text(),"片长:")]/following-sibling::text()').extract_first()
        item['rate'] = response.xpath('//strong[@class="ll rating_num"]/text()').extract_first()
        item['brief'] = response.css('span.all.hidden').extract_first()
        return item

在这个示例中,我们使用了LinkExtractor分别提取了电影详情和下一页的url。在处理函数parse_item()中,我们使用了xpath和css选择器分别提取了电影的信息。

示例2: 使用callback参数处理多个响应

有时候,我们需要在处理函数中处理多个响应,并生成多个Item对象进行返回,我们可以使用callback参数处理多个响应。以下是一个示例,用于爬取官方文档中给出的quotes.infospider.us网站页面的所有名言以及它们的作者。

from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from myproject.items import QuoteItem

class QuotesSpider(CrawlSpider):
    name = "quotes"
    allowed_domains = ["quotes.toscrape.com"]
    start_urls = ["http://quotes.toscrape.com/page/1/"]

    rules = (
        Rule(LinkExtractor(allow=r"page/\d+/"), follow=True),
        Rule(LinkExtractor(allow=r"/author/[\w-]+/"), callback="parse_author"),
        Rule(LinkExtractor(allow=r"/tag/[\w-]+/"), follow=True),
        Rule(LinkExtractor(allow=r"/"), callback="parse_quotes"),
    )

    def parse_author(self, response):
        author_name = response.xpath("//h3/text()").get()
        yield QuoteItem(
            text=f"{author_name} says {response.xpath('//span[@class=\"text\"]/text()').get()}",
            author=author_name,
        )

    def parse_quotes(self, response):
        for quote in response.xpath('//div[@class="quote"]'):
            yield QuoteItem(
                text=quote.xpath(".//span[@class=\"text\"]/text()").get(),
                author=quote.xpath(".//span/small/text()").get(),
            )

在这个示例中,我们通过两个Rule来处理网站中不同的页面类型。第一个Rule使用parse_author()回调函数处理作者页面,并生成名人名言。第二个Rule使用parse_quotes()回调函数处理页面上所有名言,并生成一个Item对象返回。在处理名称页面时,我们提取了名言及作者名字,然后根据这两个值在生成的Item中分别保存。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Scrapy框架CrawlSpiders的介绍以及使用详解 - Python技术站

(0)
上一篇 2023年5月18日
下一篇 2023年5月18日

相关文章

  • 这只猫在云端定居了?边缘计算在天猫精灵云应用上的落地实践

    IoT的概念早已飞入寻常百姓家,在你我的日常生活中发挥着“智能”作用。比如,智能家居、智慧照明、GPS 导航、手机计步器等。未来,随着用户和技术的延伸和拓展,物联网的信息交换和通信价值将会被继续放大。 那么问题来了,如此庞大的设备和信息量,如何进行管理和整合重组?如何高效准确智能地对用户需求和实际应用场景做出反应?如何让数据流动产生更大价值? 如何向着更智慧…

    云计算 2023年4月17日
    00
  • python读取word文档的方法

    当我们需要处理一些Word文档时,可能会需要读取Word文档中的内容或者元数据。Python提供了多个库可以读取Word文档,其中最常用的有python-docx库和pywin32库。下面将详细讲解这两种方法的使用方法和示例。 1. 使用python-docx库读取Word文档 安装python-docx库 使用pip可以很方便地安装python-docx库…

    云计算 2023年5月18日
    00
  • Nginx常用配置及和基本功能讲解

    作者:京东物流 殷世杰 Nginx已经广泛应用于J-one和Jdos的环境部署上,本文对Nginx的常用的配置和基本功能进行讲解,适合Nginx入门学习。 1 核心配置 找到Nginx安装目录下的conf目录下nginx.conf文件,Nginx的基本功能配置是由它提供的。 Nginx的配置文件(conf/nginx.conf)整体上分为如下几个部分: : …

    云计算 2023年4月27日
    00
  • python数据可视化pygal模拟掷骰子实现示例

    让我来详细讲解一下“Python数据可视化pygal模拟掷骰子实现示例”的完整攻略。 简介 Pygal是一个由Python编写的SVG图表制作工具,它可以用来创建各种类型的图表,包括线性图、条形图、散点图和仪表盘等。同时,Pygal也支持与Python交互,可以将数据导入到图表中进行数据可视化分析。在本文中,我们将利用Pygal模拟掷骰子,并将结果可视化为条…

    云计算 2023年5月18日
    00
  • Python动态导入模块:__import__、importlib、动态导入的使用场景实例分析

    完整攻略:Python动态导入模块 Python中的模块是代码组织的基础单元之一。模块的导入是Python中常见的操作之一,在代码中随处可见。通常情况下,我们使用import关键字来引入模块。但是,有时候我们需要以动态的方式来导入模块,并在程序运行时根据一些条件来选择合适的模块进行导入。在这种情形下,Python中提供了一些方便的方式来实现动态导入模块,下面…

    云计算 2023年5月18日
    00
  • 全部满分!阿里云函数计算通过可信云21项测试

    简介: 在未来,无论是一方云服务,还是三方应用,所有事件都可被函数计算等服务可靠地处理。 今日,“2020 可信云线上峰会”正式召开。会上,中国信通院公布了混合云安全、云组网、函数即服务、消息队列、云计算安全运营中心等首次评估结果。阿里云函数计算通过了基础能力要求、平台可观测能力、服务性能、服务安全和服务计量准确性等 21 项测试,最终以满分成绩通过可信云函…

    云计算 2023年4月12日
    00
  • 云计算,大数据,人工智能三者有何关系?

    原创:http://cloud.idcquan.com/yjs/115806.shtml 云计算最初的目标是对资源的管理,管理的主要是计算资源,网络资源,存储资源三个方面。想象你有一大堆的服务器,交换机,存储设备,放在你的机房里面,你最想做的事情就是把这些东西统一的管理起来,最好能达到当别人向你请求分配资源的时候(例如1核1G内存,10G硬盘,1M带宽的机器…

    云计算 2023年4月12日
    00
  • .net Core 3.0 WebApi 创建Linux守护进程的方法

    请看下面的详细讲解: 创建Linux守护进程 在Linux系统中,可以通过将程序作为守护进程的方式来运行,使得程序在后台持续运行,不会因为用户退出或系统重启而停止。下面是关于如何创建Linux守护进程的步骤: 步骤一:编写WebApi代码 首先,需要编写一个.NET Core3.0 WebApi项目,并编写需要持续运行的代码(比如后台定时任务等)。代码可以参…

    云计算 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部