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日

相关文章

  • python 爬取京东指定商品评论并进行情感分析

    下面我将详细讲解“Python 爬取京东指定商品评论并进行情感分析”的完整攻略。 一、准备工作 在进行爬取京东评论之前,我们需要准备以下工具和库: Python 3.x版本 Requests库 BeautifulSoup库 SNownlp库 其中,Requests库和BeautifulSoup库分别用来进行网页数据的爬取和解析,SNownlp库是用来进行情感…

    云计算 2023年5月18日
    00
  • [转]本地 Windows 计算机密码登录 登录 腾讯云 Linux 实例

    本文转自:https://cloud.tencent.com/document/product/213/5436? 登录工具 使用 远程登录软件 ,采用密码登录 Linux 实例(本例中选择使用 PuTTY,用户也可以选择其他类型的登录软件)。 操作步骤 安装 Windows 远程登录软件,参考下载地址:https://www.chiark.greenend…

    2023年4月10日
    00
  • Karmada 多云容器编排引擎支持多调度组,助力成本优化

    摘要:Karmada 社区也在持续关注云成本的管理,在最近发布的 v1.5 版本中,支持用户在分发策略 PropagationPolicy/ClusterPropagationPolicy 中设置多个集群调度组,实现将业务调度到成本更低的集群组中去。 本文分享自华为云社区《Karmada 多云容器编排引擎支持多调度组,助力成本优化!》,作者:华为云云原生团队…

    云计算 2023年4月22日
    00
  • 抹茶交易所怎么充值?抹茶交易所是哪个国家的

    抹茶交易所怎么充值?抹茶交易所是哪个国家的? 本文将介绍抹茶交易所怎么充值以及抹茶交易所是哪个国家的的完整攻略,包括充值方式、充值流程、抹茶交易所的国家和示例说明等。 1. 抹茶交易所的国家 抹茶交易所是一个全球性的数字货币交易平台,总部位于新加坡。 2. 抹茶交易所的充值方式 抹茶交易所支持多种充值方式,包括银行转账、支付宝、微信支付、USDT充值等。 3…

    云计算 2023年5月16日
    00
  • 8 云计算系列之Horizon的安装与虚拟机创建流程

    preface 在上一章节中,我们可以在无web管理界面上创建并启动虚拟机,虽然可以这么做,但是敲命令太繁琐,所以此时我们可以安装openstack web管理界面,通过web界面的图形化操作openstack,更加方便的使用openstack。 Horizon简介 提供一个web界面操作openstack的系统。 使用Django框架基于Openstack…

    云计算 2023年4月13日
    00
  • python斯皮尔曼spearman相关性分析实例

    简介 Spearman相关性分析是一种针对两个变量的非线性关系的统计方法。其核心思想是将两个变量的值进行排序,然后计算它们之间的Spearman相关性系数,用来衡量它们的关联程度。在对数据进行分析和建模时,Spearman相关性分析常常用来检测变量之间的关系是否具有统计学意义,并用于探究非线性效应的因素。 在Python中,我们可以通过scipy库中的sci…

    云计算 2023年5月18日
    00
  • Python数据分析中Groupby用法之通过字典或Series进行分组的实例

    下面详细讲解一下“Python数据分析中Groupby用法之通过字典或Series进行分组的实例”的完整攻略。 1. Groupby概述 groupby是pandas中非常实用的一个功能,它可以在数据处理中进行分组聚合操作,可以对数据集进行分组,之后进行个性化的操作。在实际的数据处理中,我们经常需要对数据进行分组,比如在股票数据中,我们需要对相同股票代码的所…

    云计算 2023年5月18日
    00
  • 0.1+0.2不等于0.3,微信小程序云开发如何解决JavaScript小数计算精度失准的问题

    先看图 这个是JavaScript语言自身存在的一个问题。说道这里不得不提一下网上流传的JavaScript搞笑图 我们在使用云开发来开发微信小程序的时候,会经常遇到JavaScript小数计算精度失准的问题。特别是实现钱包计算的功能。虽然整数计算不会出错,但总不能要求微信小程序内都是整数计算吧,这不科学。 那么开发小程序涉及到小数计算的时候,如何防止小数计…

    2023年4月9日
    00
合作推广
合作推广
分享本页
返回顶部