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

news2025/7/19 16:18:40

文章目录

  • 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信息,而不需要修改底层代码。这减少了因网站变更而导致的爬虫维护工作
  • 适用性广泛:模板爬虫通常具有通用性,可以用于多个网站,只需通过配置适应不同的数据源。这提高了爬虫的适用性,使其可用于多种数据采集任务
  • 降低错误风险:由于不需要手动编写复杂的爬虫代码,减少了出现错误的机会,提高了数据提取的准确性
  • 自动化任务生成:模板爬虫通常能够生成自动化任务,定期运行爬虫以获取最新的数据,这对于需要定期更新数据的应用非常有用

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【蓝桥杯选拔赛真题45】python调和级数 青少年组蓝桥杯python 选拔赛STEMA比赛真题解析

目录 python调和级数 一、题目要求 1、编程实现 2、输入输出 二、算法分析

众和策略:微软大动作

当地时间周二,美股首要指数全线收涨。但从月度数据来看,美股首要指数录得“三连跌”,10月份,道指跌1.36%,标普500指数跌2.2%,纳指跌2.78%。其间,标普和道指均为2020年3月以来初次呈现三个月连跌…

不容错过的设计软件,产品设计必看

一.图片绘制和处理工具 产品设计很多时候是需要完成产品效果图的相关工作,所以一些图片绘制和处理工具,二维或三维的都需要了解一下。 2D软件: 1、photoshop(PS) AdobePhotoshop,简称“PS这是Adobe开发并发布的一款图片处理软…

innovus: set_ccopt_property的基本用法

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 clock route clock route的net type分为三种,分别是root、trunk和leaf,其中root是指fanout超过routing_top_fanout_count约束的net,leaf是指…

mysql:B+树/事务

B树 : 为了数据库量身定做的数据结构 我们当前这里的讨论都是围绕 mysql 的 innodb 这个存储引擎来讨论的 其他存储引擎可能会用到hash 作为索引,此时就只能应对这种精准匹配的情况了 要了解 B树 我们先了解 B树, B树 是 B树 的改进 B树 有时候会写作 B-树 (这里的" -…

GB28181协议怎样执行保活命令

前言 GB28181协议是视频监控领域的国家标准,本文将解析如何在FFmpeg中增加对GB28181协议的支持,使其可以与支持GB28181协议的设备进行通信与控制,实现设备的注册、保活以及流媒体的传输。 背景介绍 GB28181协议指的是国家标准GB/T 28181—…

自学SLAM(6)相机与图像实践:OpenCV处理图像与图像拼接(点云)

前言 如果写过SLAM14讲第一次的作业,或者看过我之前的运行ORB_SLAM2教程应该都安装过OpenCV了,如果没有安装,没关系,可以看我之前的博客,里面有如何安装OpenCV。 链接: 运行ORB-SLAM2(含OpenCV的安装&…

加强城市内涝积水监测系统建设,提高城市预警功能

近年来,随着城市化进程的不断加快,城市内涝问题愈发凸显,给城市的生命线带来了严重威胁。为了及时掌握城市内涝的情况,保障城市的正常运行,各地纷纷建立了城市内涝监测系统。城市内涝监测系统作为城市生命线的重要组成…

Redis与MySQL的数据情感:延迟双删的秘密揭示

Redis与MySQL的数据情感:延迟双删的秘密揭示 前言第一:mysql与redis数据不一致问题第二:为什么需要双删第三:如何实现延迟双删 前言 在现代应用程序中,MySQL 和 Redis 是两种常用的数据存储解决方案。然而&#xff0c…

金蝶云星空自定义校验器和使用

文章目录 金蝶云星空自定义校验器和使用 金蝶云星空自定义校验器和使用 1、创建类,并继承抽象接口 using Kingdee.BOS.Core; using Kingdee.BOS.Core.Validation; using System;namespace mm.K3.SCM.App.Service.PlugIn.SC.Validator {public class AfterOrderChe…

Python使用got库如何写一个爬虫代码?

got库是一个Python的HTTP库,可以用于爬取网页数据。它提供了简单易用的API,支持异步请求和爬虫IP设置等功能。使用got库进行爬虫开发,可以快速地获取所需数据。下面是使用got库进行爬虫的基本步骤: 1、安装got库:可以使…

如何正确学习中国传统画——画家蒋旗

艺术简介 蒋旗: 师从张建中、张立辰 授教于郭石夫、陈曦林、薛永年、张旭光、乔森、于光华、高卉民、潘晓云 中国书画院院士 清华美院大写意花鸟画高研班助教导师 安徽美术家协会会员 泗县美术家协会副主席 青藤画社社长。 在艺术多元发展的当下&#xff0c…

【23真题】Top3简单专业课似双非!

今天分享的是23年复旦大学957的信号与系统试题及解析。 本套试卷难度分析:这套卷子平均分为120左右,最高分145分。22年复旦大学957信号与系统,我也发布过,若有需要戳这里自取!本套试题内容难度中等偏下,说…

AutoGen完整教程和加载本地LLM示例

Autogen是一个卓越的人工智能系统,它可以创建多个人工智能代理,这些代理能够协作完成任务,包括自动生成代码,并有效地执行任务。 在本文中,我们将深入探讨Autogen,并介绍如何让AutoGen使用本地的LLM Auto…

山西电力市场日前价格预测【2023-11-02】

日前价格预测 预测说明: 如上图所示,预测明日(2023-11-02)山西电力市场全天平均日前电价为151.67元/MWh。其中,最高日前电价为280.23元/MWh,预计出现在22:15。最低日前电价为0.00元/MWh,预计出…

编程助手DevChat:让开发更轻松

#AI编程助手哪家好?DevChat“真”好用 # 目录 前言一、安装Vscode1、下载链接2、安装 二、注册DevChat1、打开注册页2、验证成功完成邮箱绑定3、绑定微信可获得8元 三、安装插件四、配置Access Key1、获取Access Key2、设置Access Key①、点击左下角管理&#xff08…

(五)库存超卖案例实战——使用zookeeper分布式锁解决“超卖”问题

前言 本节内容使用zookeeper实现分布式锁,完成并发访问“超卖”问题的解决。相对于redis分布式锁,zookeeper能够保证足够的安全性。关于zookeeper的安装内容这里不做介绍,开始本节内容之前先自行安装好zookeeper中间键服务。这里我们利用创建…

Redis与Mysql的数据一致性(双写一致性)

双写一致性:当修改了数据库的数据也要同时的更新缓存的数据,使缓存和数据库的数据要保持一致。 一般是在写数据的时候添加延迟双删的策略 先删缓存 再修改数据 延迟一段时间后再次删除缓存 这种方式其实不是很靠谱 一致性要求高 共享锁:读…

Leetcode刷题---删除有序数组中的重复项 II(双指针问题)

题目描述: 题目中已经给出该数组是一个升序的数组。要求数组中最多出现两个相同的元素,而且不能使用额外的存储空间,并且将新的数组的长度返回。 解题思想: 该题可以使用双指针来解决,我们可以定义一个快指针和一个…

安装docker报错:except yum.Errors.RepoError, e:

问题描述: 在安装docker的时候,配置阿里云地址出现以下问题 问题原因: linux 系统中存在多版本的python. yum 依赖 python 2, 而个人使用 python 3 导致. 解决办法: 修改 /usr/bin/yum-config-manager文件中第一行 #!/usr/bin/p…