爬虫框架Scrapy学习笔记-2

前言

Scrapy是一个功能强大的Python爬虫框架,它被广泛用于抓取和处理互联网上的数据。本文将介绍Scrapy框架的架构概览、工作流程、安装步骤以及一个示例爬虫的详细说明,旨在帮助初学者了解如何使用Scrapy来构建和运行自己的网络爬虫。
爬虫框架Scrapy学习笔记-1

文章目录

  • 前言
  • Scrapy架构概览
    • Scrapy工作流程
    • 更形象的Scrapy工作流程
      • 角色对应
      • 工作流程
    • Scrapy安装
    • Scrapy的工作流程
  • 实例
    • 创建
    • xyx/xyx/spiders/xiaoyx.py
    • yield和return
    • xyx/xyx/pipelines.py
    • Pipeline详解
    • 运行
  • 总结

Scrapy架构概览

Scrapy由以下主要组件构成:

  • 引擎(Engine):负责控制数据流在各个组件之间的流动,触发事务。
  • 调度器(Scheduler):接收引擎发过来的Request请求,去重后入队列,并在合适时机返回请求给引擎。
  • 下载器(Downloader):负责获取Scrapy引擎发送的Request请求对应的响应,并返回Response给引擎。
  • 爬虫(Spider):解析响应内容,提取Item字段数据或生成额外的Request请求。
  • 项目管道(Pipeline):处理爬虫提取出的Item,进行后续处理,例如数据清洗、存储等。
  • 下载器中间件(Downloader Middlewares):可以自定义扩展下载器的功能和行为。
  • 爬虫中间件(Spider Middlewares):可以自定义扩展爬虫的功能和行为。

在这里插入图片描述

Scrapy工作流程

  1. Engine打开一个网站(启动请求)并将其交给Scheduler入队
  2. Scheduler处理后出队,通过Downloader Middlewares发送给Downloader执行
  3. Downloader获取网页数据,并通过Downloader Middlewares返回Response
  4. Response经过Spider Middlewares发送给Spider
  5. Spider解析Response,提取Item和生成Request
  6. Item经过Spider Middlewares,发送给Item Pipeline处理
  7. Request经过Spider Middlewares,发送给Scheduler入队
  8. Scheduler发送新的Request给Downloader,重复2-7步

更形象的Scrapy工作流程

Scrapy就是一个采集工厂,组件对应如下:

角色对应

  • Engine - 主管
  • Scheduler - 仓库管理员
  • Downloader - 采购员
  • Spider - 加工组装工人
  • Item Pipeline - 质检部门和成品仓库
  • Downloader Middlewares - 采购助手
  • Spider Middlewares - 流水线管理工程师

工作流程

  1. 主管指示仓库管理员提供原材料 —— Engine打开网站,交给Scheduler
  2. 仓库管理员按顺序取出原材料清单 —— Scheduler处理后出队
  3. 将原材料清单给采购员采购 —— 通过Downloader Middlewares发送给Downloader
  4. 采购员出去采购,并由助手进行预处理 —— Downloader获取数据,通过Downloader Middlewares返回Response
  5. 将采购回来的原材料给工人加工组装 —— Response经Spider Middlewares发送给Spider
  6. 工程师检查工作流程的合规性,并优化 —— Spider解析Response,提取Item和生成Request
  7. 产品送到质检和成品仓库 —— Item经Spider Middlewares发送给Item Pipeline
  8. 工人反馈还需要原材料清单 —— Request经Spider Middlewares发送给Scheduler
  9. 重复2-8步,直到订单完成 —— Scheduler发送Request给Downloader,进入下一个循环

Scrapy安装

建议单独开新环境,使用Virtualenv环境或Conda环境
半自动化使用.bat手动打包迁移python项目

python3.9
scrapy 2.5.1 -> scrapy-redis(0.7.2)

注意, 由于scrapy的升级.
导致scrapy-redis无法正常使用.所以这里我们选择2.5.1这个版本作为学习.
后期可以根据scrapy-redis的升级而跟着升级
安装完成后. 请调整OpenSSL的版本.
总之, 最终你的控制台输入scrapy version和crapy version --verbose
能显示版本号. 就算成功了

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple scrapy==2.5.1
pip install pyopenssl==22.0.0
pip install cryptography==36.0.2 
scrapy version
scrapy version --verbose 

Scrapy的工作流程

  1. 需要创建项目
    scrapy startproject 项目名
  2. 进入到项目目录
    cd 项目名
  3. 生成spider
    scrapy genspider 爬虫的名字 网站的域名
  4. 调整spider
    给出start_urls
    以及如何解析数据. parse

例如,你可以运行:

scrapy startproject demo
cd demo
scrapy genspider example example.com

你会得到

demo/demo/spiders/example.py
# 导入scrapy框架
import scrapy# 定义爬虫类 ExampleSpider,继承自scrapy.Spider
class ExampleSpider(scrapy.Spider):# 定义爬虫名称name = 'example' # 允许爬取的域名列表allowed_domains = ['example.com']# 起始URL列表start_urls = ['http://example.com/']# 解析响应内容的回调函数def parse(self, response):pass# 简单打印一下响应内容# print(response.text)# 可以在这里使用提取器提取数据# 使用yield关键字yield Request生成其他请求
  1. 调整settings配置文件
    干掉日志的信息(想留下有用的内容), 只需要调整日志记录级别.
    LOG_LEVEL = “WARNING”
demo/demo/settings.py# Scrapy项目的设置
#
# 为了简单起见,这个文件只包含了被认为重要或常用的设置。您可以在文档中找到更多设置:
#
#     https://docs.scrapy.org/en/latest/topics/settings.html
#     https://docs.scrapy.org/en/latest/topics/downloader-middleware.html
#     https://docs.scrapy.org/en/latest/topics/spider-middleware.htmlBOT_NAME = 'demo'  # 机器人名称SPIDER_MODULES = ['demo.spiders']  # 爬虫模块位置
NEWSPIDER_MODULE = 'demo.spiders' # 新建爬虫的模块位置# 通过在User-Agent中标识自己(和自己的网站)来负责任地爬取
# USER_AGENT = 'demo (+http://www.yourdomain.com)'# 遵守robots.txt规则
ROBOTSTXT_OBEY = True# 配置Scrapy执行的最大并发请求数量(默认值: 16)(Scrapy默认是携程人物)
# CONCURRENT_REQUESTS = 32# 为相同网站的请求配置延迟(默认值: 0)建议打开调大
# 请参阅 https://docs.scrapy.org/en/latest/topics/settings.html#download-delay
# 还请参阅自动限速设置和文档
# DOWNLOAD_DELAY = 3# 下载延迟设置只会考虑以下之一:
# CONCURRENT_REQUESTS_PER_DOMAIN = 16
# CONCURRENT_REQUESTS_PER_IP = 16# 禁用Cookies(默认启用)
# COOKIES_ENABLED = False# 禁用Telnet控制台(默认启用)
# TELNETCONSOLE_ENABLED = False# 覆盖默认的请求头:
# DEFAULT_REQUEST_HEADERS = {
#    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
#    'Accept-Language': 'en',
# }# 启用或禁用爬虫中间件
# 请参阅 https://docs.scrapy.org/en/latest/topics/spider-middleware.html
# SPIDER_MIDDLEWARES = {
#    'demo.middlewares.DemoSpiderMiddleware': 543,
# }# 启用或禁用下载器中间件
# 请参阅 https://docs.scrapy.org/en/latest/topics/downloader-middleware.html
# DOWNLOADER_MIDDLEWARES = {
#    'demo.middlewares.DemoDownloaderMiddleware': 543,
# }# 启用或禁用扩展
# 请参阅 https://docs.scrapy.org/en/latest/topics/extensions.html
# EXTENSIONS = {
#    'scrapy.extensions.telnet.TelnetConsole': None,
# }# 配置Item管道
# 请参阅 https://docs.scrapy.org/en/latest/topics/item-pipeline.html
# ITEM_PIPELINES = {
#    'demo.pipelines.DemoPipeline': 300,
# }# 启用并配置自动限速扩展(默认禁用)
# 请参阅 https://docs.scrapy.org/en/latest/topics/autothrottle.html# 初始下载延迟
# AUTOTHROTTLE_START_DELAY = 5# 在高延迟情况下设置的最大下载延迟
# AUTOTHROTTLE_MAX_DELAY = 60# Scrapy应该并行发送到每个远程服务器的平均请求数
# AUTOTHROTTLE_TARGET_CONCURRENCY = 1.0# 启用显示每个接收到的响应的限速统计信息:
# AUTOTHROTTLE_DEBUG = False# 启用并配置HTTP缓存(默认禁用)
# 请参阅 https://docs.scrapy.org/en/latest/topics/downloader-middleware.html#httpcache-middleware-settings
# HTTPCACHE_ENABLED = True
# HTTPCACHE_EXPIRATION_SECS = 0
# HTTPCACHE_DIR = 'httpcache'
# HTTPCACHE_IGNORE_HTTP_CODES = []
# HTTPCACHE_STORAGE = 'scrapy.extensions.httpcache.FilesystemCacheStorage'
  1. 运行scrapy程序
    scrapy crawl 爬虫的名字

实例

创建

scrapy startproject xyx
cd xyx
scrapy genspider xiaoyx 4399.com

xyx/xyx/spiders/xiaoyx.py

import scrapyclass XiaoyxSpider(scrapy.Spider):name = 'xiaoyx'  # 爬虫的名称allowed_domains = ['4399.com']  # 允许爬取的域名start_urls = ['http://www.4399.com/flash/']  # 初始爬取的URL地址def parse(self, response):# 使用 XPath 提取数据li_list = response.xpath("//ul[@class='n-game cf']/li")  # 选择包含游戏信息的 li 元素列表for li in li_list:name = li.xpath("./a/b/text()").extract_first()  # 提取游戏名称fenlei = li.xpath("./em/a/text()").extract_first()  # 提取分类信息shijian = li.xpath("./em/text()").extract_first()  # 提取时间信息# 使用 yield 返回提取的数据yield {"name": name,      # 游戏名称"fenlei": fenlei,  # 分类信息"shijian": shijian  # 时间信息}

这段代码是一个使用 Scrapy 框架编写的网络爬虫,用于从 ‘http://www.4399.com/flash/’ 网站上提取游戏信息。以下是代码的详细解释:

  • import scrapy:导入 Scrapy 框架的模块。

  • class XiaoyxSpider(scrapy.Spider):定义了一个名为 ‘xiaoyx’ 的 Scrapy 爬虫类。

  • name = 'xiaoyx':指定了爬虫的名称。

  • allowed_domains = ['4399.com']:设置允许爬取的域名,确保只爬取指定域名下的页面。

  • start_urls = ['http://www.4399.com/flash/']:指定初始爬取的 URL 地址,爬虫将从这个地址开始运行。

  • def parse(self, response)::定义了处理响应的方法,Scrapy 会自动调用这个方法来处理从初始 URL 获取的响应。

  • li_list = response.xpath("//ul[@class='n-game cf']/li"):使用 XPath 选择器选取包含游戏信息的 li 元素列表。

  • 在循环中,使用 XPath 从每个 li 元素中提取游戏名称、分类信息和时间信息。

  • yield 语句将提取的数据以字典形式返回,每个字典代表一个游戏信息。

这个爬虫的主要功能是从指定网页上提取游戏信息,并将这些信息以字典的形式输出。这只是爬虫项目的一部分,通常你还需要配置其他设置和数据处理管道来保存或进一步处理爬取到的数据。

yield和return

Scrapy引擎内部是一个不停在执行next()的循环。Scrapy的引擎是一个事件驱动的异步框架,其核心工作方式可以概括为事件循环。这个事件循环就是一个不断迭代的过程,它负责以下工作:

  1. 调度请求(Scheduling Requests):引擎从爬虫的起始URL开始,生成初始的请求并将它们放入请求队列中。

  2. 请求下载(Downloading Requests):下载器(Downloader)从请求队列中获取请求,并通过下载器中间件(Downloader Middleware)发送HTTP请求,然后等待响应。

  3. 处理响应(Handling Responses):一旦下载器获取到响应,引擎会将响应发送给爬虫中间件(Spider Middleware)和爬虫回调函数(Spider Callback)。这是爬虫代码实际处理和解析页面内容的地方。

  4. 生成新请求(Generating New Requests):在爬虫回调函数中,可以生成新的请求并将它们放入请求队列中,以便后续处理。

  5. 重复上述过程:引擎会不断循环执行上述步骤,直到请求队列中没有更多的请求,或者达到了预定的爬取深度或其他终止条件。

这种事件循环的方式使得Scrapy能够高效地爬取数据,并在异步操作下执行多个请求。通过生成器的方式,Scrapy能够实现非阻塞的爬取,即当一个请求等待响应时,引擎可以继续处理其他请求,而不必等待当前请求完成。

这个事件循环和异步操作是Scrapy的关键特性,它有助于高效地处理大量的HTTP请求并提高爬虫的性能。同时,Scrapy还提供了许多配置选项和中间件,使得用户可以灵活地控制和定制爬取过程。

在这个Scrapy爬虫中,使用yield而不是return的原因是因为Scrapy框架是异步的。当使用yield时,它允许你以生成器的方式产生数据并将其返回给Scrapy引擎,然后Scrapy引擎可以将数据逐个处理并传递给后续的管道(pipelines)进行处理、保存或者其他操作。这种异步方式对于爬取大量数据或需要耗费较长时间的请求非常有用,因为它不会阻塞爬虫的执行,而是在数据准备好时才进行处理。

相比之下,如果使用return,它将会立即返回数据并结束parse方法的执行。这可能导致爬虫不够高效,因为它会等待数据处理完成后才能继续执行下一个请求。这样可能会导致爬虫的性能下降,尤其在需要爬取大量页面或需要等待一些异步操作完成时。

总之,使用yield允许你以异步的方式处理数据,从而提高了爬虫的效率和性能。使用return则会阻塞爬虫,可能导致效率低下。因此,在Scrapy爬虫中通常建议使用yield来生成和返回数据。

xyx/xyx/pipelines.py

注意!若使用管道settings.py中的ITEM_PIPELINES 需要打开

# Configure item pipelines
# See https://docs.scrapy.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {'xyx.pipelines.XyxPipeline': 300,
}

这是一个 Scrapy 数据处理管道(pipeline)的代码示例,用于处理从爬虫中提取的数据并将其保存到一个名为 “data.csv” 的 CSV 文件中。以下是代码的详细解释:

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html# useful for handling different item types with a single interface
from itemadapter import ItemAdapterclass XyxPipeline:def process_item(self, item, spider):print("我是管道,我看到的东西是", item)with open("data.csv", mode="a", encoding="utf-8") as f:f.write(f"{item['name']},{item['fenlei']}{item['shijian']}\n")return item

这个代码是一个自定义的Scrapy管道,主要功能是将爬虫提取的数据保存到名为 “data.csv” 的CSV文件中,并在控制台打印出数据。

解释如下:

  • class XyxPipeline::定义了一个名为 XyxPipeline 的管道类。

  • process_item(self, item, spider)::这个方法是Scrapy管道必须实现的方法,它会被自动调用来处理从爬虫中传递过来的数据。在这个例子中,它接受两个参数:item 表示从爬虫传递过来的数据项,spider 表示正在执行的爬虫实例。

  • print("我是管道,我看到的东西是", item):这行代码会在处理数据时在控制台打印出数据项,用于调试和查看数据。

  • with open("data.csv", mode="a", encoding="utf-8") as f::这是一个文件操作,它会打开一个名为 “data.csv” 的CSV文件,用于将数据写入。mode="a" 表示以追加模式打开文件,确保不会覆盖之前的数据。

  • f.write(f"{item['name']},{item['fenlei']},{item['shijian']}\n"):这行代码将提取的数据按照CSV格式写入文件。

  • return item:最后,process_item 方法返回 item,表示数据处理完成。

要使用这个管道,你需要在Scrapy的设置中将它添加到 ITEM_PIPELINES 列表中,并配置合适的优先级。这样,当爬虫提取数据时,数据将被传递给该管道进行处理和保存。

Pipeline详解

在Scrapy的Pipeline中,数据项(item)是从爬虫传递到Pipeline的,而Pipeline的process_item方法接收两个参数:itemspider。下面重点说明这些参数的含义:

  1. itemitem 参数是一个包含了从爬虫中提取的数据的Python字典(或类似对象)。这个数据项包括了爬取到的各种字段和数据。在Pipeline的process_item方法中,你可以访问和处理这些字段,对数据进行清洗、验证、转换或存储等操作。

    例如:

    def process_item(self, item, spider):name = item['name']  # 访问数据项的字段# 对数据进行处理# ...return item  # 可选:返回处理后的数据项
    
  2. spiderspider 参数代表当前正在执行的爬虫实例。虽然在大多数情况下,Pipeline中的数据处理不需要使用spider参数,但它可以提供关于当前爬虫状态和配置的信息,以便更加灵活地处理数据。

总结:Pipeline的process_item方法接收爬虫提取的数据项(item)作为参数,对这些数据进行处理后,可选择性地返回处理后的数据项。返回的数据项将传递给下一个Pipeline(如果有多个Pipeline)或者用于最终的存储和输出。Pipeline的作用是在爬虫和存储之间进行数据处理和转换。

运行

干掉日志的信息(想留下有用的内容), 只需要调整日志记录级别.
LOG_LEVEL = “WARNING”

scrapy crawl xiaoyx

你也可以创建xyx/runner.py

# -*- coding = utf-8 -*-
"""
# @Time : 2023/9/16 22:55
# @Author : FriK_log_ff 374591069
# @File : runner.py
# @Software: PyCharm
# @Function: 请输入项目功能
"""
from scrapy.cmdline import executeif __name__ == "__main__":execute("scrapy crawl xiaoyx".split())

这段代码的作用是调用Scrapy命令行工具来运行名为 “xiaoyx” 的Scrapy爬虫。在执行之前,请确保你已经正确配置了Scrapy项目并且已经定义了名为 “xiaoyx” 的爬虫。

要运行此脚本,可以在命令行中执行它,确保你的工作目录位于包含Scrapy项目的根目录,并且已经安装了Scrapy。一旦执行,它将启动爬虫并开始抓取网页上的数据。

总结

Scrapy是一个强大的网络爬虫框架,适用于各种抓取数据的场景。通过理解其架构和工作流程,你可以更好地利用Scrapy来构建自己的爬虫项目。在本文中,我们介绍了Scrapy的基本概念,提供了安装步骤和示例爬虫代码,希望能够帮助你入门Scrapy,并在实际项目中应用这个强大的工具来获取所需的数据。在使用Scrapy时,记得遵循网站的规则和道德准则,以确保合法和道德的数据采集行为。

特别声明:
此教程为纯技术分享!本教程的目的决不是为那些怀有不良动机的人提供及技术支持!也不承担因为技术被滥用所产生的连带责任!本教程的目的记录分享学习技术的过程

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

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

相关文章

【Linux学习笔记】权限

1. 普通用户和root用户权限之间的切换2. 权限的三个w2.1. 什么是权限(what)2.1.1. 用户角色2.1.2. 文件属性 2.2. 怎么操作权限呢?(how)2.2.1. ugo-rwx方案2.2.2. 八进制方案2.2.3. 文件权限的初始模样2.2.4. 进入一个…

并发编程——synchronized

文章目录 原子性、有序性、可见性原子性有序性可见性 synchronized使用synchronized锁升级synchronized-ObjectMonitor 原子性、有序性、可见性 原子性 数据库事务的原子性:是一个最小的执行的单位,一次事务的多次操作要么都成功,要么都失败…

蓝桥杯 题库 简单 每日十题 day6

01 删除字符 题目描述 给定一个单词,请问在单词中删除t个字母后,能得到的字典序最小的单词是什么? 输入描述 输入的第一行包含一个单词,由大写英文字母组成。 第二行包含一个正整数t。 其中,单词长度不超过100&#x…

记录selenium和chrome使用socks代理打开网页以及查看selenium的版本

使用前,首先打开socks5全局代理。 之前我还写过一篇关于编程中使用到代理的情况: 记录一下python编程中需要使用代理的解决方法_python 使用全局代理_小小爬虾的博客-CSDN博客 在本文中,首先安装selenium和安装chrome浏览器。 参考我的文章…

用VS Code运行C语言(安装VS Code,mingw的下载和安装)

下载并安装VS code。 安装扩展包: 此时,写完代码右键之后并没有运行代码的选项,如图: 接下来安装编译器mingw。 下载链接: https://sourceforge.net/projects/mingw-w64/ 得到压缩包: 解压: …

滚雪球学Java(26):Java进制转换

🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!&#xf…

由于数字化转型对集成和扩展性的要求,定制化需求难以满足,百数低代码服务商该如何破局?

当政策、技术环境的日益成熟,数字化转型逐步成为企业发展的必选项,企业数字化转型不再是一道选择题,而是决定其生存发展的必由之路。通过数字化转型升级生产方式、管理模式和组织形式,激发内生动力,成为企业顺应时代变…

最新适合小白前端 Javascript 高级常见知识点详细教程(每周更新中)

1. window.onload 窗口或者页面的加载事件&#xff0c;当文档内容完全加载完成会触发的事件&#xff08;包括图形&#xff0c;JS脚本&#xff0c;CSS文件&#xff09;&#xff0c;就会调用处理的函数。 <button>点击</button> <script> btn document.q…

python项目2to3方案预研

目录 官方工具2to3工具安装参数解释基本使用工具缺陷 future工具安装参数解释基本使用工具缺陷 python-modernize工具安装参数解释基本使用工具缺陷 pyupgrade工具安装参数解释基本使用工具缺陷 对比 官方工具2to3 2to3 是Python官方提供的用于将Python 2代码转换为Python 3代…

单例模式(饿汉模式 懒汉模式)与一些特殊类设计

文章目录 一、不能被拷贝的类 二、只能在堆上创建类对象 三、只能在栈上创建类对象 四、不能被继承的类 五、单例模式 5、1 什么是单例模式 5、2 什么是设计模式 5、3 单例模式的实现 5、3、1 饿汉模式 5、3、1 懒汉模式 &#x1f64b;‍♂️ 作者&#xff1a;Ggggggtm &#x…

VM虚拟机CentOS7.9x64 LVM硬盘扩容

软件版本&#xff1a;VMWare Workstation14 虚拟机CentOS 7.9X64位 GParted 0.33.0 一、虚拟机安装gparted软件 sudo yum install epel-release sudo yum install gparted sudo yum install yum-utils git gnome-common gcc-c sudo yum-builddep gparted 二、关闭虚拟机&a…

Hive行转列[一行拆分成多行/一列拆分成多列]

场景&#xff1a; hive有张表armmttxn_tmp&#xff0c;其中有一个字段lot_number&#xff0c;该字段以逗号分隔开多个值&#xff0c;每个值又以冒号来分割料号和数量&#xff0c;如&#xff1a;A3220089:-40,A3220090:-40,A3220091:-40,A3220083:-40,A3220087:-40,A3220086:-4…

用Jmeter进行压测详解

简介&#xff1a; 1.概述 一款工具&#xff0c;功能往往是很多的&#xff0c;细枝末节的地方也很多&#xff0c;实际的测试工作中&#xff0c;绝大多数场景会用到的也就是一些核心功能&#xff0c;根本不需要我们事无巨细的去掌握工具的所有功能。所以本文将用带价最小的方式讲…

CCC数字钥匙设计【BLE】--URSK管理

1、URSK创建流程 URSK的英文全称为&#xff1a;UWB Ranging Secret Key&#xff0c;即UWB安全测距密钥。 在车主配对时会生成URSK&#xff0c;且在车主配对期间&#xff0c;车辆不得尝试生成第二个URSK。 URSK示例: ed07a80d2beb00f785af2627c96ae7c118504243cb2c3226b3679da…

抖音seo账号矩阵源码系统

1. 开通多个抖音账号&#xff0c;并将它们归纳为一个账号矩阵系统。 2. 建立一个统一的账号管理平台&#xff0c;以便对这些账号进行集中管理&#xff0c;包括账号信息、内容发布、社区交互等。 3. 招募专业的运营团队&#xff0c;对每个账号进行精细化运营&#xff0c;包括内…

年龄大了转嵌入式有机会吗?

年龄大了转嵌入式有机会吗&#xff1f; 首先&#xff0c;说下结论&#xff1a;年龄并不是限制转行嵌入式软件开发的因素&#xff0c;只要具备一定的编程和电子基础知识&#xff0c;认真学习和实践&#xff0c;是可以成为优秀的嵌入式软件开发工程师的。最近很多小伙伴找我&…

一、【漏洞复现系列】Tomcat文件上传 (CVE-2017-12615)

1.1、漏洞原理 描述: Tomcat 是一个小型的轻量级应用服务器&#xff0c;在中小型系统和并发访问用户不是很多的场合下被普遍使用&#xff0c;是开发和调试JSP 程序的首选。 攻击者将有可能可通过精心构造的攻击请求数据包向服务器上传包含任意代码的 JSP 的webshell文件&#x…

Java线上故障排查(CPU、磁盘、内存、网络、GC)+JVM性能调优监控工具+JVM常用参数和命令

CPU/堆/类/线程 根据服务部署和项目架构&#xff0c;从如下几个方面排查&#xff1a; &#xff08;1&#xff09;运用服务器&#xff1a;排查内存&#xff0c;cpu,请求数等&#xff1b; &#xff08;2&#xff09;文件图片服务器&#xff1a;排查内存&#xff0c;cpu,请求数等…

R语言-关于颜色

目录 颜色 示例 R 颜色板 参考&#xff1a; 颜色 什么场景会用到颜色&#xff1f;比如在绘图过程中&#xff0c;为了让图更好看&#xff0c;有的时候&#xff0c;需要选择使用不同的颜色进行绘制或者填充。本文提供了R颜色的相关参数。 在R中&#xff0c;可以通过颜色下标…

摸鱼也摸鱼之点灯游戏自动求解

游戏 变色方块 世上最难智力游戏 (yanhaijing.com) 脚本 新建文件夹&#xff0c;命名为Inverter 在文件夹下新建inverter.js文件&#xff0c;内容如下 "use strict";function getA() {let a [];let level parseInt(document.querySelector("#cur-level&q…