Python爬虫之增量式爬虫

相关介绍

增量式爬虫是一种用于爬取网页信息的技术,它与全量式爬虫相比具有更高效和节省资源的特点。

增量式爬虫的基本原理是通过比较已爬取的数据和新爬取的数据,只爬取和更新最新的数据。它会记录上一次爬取的状态,将新爬取的数据和已有的数据进行匹配和对比,只提取出新数据并进行存储。

增量式爬虫的优势在于可以减少对目标网站的访问次数和资源消耗,同时也能够保证数据的及时更新。它能够根据需求定制爬取规则,从而提高爬取的效率和精确度,减少重复爬取的数据。

增量式爬虫一般包括以下几个步骤:

  1. 初始化:设置爬取的起始点和爬取规则。

  2. 爬取网页:按照规定的规则和策略爬取网页内容,并将爬取的数据存储到数据库中。

  3. 数据对比和更新:将新爬取的数据与已有的数据进行对比,判断是否是新的数据。如果是新数据,则进行存储更新。

  4. 持续爬取:根据设定的规则和策略,定时或定量地进行持续的爬取和更新。

通过增量式爬虫,可以实现对目标网站数据的高效爬取和及时更新,提高了爬取的效率和精确度,减少了资源的浪费和重复爬取的数据量。

项目案例实战

前言:

本次案例基于Scrapy的CrawlSpider快速爬取,以及Scrapy-Redis的数据储存,来爬取电影网站标题和详情介绍

eight.py为开始创建CrawlSpider的项目名,其余全部自动生成

全部所需文件:

eight.py文件代码

python 复制代码
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from redis import Redis
from eightBlood.items import EightbloodItem


class EightSpider(CrawlSpider):
    name = "eight"
    # allowed_domains = ["www.baidu.com"]
    start_urls = ["http://kan.znds.com/movie/"]

    # 根据每个url规律写出正则表达式
    rules = (Rule(LinkExtractor(allow=r"p_\d+"), callback="parse_item", follow=False),)

    # 连接Redis数据库
    conn=Redis(host='127.0.0.1',port=6379)

    # 解析每个页码对应页面中电影的url
    def parse_item(self, response):
       div_list=response.xpath("/html/body/section[3]/div")
       # 获取详情页的url
       for div in div_list:
           detail_url="http://kan.znds.com"+div.xpath("./a/@href").extract_first()

           # 将爬取的每个电影详情页url存储到redis的urls中
           ex=self.conn.sadd('urls',detail_url)

           # 对是否爬取过的数据进行判断
           if(ex==1):
               print("该url没有被爬取过,可以进行数据的爬取")
               yield scrapy.Request(url=detail_url,callback=self.parse_detail)
           else:
               print("数据还没更新,暂时无数据可以爬取!")

    # 保存爬取的电影名和电影描述到item中
    def parse_detail(self, response):
        item=EightbloodItem()
        item['name']=response.xpath("/html/body/section[2]/div[2]/article/h1/a/text()").extract_first()
        item['desc']=response.xpath("/html/body/section[3]/span/p/text()").extract()
        item['desc']=''.join(item['desc'])
        yield item;

items.py文件

python 复制代码
import scrapy


class EightbloodItem(scrapy.Item):
    name= scrapy.Field()
    desc = scrapy.Field()
复制代码
pipelines.py文件
python 复制代码
from itemadapter import ItemAdapter

class EightbloodPipeline:
    conn=None
    def open_spider(self,spider):
        self.conn=spider.conn

    def process_item(self, item, spider):
        data={
            'name':item['name'],
            'desc':item['desc']
        }

        # 输出字典对象
        print(data)
        self.conn.lpush('MovieData',str(data))
        return item

setting.py文件设置

python 复制代码
ROBOTSTXT_OBEY = False

LOG_LEVEL='ERROR'

USER_AGENT="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0"

ITEM_PIPELINES = {
   "eightBlood.pipelines.EightbloodPipeline": 300,
}

运行项目:

打开redis服务器

cmd打命令行cd 项目,输入scrapy crawl eight

运行过程:

运行结果:

相关推荐
用户29869853014几秒前
Python 实战:Markdown 转 PDF 的代码实现与页面设置
python·api·markdown
thusloop2 分钟前
零门槛接入 GPT-6-astra 与 claude-opus-5-5,三大场景实战指南
python·gpt·算法·agent·claude·codex
程序猿乐锅13 分钟前
Streamlit 实现 AI 聊天 Agent:角色提示词、流式输出与会话管理
开发语言·前端·笔记·后端·python·学习
小南知更鸟17 分钟前
【2026 年 Python 包管理工具选型:从“工具崇拜”回到工程约束】
开发语言·python
TomEval23 分钟前
【测AI】第20篇:大模型安全测试 —— 越狱攻击与防护
人工智能·python·功能测试·ai·aigc·测试用例·安全性测试
RuoyiOffice33 分钟前
达梦 DM8 + openGauss:RuoYi Office 的 MySQL 数据转换与导入实践
数据库·spring boot·python·sql·信创
用户03321266636733 分钟前
轻松使用 Python 将 RTF 转换为 Word 文档(含批量转换与格式互转)
python
努力努力再努力wz38 分钟前
【Lua入门系列】从动态类型到变量作用域:彻底理解 local、全局变量与跨文件访问
开发语言·junit·lua
程序猿乐锅44 分钟前
面向对象练习:图书借阅系统里的封装、抽象类与多态
开发语言·前端·数据库·后端·python·学习·1024程序员节
xyouyuweizhu1 小时前
Java IO 流详解:流的作用、流的划分与标准输入输出流
java·python·php