python爬虫scrapy框架之增量式爬虫的示例代码

yizhihongxing

针对这个主题,我可以提供一份针对“python爬虫scrapy框架之增量式爬虫的示例代码”的完整攻略。

什么是增量式爬虫?

在介绍示例代码之前,我们先来了解一下什么是“增量式爬虫”。简单来说,增量式爬虫就是针对已经抓取过的内容进行增量的、增量的更新;只爬取新加入的,而不是全盘的重新抓取。对于时间线较为敏感的数据应用,增量式爬虫可以减少开销,提高数据更新速度。

增量式爬虫的工作原理

在 Scrapy 爬虫框架中,实现增量式爬虫的基本思路是通过判断页面的“更新时间、修改时间”等信息,以此来判断页面是否需要重新抓取。具体的实现方式,可以通过在 Request 对象中添加 etag、Last-Modified 、If-Modified-Since 等头部信息,在请求时携带上次页面的时间信息,服务端会根据这些时间信息,判断页面是否已更新,然后返回更新状态。根据状态来判断是否需要重新抓取。

示范代码

示例 #1:增量爬取百度百科“机器学习”下的关键词条

首先,从 Python爬虫Scrapy框架入门教程 这里复制一个简单的 Scrapy 代码,用于爬取百度百科下的“机器学习”条目:

import scrapy

class BaiduBaikeSpider(scrapy.Spider):
    name = 'baidu_baike'
    allowed_domains = ['baike.baidu.com']
    start_urls = ['https://baike.baidu.com/item/机器学习']

    def parse(self, response):
        for item in response.xpath('//div[@class="main-content"]'):
            print(item.xpath('.//text()').extract())

接着,为了实现增量爬虫功能,我们需要在 Spider 实例化的时候进行初始化设置:

import scrapy
from scrapy.http import Request

class BaiduBaikeSpider(scrapy.Spider):
    name = 'baidu_baike'
    allowed_domains = ['baike.baidu.com']
    start_urls = ['https://baike.baidu.com/item/机器学习']
    etag, last_modified = None, None

    def start_requests(self):
        headers = {
            'If-None-Match': self.etag,
            'If-Modified-Since': self.last_modified
        }

        yield Request(url=self.start_urls[0], headers=headers)

    def parse(self, response):
        # 判断返回的状态是不是 304,如果是 304 代表没有新版本
        if response.status == 304:
            print('没有新内容,直接返回即可')
            return

        self.etag = response.headers.get('ETag').decode('utf-8')
        self.last_modified = response.headers.get('Last-Modified').decode('utf-8')

        for item in response.xpath('//div[@class="main-content"]'):
            print(item.xpath('.//text()').extract())

通过初始化 etaglast_modified 两个变量,来记录上一次爬取数据的状态。 在第一次请求时,etaglast_modified 均为 None,并为 Spider 设置 start_requests() 函数。在此函数中,为请求添加 If-None-MatchIf-Modified-Since 头部信息,以便服务端判断是否有新版本可用。

在解析页面之后,判断返回的状态码是否为 304,如果是 304 代表没有新版本,不需要再次进行爬取即可返回。

示例 #2:增量爬取新浪新闻的新闻标题

下面再放一个爬取新浪新闻的示例,爬取的内容是新闻标题。具体代码如下:

import scrapy
from scrapy.http import Request

class SinaSpider(scrapy.Spider):
    name = 'sina'
    allowed_domains = ['news.sina.com.cn']
    start_urls = ['http://news.sina.com.cn/']

    etag, last_modified = None, None

    def start_requests(self):
        headers = {
            'If-None-Match': self.etag,
            'If-Modified-Since': self.last_modified
        }

        yield Request(url=self.start_urls[0], headers=headers)

    def parse(self, response):
        if response.status == 304:
            print('没有新内容,直接返回即可')

        self.etag = response.headers.get('ETag').decode('utf-8')
        self.last_modified = response.headers.get('Last-Modified').decode('utf-8')

        for item in response.css('h2 a::text').extract():
            print(item.strip())

该示例的工作原理和示例 #1 相同。不过,注意到这里的解析器采用了 CSS Selector ,而不是上述示例中使用的 XPath 。

总结

通过这两个示例可以看出,Scrapy 框架的增量爬虫功能并没有像我们想象的那么难。只要我们在构建 Scraper 实例时,添加好上次爬取结果的状态信息,在请求时也带上上次请求结果的时间信息,并在解析器中进行状态和时间的更新,就可以实现增量式爬虫啦。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python爬虫scrapy框架之增量式爬虫的示例代码 - Python技术站

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

相关文章

  • 如何使用 Python 从已知私钥生成以太坊公钥

    【问题标题】:How do I generate an Ethereum public key from a known private key using Python如何使用 Python 从已知私钥生成以太坊公钥 【发布时间】:2023-04-07 02:23:01 【问题描述】: 我有兴趣使用 Python 从私钥生成以太坊公钥。我试过谷歌搜索并找到…

    Python开发 2023年4月7日
    00
  • Python 虚拟机集合set实现原理及源码解析

    Python 虚拟机集合 set 实现原理及源码解析 什么是 set set 是 Python 中的一种基本数据类型,用于存储无序、不重复的元素集合。set 的特点是: 无序性:set 中没有元素的顺序关系。 互异性:set 中的元素都是唯一的,重复的元素会被自动忽略。 set 中可以存储任意类型的数据,例如数字、字符串、元组等不可变类型,但是不能存储可变类…

    python 2023年6月7日
    00
  • python 中defaultdict()对字典进行初始化的用法介绍

    下面是关于“python 中defaultdict()对字典进行初始化的用法介绍”的详细攻略: 什么是 defaultdict() 在Python中,我们经常需要使用字典(dict)这个数据结构,字典是一个无序的键值对(key-value)集合,每个键都不同,且可以通过键来访问其对应的值。但是,当我们要使用一个没有初始化的字典时,如果该字典中的键还不存在时(…

    python 2023年6月3日
    00
  • python标记语句块使用方法总结

    在Python中,标记语句块是一种非常重要的语法结构,它可以用于控制程序的流程。在本文中,我们将详细讲解Python标记语句块的使用方法,包括if语句、for循环、while循环等内容。 1. if语句 if语句是一种用于控制程序流程的语句块,它可以根据条件执行不同的代码块。以下是一个基本的if语句的示例代码: x = 10 if x > 0: pri…

    python 2023年5月14日
    00
  • Python accumulate()计算汇总值

    针对Python中的accumulate()函数计算汇总值,我可以给出如下的完整攻略(包括介绍、使用方法、示例说明等): 介绍 accumulate()是Python标准库中itertools模块提供的一个函数,用于对一个可迭代对象(比如列表、元组等)进行累加计算,返回一个包含所有结果的可迭代对象。该函数接受两个参数:一个可迭代对象iterable和一个可选…

    python-answer 2023年3月25日
    00
  • Python计算IV值的示例讲解

    下面是关于“Python计算IV值的示例讲解”的完整攻略。 标题 什么是IV值 IV指隐私保护中常用的指标,即信息量。它既反应了数据的敏感程度,又反映了数据的稀缺性。通常情况下,IV值越大,预测目标变量的能力越高。 如何计算IV值 计算IV值的公式为:IV=∑(good%−bad%)×WOE,其中good表示好样本数,bad表示坏样本数,WOE表示分割后某一…

    python 2023年5月14日
    00
  • python 包 requests 实现请求操作

    1. 什么是 requests 包 requests 是一个 Python 第三方库,用于发送 HTTP 请求。它非常简单易用,但功能强大,并且具有丰富的请求和响应数据处理能力。 2. 安装 requests 包 为了使用 requests,首先需要安装它。可以使用以下命令在终端或命令提示符中安装: pip install requests 3. 发送 GE…

    python 2023年6月3日
    00
  • 如何比较两个NumPy数组

    要比较两个NumPy数组,可以使用NumPy中的比较函数,这些函数返回一个布尔数组,该数组表示每个元素是否满足比较条件。下面是一些常用的比较函数: numpy.array_equal(x, y) : 如果两个数组x和y的形状和元素的值都相等,则返回True,否则返回False。 numpy.allclose(a, b, rtol=1e-05, atol=1e…

    python-answer 2023年3月25日
    00
合作推广
合作推广
分享本页
返回顶部