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

这篇具有很好参考价值的文章主要介绍了【爬虫系统设计系列】模板爬虫的动态配置策略设计与实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 写在前面

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

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

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


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

设计方案:

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

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

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

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

2. 页面配置规划

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


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

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

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

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

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

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

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

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

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

可以看到上图在请求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提取规则失效,可直接在线编辑更新,如下所示:

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

5. 模板爬虫优势

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

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

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

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

  好了,到这里又到了跟大家说再见的时候了。创作不易,帮忙点个赞再走吧。你的支持是我创作的动力,希望能带给大家更多优质的文章文章来源地址https://www.toymoban.com/news/detail-743420.html

到了这里,关于【爬虫系统设计系列】模板爬虫的动态配置策略设计与实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • GO 的 Web 开发系列(八)—— Gin 自定义 Html 渲染实现多租户的模板设计

    本文主要解决在多租户场景下的模板渲染问题。 正常情况下 Gin 配置的所有模板都属于同一个模板组合,相同名称的模板将相互覆盖。在未通过 define 指定模板名称时,同名模板文件也将相互覆盖。自定义函数中也无法区分租户,这将非常不方便我们进行多租户的模板渲染处

    2024年04月22日
    浏览(40)
  • 设计模式:模板模式和策略模式混合使用

    有时单个设计模式并不能满足我们的业务需求,这个时候就要根据具体的业务来混合使用设计模式,其中模板模式和策略模式是比较常用的一个组合。模板模式可以定义这个逻辑的骨架,策略模式可以丰满具体细节的逻辑。 这个示例中,我们定义了一个策略接口和两个策略实

    2024年02月07日
    浏览(40)
  • 常见的设计模式(模板与方法,观察者模式,策略模式)

    随着时间的推移,软件代码越来越庞大,随着而来的就是如何维护日趋庞大的软件系统。在面向对象开发出现之前,使用的是面向过程开发来设计大型的软件程序,面向过程开发将软件分成一个个单独的模块,模块之间使用函数进行组合,最后完成系统的开发,每次需要修改

    2024年01月22日
    浏览(35)
  • 基于网络爬虫的商品询价系统的设计与实现(Python)

    目录 一、前言 1 1.1 背景 1 1.2 用到的技术简述 1 1.2.1 网络爬虫技术 2 1.2.2 UI设计 3 1.2.3 数据库设计 3 二、设计过程 3 2.1 面向对象设计 3 2.1.1 由需求导出用例图 4 2.1.2 类的确定 4 2.1.3 实体类的设计 6 2.1.4 功能类的设计 6 cursor.execute( 6 2.2 UI设计 11 一、前言 1.1 背景 近几年来网络购

    2024年02月05日
    浏览(38)
  • 基于Django爬虫项目网络表情包爬虫展示系统设计与实现(Pycharm+Python+Mysql)

     博主介绍 :黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育和辅导。 所有项目都配有从入门到精通的基础知识视频课程,学习后应对毕业设计答辩。 项目配有对应开发文档、

    2024年03月15日
    浏览(40)
  • 基于Python的网络爬虫电商数据采集系统设计与实现

     博主介绍 :黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育和辅导。 所有项目都配有从入门到精通的基础知识视频课程,免费 项目配有对应开发文档、开题报告、任务书、

    2024年02月04日
    浏览(45)
  • 毕业设计——基于网络爬虫的电影数据可视化分析系统的设计与实现(综述+爬虫源码+web可视化展示源码)

    整个系统包括两大部分,如需要完整源码,可私信博主 一部分是使用python构建的爬虫,可爬取豆瓣电影数据并将爬取的数据存储在csv中,同时写入MySQL数据库。第二部分是针对爬取的数据进行多维数据清晰和分析,采用Flask框架进行前端的可视化呈现。 爬虫部分的基本原理:

    2024年04月16日
    浏览(82)
  • 基于python重庆招聘数据爬虫采集系统设计与实现(django框架)

     博主介绍 :黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育和辅导。 所有项目都配有从入门到精通的基础知识视频课程,免费 项目配有对应开发文档、开题报告、任务书、

    2024年01月23日
    浏览(45)
  • 设计模式深度解析:AI大模型下的策略模式与模板方法模式对比解析

    ​🌈 个人主页: danci_ 🔥 系列专栏: 《设计模式》《MYSQL应用》 💪🏻 制定明确可量化的目标,坚持默默的做事。 策略模式与模板方法模式对比解析         在人工智能的世界里,设计模式不仅是构建高效、可维护代码的秘密武器,也是理解和掌握大模型内在机制的钥

    2024年04月08日
    浏览(79)
  • Python吉林长春二手房源爬虫数据可视化系统设计与实现

     博主介绍 :黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育和辅导。 所有项目都配有从入门到精通的基础知识视频课程,学习后应对毕业设计答辩。 项目配有对应开发文档、

    2024年04月28日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包