【爬虫系统设计系列】模板爬虫的动态配置策略设计与实现

文章目录

  • 1. 写在前面
  • 2. 页面配置规划
  • 3. 制定模板格式
  • 4. 模板引擎实现
  • 5. 模板爬虫优势

1. 写在前面

  作为一名爬虫开发者来说,涉及数据采集和爬虫开发时,往往都面临着各种挑战。包括技术复杂性、维护成本以及数据源结构的不断变化

早期我们对爬虫开发方式需要深入了解底层框架和编写大量的自定义代码,这对于没有技术背景的人来说可能是一个门槛过高的任务

但现在!我们可以使用模板爬虫的方式去简化爬虫开发的过程,降低技术门槛,提高可维护性的同时使数据采集变得更加高效和容易!


在这里插入图片描述

设计方案:

1、页面配置:通过页面可视化配置方式,提交翻页、数据抽取等规则

2、模板配置文件: 创建通用且固定的配置文件,用来填充XPATH

3、爬虫生成器(引擎): 模板爬虫使用这个生成器来读取配置文件,并生合规可用的爬虫工程代码

在这篇文章中,将深入探讨模板爬虫的设计和实现,以及如何利用其优势来轻松采集各种类型的网络数据

2. 页面配置规划

  这里我将模板采集作为爬虫系统内部的一个独立模块去讲解,就像是爬虫可视化服务一样(之后会讲可视化)。需要打造的就是一个可配置化的爬虫生成服务


适用范围:新闻、资讯、论坛类等爬虫代码结构无需改变,只需要填充更新XPATH内容即可采集的网站

以下图我之前开发的页面为例,开发人员只需要配置一下网站的XPATH即可生成Scrapy可运行爬虫。下面的配置页面我主要是为了适用一些三方的APP应用市场,包括上面说到的几大类网站,它们都有很多共性,网站的结构也大致都分为列表页、详情页

在这里插入图片描述

除了常规的页面基础配置以外,我们在应对一些含增量更新采集的网站(社交媒体、新闻等含发布时间的网站)则可以在前端的页面上增设终止采集的条件,按照时间或翻页量来实现效果

在这里插入图片描述

如下是某APP安卓应用市场网站页面,大部分都如此排版,比较规整。像这种相似度极高的网站,当需采集需要达到一定量级的时候,可以投入更多的时间去开发通用智能爬虫,对列表页进行智能识别采集,对详情页数据进行智能抽取!

在这里插入图片描述

继续往下还有一个配置项,我这里的话是为了应对APK文件下载。因为很多网站的APK下载大部分都是Ajax加载的接口,算是一个拓展配置项来处理通过接口下载APK文件

在这里插入图片描述

可以看到上图在请求APK下载接口时还有一些其他的配置项选择,因为一般都是POST请求,且下载接口的参数请求头都会出现变化

3. 制定模板格式

  这里模板文件我使用的.py.tpl格式。因为在一些项目中, .py.tpl文件可能被用作代码模板文件!

这些模板文件包含占位符、标记或特殊语法,用于生成Scrapy爬虫代码。如{variable_name}或{% if condition %},然后使用特定的模板引擎或自定义脚本,将这些占位符替换为实际的Python代码

模板文件的典型用例包括代码生成,自动化脚本,和一些需要生成大量重复代码的应用程序。使用模板可以减少手动编写重复代码的工作,提高开发效率

通过上面我们的页面输入数据提取规则,爬虫程序可以读取这些模板并根据规则执行相应的数据提取操作。这使得爬虫的规则和配置可以被灵活地管理和修改,而无需修改源代码

Scrapy爬虫的.py.tpl文件内容如下所示:

class MarketSpider(scrapy.Spider):
    HTTPERROR_ALLOWED_CODES = [502]
    headers = {
        "accept": "*/*",
        "accept-encoding": "gzip, deflate, br",
        "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36"
    }

    def __init__(self, *args, **kwards):
        self.taskid = kwards.get("taskid")
        super(MarketSpider, self).__init__(*args, **kwards)

    name = '${project.get("name")}'
    market = '${project.get("market")}'
    market_name = '${project.get("market_name")}'
    market_id = ${project.get('market_id')}
    start_urls = ${project.get('start_urls').split(',')}

def parse(self, response, **kwargs):
	page_list = response.xpath(
	    '${project.get("rules").get("list_page").get("rule")}').getall()
	for _url in page_list:
	    yield scrapy.Request(url=response.urljoin(_url), headers=self.headers,
	                         callback=self.parse_detail
	                         )
	
	next_page = response.xpath('${project.get("rules").get("paging").get("rule")}').get()
	if next_page:
	    yield scrapy.Request(url=response.urljoin(next_page),
	                        callback=self.parse
	                        )

4. 模板引擎实现

  有了上面固定的.py.tpl模板文件,这个时候我们需要的则是编写一个生成器(引擎)来负责自动生成Scrapy爬虫文件:

# -*- coding: utf-8 -*-
import os
import re
import zipfile
import shutil
from mako.template import Template


def add_zipfile(source_dir, output_filename):
    f = zipfile.ZipFile(output_filename, 'w', zipfile.ZIP_DEFLATED)
    for dirpath, dirnames, filenames in os.walk(source_dir):

        for filename in filenames:
            f.write(os.path.join(dirpath, filename))
    f.close()

class BaseTemplate(object):

    def __init__(self, template_name, output_name):
        self.template = Template(filename=template_name) 
        self.output_filename = os.path.join('template_files', output_name)

    def render(self, **kwargs):
        with open(self.output_filename, "w+") as f:
            f.write('# -*- coding: utf-8 -*-')
            f.write(self.template.render(**kwargs))

class CrawlTemplate(BaseTemplate):

    def render(self, *args, **kwargs):
        super(CrawlTemplate, self).render(*args, **kwargs)

def _generate_crawl_template(project):
    rex = re.compile('\.(.*)\.')
    spider_name = rex.findall(project['market'])[0]
    project.update(name=spider_name)
    t = CrawlTemplate(
        template_name="spider/template.py.tpl",
        output_name=spider_name +
        "_{}.py".format(
            project['spider_type']))
    t.render(**{"project": project})

def generate_crawl(template):
    _generate_crawl_template(template)

这个引擎在什么时候调用?一般十在前端页面配置XPATH规则完点击提交生成以后调用

我这里的话是在配置完XPATH规则信息后,点击生成模板会存储模板信息。然后通过下载或者直接发布的方式去运行爬虫,当然还有一个编辑功能,这个功能应对页面改版导致的XPATH提取规则失效,可直接在线编辑更新,如下所示:

在这里插入图片描述

5. 模板爬虫优势

  模板爬虫的主要优势在于简化了爬虫的开发过程,降低了技术门槛,提高了爬虫的可维护性和灵活性,具体有以下几点优势:

  • 降低技术门槛:使用模板爬虫的开发者无需深入了解底层爬虫框架(如Scrapy)的工作原理和编程细节。他们只需配置页面中的XPath信息,而无需编写复杂的代码。这使得更多的人能够参与爬虫开发,包括非技术人员
  • 提高开发效率: 通过简单的配置,模板爬虫可以自动生成可运行的Scrapy爬虫代码。这加速了开发过程,特别是对于需要快速构建爬虫的项目而言,可以大幅减少开发周期
  • 可维护性: 使用模板爬虫可以更容易地维护和更新爬虫。当目标网站的结构变化时,只需更新配置文件中的XPath信息,而不需要修改底层代码。这减少了因网站变更而导致的爬虫维护工作
  • 适用性广泛:模板爬虫通常具有通用性,可以用于多个网站,只需通过配置适应不同的数据源。这提高了爬虫的适用性,使其可用于多种数据采集任务
  • 降低错误风险:由于不需要手动编写复杂的爬虫代码,减少了出现错误的机会,提高了数据提取的准确性
  • 自动化任务生成:模板爬虫通常能够生成自动化任务,定期运行爬虫以获取最新的数据,这对于需要定期更新数据的应用非常有用

我们需要注意的是,尽管模板爬虫有这些优势,但并不是所有爬虫任务都适合使用模板爬虫。对于一些复杂的、高度定制(包括有加密的)爬虫任务,我们仍然需要手动编写爬虫代码

在选择是否使用模板爬虫时,需要根据具体的项目需求和复杂性进行权衡和决策!

  好了,到这里又到了跟大家说再见的时候了。创作不易,帮忙点个赞再走吧。你的支持是我创作的动力,希望能带给大家更多优质的文章

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/111643.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

虚拟机风格>解释器风格

1.解释器风格 解释器作为一种体系结构,主要用于构建虚拟机,以弥合程序语义和计算机硬件之间的间隙。在解释器结构中,主要包括一个执行引擎和三个存储器。它的实质是利用软件创建的一种虚拟机,因此,解释器风格又被称为…

OS 死锁

资源问题 引起死锁的主要是需要采用互斥访问方法的、不可被抢占的资源 可重用资源和可消耗资源 可重用资源 定义:一种可供用户重复使用多次的资源 性质: 每个可重用资源中的单元,只能分配给一个进程使用,不允许多个进程共享…

iOS的应用生命周期以及应用界面

在iOS的原生开发中,我们需要特别关注两个东西:AppDelegate和ViewController。我们主要的编码工作就是在AppDelegate和ViewControlle这两个类中进行的。它们的类图如下图所示: AppDelegate是应用程序委托对象,它继承了UIResponder类…

分布式:一文吃透分布式事务和seata事务

目录 一、事务基础概念二、分布式事务概念什么是分布式事务分布式事务场景CAP定理CAP理论理解CAPCAP的应用 BASE定理强一致性和最终一致性BASE理论 分布式事务分类刚性事务柔性事务 三、分布式事务解决方案方案汇总XA规范方案1:2PC第一阶段:准备阶段第二…

【C++的OpenCV】第十四课-OpenCV基础强化(三):单通道Mat元素的访问之data和step属性

🎉🎉🎉 欢迎来到小白 p i a o 的学习空间! \color{red}{欢迎来到小白piao的学习空间!} 欢迎来到小白piao的学习空间!🎉🎉🎉 💖 C\Python所有的入门技术皆在 我…

Python Django 之全局配置 settings 详解

文章目录 1 概述1.1 Django 目录结构 2 常用配置:settings.py2.1 注册 APP:INSTALLED_APPS2.2 模板路径:TEMPLATES2.3 静态文件:STATICFILES_DIRS2.4 数据库:DATABASES2.5 允许访问的主机:ALLOWED_HOSTS 1 …

【Linux】进程的概念

文章目录 1. 基本概念2. 进程的描述3. 进程的一些基本操作3.1 查看进程3.2 结束进程3.3 通过系统调用获取进程标示符3.4 通过系统调用来创建子进程 4. 进程状态4.1 操作系统的进程状态4.2 Linux对于这些状态的处理方式 1. 基本概念 什么是进程? 在回答这个问题之前…

C++标准模板(STL)- 类型支持 (复合类型类别,is_member_pointer,is_reference,is_compound)

类型特性 类型特性定义一个编译时基于模板的结构&#xff0c;以查询或修改类型的属性。 试图特化定义于 <type_traits> 头文件的模板导致未定义行为&#xff0c;除了 std::common_type 可依照其所描述特化。 定义于<type_traits>头文件的模板可以用不完整类型实例…

kafka为什么如此之快?

天下武功&#xff0c;唯快不破。同样的&#xff0c;kafka在消息队列领域&#xff0c;也是非常快的&#xff0c;这里的块指的是kafka在单位时间搬运的数据量大小&#xff0c;也就是吞吐量&#xff0c;下图是搬运网上的一个性能测试结果&#xff0c;在同步发送场景下&#xff0c;…

详解:WMS系统IQC来料检验

WMS系统IQC来料检验是仓库管理系统(WMS)中的一个重要环节,它的目的是对进仓原材料进行抽样检验,以确保入库的原材料符合质量标准。WMS系统通过对仓库的收货、存储、配送、装车和信息管理等过程实现集中化、规范化、标准化、自动化的管理。IQC即进货质量抽查。 IQC来料检验的目的…

Mybatis学习

一、 1.第一个mybatis程序 层层递进&#xff0c;SqlSession用来执行sql语句&#xff0c;SqlSession是与数据库的一次会话。 通过SqlSessionFactory获取SqlSession 通过SqlSessionBuilder的build()方法获取SessionFactory 2.第一个程序就找了30分钟的错&#xff08;悲惨&…

【Redis】redis的过期策略如何实现有关定时器的补充

文章目录 redis的过期策略如何实现关于定时器的补充基于优先级队列/堆实现的定时器基于时间轮实现的定时器 redis的过期策略如何实现 注意&#xff1a;不能直接遍历所有的key来判断当前key是否过期&#xff0c;这样子效率非常低&#xff0c;redis整体策略是&#xff1a;定期删…

Java中String的split函数的详解及应用

文章目录 一、 split函数详解二、应用 一、 split函数详解 split(String regex)为java.lang.String类的方法&#xff0c;其功能通俗的说就是以传入的分隔符参数拆分该字符串 方法具体为&#xff1a; public String[] split(String regex) {return split(regex, 0); }方法内部…

4.2 SSAO算法 屏幕空间环境光遮蔽

一、SSAO介绍 AO 环境光遮蔽&#xff0c;全程Ambient Occlustion&#xff0c;是计算机图形学中的一种着色和渲染技术&#xff0c;模拟光线到达物体能力的粗略的全局方法&#xff0c;描述光线到达物体表面的能力。 SSAO 屏幕空间环境光遮蔽&#xff0c;全程 Screen Space Amb…

MySQL与MongoDB,该如何做技术选型?

hello&#xff0c;大家好&#xff0c;我是张张&#xff0c;「架构精进之路」公号作者。 引言 一般情况下&#xff0c;会考虑到MySQL与MongoDB如何做技术选型的时候&#xff0c;你一定是遇到了类似于非结构化数据JSON的存取难题&#xff0c;否则大家都直接MySQL开始搞起了。 为什…

matlab simulink PMSM_SVPWM PI转速控制

1、内容简介 略 8-可以交流、咨询、答疑 2、内容说明 略PMSM_SVPWM PI转速控制 PMSM SVPWM PI转速控制 3、仿真分析 4、参考论文 略

电脑办公最佳拍档 夸克网盘升级低耗能备份、PDF阅读器等功能

临近年终&#xff0c;上班族不仅要总结过去一年的成绩还要开始制定新规划&#xff0c;在这个过程中整理资料是必不可少的环节。对于经常需要使用文件备份和PDF的用户&#xff0c;推荐大家试一下夸克网盘电脑端&#xff0c;升级后的“低耗能备份”和“PDF阅读器”让备份体验更丝…

面试150题做题记录

面试150题做题记录 题目1: 合并两个有序数组 题目1: 合并两个有序数组 题目&#xff1a;https://leetcode.cn/problems/merge-sorted-array/?envTypestudy-plan-v2&envIdtop-interview-150 最优思路&#xff1a;利用原有数列的单调性质&#xff0c;从右往左遍历&#xff…

MySQL启动后反复重新启动故障

MySQL版本为5.6.45 系统为Ubuntu 20.04 LTS 该服务器重启后&#xff0c;MySQL需要手动执行启动。 运行执行脚本后发现异常&#xff0c;如下图&#xff1a; 提示MySQL服务在不停重复启动。 反复使用ps -ef |grep mysql命令查看&#xff0c;发现mysql进程号一直在变化&#x…

Spring Boot Web MVC

文章目录 一、Spring Boot Web MVC 概念二、状态码三、其他注解四、响应操作 一、Spring Boot Web MVC 概念 Spring Web MVC 是⼀个 Web 框架&#xff0c;一开始就包含在Spring 框架里。 1. MVC 定义 软件⼯程中的⼀种软件架构设计模式&#xff0c;它把软件系统分为模型、视…