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

针对这个主题,我可以提供一份针对“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中使用Cat命令

    在Python中,可以通过调用操作系统的命令来使用Cat命令。Cat命令可以将一个或多个文件的内容输出到终端。下面是使用Cat命令的完整攻略: 命令格式 cat [选项] [文件] 选项可以有以下几种: -b:对非空行进行编号,空行不编号。 -n:对所有行进行编号。 -s:将连续的多个空行压缩成一个空行。 文件可以是一个或多个文件名,文件名之间用空格隔开。如…

    python-answer 2023年3月25日
    00
  • python 多维高斯分布数据生成方式

    生成符合多维高斯分布的数据在机器学习等领域中是常见的需求。Python提供了多种方法来生成这样的数据。本文将讲解Python实现多维高斯分布数据生成的方法。 什么是多维高斯分布 多维高斯分布,也称多元正态分布,是指n个随机变量X1, X2, …, Xn在它们的概率密度函数中满足以下形式的分布: $$p(\textbf{x})=\dfrac{1}{(2\pi)…

    python 2023年6月3日
    00
  • Python中实现两个字典(dict)合并的方法

    在Python中,合并两个字典(dict)的方法有多种,下面将介绍其中三种比较常用的方法。 方法一:update方法 Python中的update()方法可以将一个字典合并到另一个字典中。 # 示例1 dict1 = {‘name’: ‘Lucy’, ‘age’: 18} dict2 = {‘gender’: ‘female’, ‘height’: ‘168…

    python 2023年5月13日
    00
  • python tkinter模块的简单使用

    Python tkinter模块可以创建GUI应用程序,可以帮助我们快速地构建图形界面,为用户提供更加友好的交互体验。 安装 在安装Python的时候,默认会安装tkinter模块,一般情况下可以直接使用,如果需要确认是否安装有此模块,可以使用以下命令: import tkinter 如果报错,证明没有安装此模块,需要进行安装。 基本用法 首先,我们需要导入…

    python 2023年6月13日
    00
  • 健身房被搭讪?用python写了个小米计时器助人为乐

    题目中提到的“健身房被搭讪,用Python写了个小米计时器助人为乐”是一个受欢迎的故事,这个小工具可以帮助想在健身房锻炼的人避免被别人打扰。下面将提供完整攻略,以实现类似的计时器工具。 第一步:为你的计时器建立一个Python脚本 首先,你需要在Python中编写一个脚本,来实现计时器的功能。这个脚本将会使用 Python 中的 time 模块和计时器提醒模…

    python 2023年6月2日
    00
  • Biblibili视频投稿接口分析并以Python实现自动投稿功能

    Bilibili是一个中国视频分享网站,提供了视频上传、播放、评论等功能。本文将详细讲解Bilibili视频投稿接口分析并以Python实现自动投稿功能的完整攻略,包括如何分析Bilibili视频投稿接口、如何使用Python实现自动投稿功能等。 分析Bilibili视频投稿接口 在Bilibili中,我们可以使用POST方法向以下URL地址发送视频投稿请求…

    python 2023年5月15日
    00
  • 如何通过模仿 Python 中的 reduce 函数来找到列表中的最大整数?

    【问题标题】:How do I find the maximum integer in a list by mimicking the reduce function in Python?如何通过模仿 Python 中的 reduce 函数来找到列表中的最大整数? 【发布时间】:2023-04-03 22:34:01 【问题描述】: 所以这就是我想出的。我定…

    Python开发 2023年4月8日
    00
  • 利用python将图片版PDF转文字版PDF

    下面是“利用Python将图片版PDF转换为文字版PDF”的完整攻略,具体流程如下: 准备工作 为了完成PDF转换,你需要先准备以下工具: 1.OCR(Optical Character Recognition,光学字符识别)库,用于将图片中的文字转换成文本格式,比较常用的有pytesseract和easyOCR;2.Python环境。 在第一步,你需要安装…

    python 2023年5月18日
    00
合作推广
合作推广
分享本页
返回顶部