爬虫界的“闪电侠”:异步爬虫与分布式系统的实战秘籍

Hi,我是阿佑,前文给大家讲了,如何做一个合法“采蜜”的蜜蜂,有了这么个自保的能力后,阿佑今天就将和大家踏入 —— 异步爬虫 的大门!

异步爬虫大法

    • 1. 引言
      • 1.1 爬虫框架的价值:效率与复杂度管理
      • 1.2 高级应用:从单一抓取到数据挖掘
      • 1.3 小明的数据之旅
    • 2. Scrapy框架详解
      • 2.1 Scrapy简介
        • 2.1.1 架构与组件
        • 2.1.2 安装与环境配置
      • 2.2 核心概念
        • 2.2.1 Spiders:爬虫定义与数据提取
        • 2.2.2 Items:数据结构设计
        • 2.2.3 Selectors:高效的数据提取工具
        • 2.2.4 Middlewares:中间件的使用与自定义
      • 2.3 Scrapy实战
        • 2.3.1 创建项目与编写第一个Spider
        • 2.3.2 数据处理与存储扩展
        • 2.3.3 爬虫调度与去重策略
    • 3. 高级爬虫技巧与框架
      • 3.1 异步爬虫
        • 3.1.1 异步IO原理
        • 3.1.2 Aiohttp结合异步爬虫实例
      • 3.2 分布式爬虫
        • 3.2.1 分布式爬虫概念与优势
        • 3.2.2 Scrapy-Redis与分布式部署实践
      • 3.3 机器学习辅助爬虫
        • 3.3.1 数据预处理与特征提取
        • 3.3.2 应用案例:内容分类与质量评估

1. 引言

在数据的大海中,有一群特殊的“潜水员”,他们不寻珍珠,不探宝藏,他们的目标是那些散落在网络深处的数字和信息。这些“潜水员”就是我们今天的主角——爬虫。

1.1 爬虫框架的价值:效率与复杂度管理

让我们来认识一下小明,一个对数据充满热情的年轻人。小明是个数据迷,他总是梦想着能够从互联网的海量信息中,挖掘出有价值的数据宝藏。但是,小明很快发现,没有合适的工具,单凭手工操作,他就像是在用勺子挖井,效率极低。

直到有一天,小明遇到了Scrapy——一个强大的爬虫框架。Scrapy就像是给小明的勺子装上了涡轮增压,让他的数据挖掘效率瞬间提升。Scrapy通过提供一套标准化、模块化的工具,让小明能够更加高效地进行数据采集,同时降低了开发和维护的复杂度。

1.2 高级应用:从单一抓取到数据挖掘

随着小明对Scrapy的熟练掌握,他不再满足于仅仅是数据的抓取。他开始探索更高级的应用——数据挖掘。数据挖掘,就像是在找到宝藏后,进一步研究它们的历史、价值和可能的用途。

小明开始尝试使用Scrapy进行更复杂的数据处理和分析。他利用Scrapy的强大功能,不仅能够抓取网页数据,还能对数据进行清洗、分类、甚至预测分析。小明的数据挖掘之旅,就像是从一座小岛出发,逐渐探索到整个数据的海洋。

1.3 小明的数据之旅

小明的故事,其实是每一个数据采集者的缩影。从最初的手工操作,到使用爬虫框架,再到进行高级的数据挖掘,小明的成长之路,也是数据采集技术发展的缩影。

在这个故事中,小明代表了每一个对数据充满热情的人。他的成长,也映射了数据采集技术从简单到复杂,从单一到多元的发展趋势。

通过小明的故事,我们可以看到,无论是个人还是企业,掌握高效的数据采集和分析技术,都是在这个数据驱动的时代中,获得竞争优势的关键。


在接下来的章节中,我们将跟随小明的脚步,深入探索Scrapy框架的奥秘,学习如何构建高效的爬虫系统,以及如何利用高级技术进行数据挖掘。让我们一起,跟随小明,踏上这场充满挑战和机遇的数据之旅吧!

在这里插入图片描述

2. Scrapy框架详解

Scrapy,这个名字听起来就像是为网络数据采集而生的。它是一个快速的、高层次的网页爬取和网页抓取框架,用于爬取网站并从页面中提取结构化的数据。Scrapy使用了一些非常复杂的技术,但它提供了一个极其简单的API来处理网页抓取和解析,即使是新手也能快速上手。

2.1 Scrapy简介

2.1.1 架构与组件

Scrapy的架构设计得非常巧妙,它由一系列的组件组成,每个组件都有其独特的职责,但又相互协作,共同完成数据采集的任务。

  • 引擎(Engine):是Scrapy的心脏,负责控制数据流和各个组件之间的交互。
  • 调度器(Scheduler):负责接收引擎发送的请求并将它们入队,以便之后引擎请求时能够提供。
  • 下载器(Downloader):负责获取网页数据,并将网页返回给爬虫进行处理。
  • 爬虫(Spiders):负责解析响应并提取数据,将解析出的数据转换为Scrapy的Item对象,同时也负责生成需要进一步处理的新的请求。
  • 项目管道(Item Pipeline):负责处理由爬虫提取出来的Item,并执行一系列任务,如清洗、验证和存储数据。
  • 下载器中间件(Downloader Middlewares):位于Scrapy的下载器和引擎之间的框架,主要是处理引擎与下载器之间的请求和响应。
  • 爬虫中间件(Spider Middlewares):位于Scrapy的爬虫和引擎之间的框架,主要处理爬虫输入的响应和输出的结果及新的请求。
2.1.2 安装与环境配置

安装Scrapy非常简单,你只需要拥有Python和pip(Python的包管理工具),然后在命令行中输入以下命令即可安装Scrapy:

pip install scrapy

安装完成后,你就可以通过以下命令创建一个新的Scrapy项目:

scrapy startproject myproject

创建项目后,你需要配置一些环境变量,比如设置部署分布式爬虫时使用的Redis服务器等。

2.2 核心概念

2.2.1 Spiders:爬虫定义与数据提取

Spider是Scrapy中用于定义爬取目标和解析网页的类。每个Spider都定义了如何跟进链接,以及如何从解析的数据中提取结构化信息。

import scrapyclass MySpider(scrapy.Spider):name = 'myspider'# 爬虫的起始网页start_urls = ['http://www.example.com']def parse(self, response):# 解析响应数据的函数self.log('Found', response.url)
2.2.2 Items:数据结构设计

Item是Scrapy中定义数据结构的方式,它允许你为收集的数据定义一个清晰的结构。

import scrapyclass MyItem(scrapy.Item):# define the fields for your item here like:title = scrapy.Field()description = scrapy.Field()# ...
2.2.3 Selectors:高效的数据提取工具

Selectors是Scrapy提供的一种快速提取HTML和XML中数据的方式。它使用 XPath 或 CSS 表达式来选择和提取网页中的元素。

response.xpath('//div[@class="title"]')
response.css('div.title')
2.2.4 Middlewares:中间件的使用与自定义

Middlewares允许你自定义(修改、丢弃、增加)引擎与爬虫之间的请求和响应。

2.3 Scrapy实战

2.3.1 创建项目与编写第一个Spider

让我们开始一个实战项目:用Scrapy来抓取一个新闻网站的新闻标题和链接。首先,创建一个新的Scrapy项目:

scrapy startproject news_scraper
cd news_scraper

然后,生成一个Spider:

scrapy genspider news_spider example.com

现在,编辑 news_spider.py 文件,定义我们的Spider:

import scrapyclass NewsSpider(scrapy.Spider):name = 'news_spider'# 起始网页,这里以http://example.com/news为例start_urls = ['http://example.com/news']# 解析响应的方法def parse(self, response):# 提取新闻标题和链接,并保存到Item中for news in response.css('div.article'):yield {'title': news.css('h2::text').get(),'link': news.css('a::attr(href)').get(),}# 提取下一页的链接,并请求下一页next_page = response.css('a.next::attr(href)').get()if next_page is not None:yield response.follow(next_page, self.parse)
2.3.2 数据处理与存储扩展

接下来,我们将处理抓取的数据,并将其存储到JSON文件中。首先,我们需要定义一个Item:

import scrapyclass NewsItem(scrapy.Item):title = scrapy.Field()link = scrapy.Field()

然后,我们修改Spider,使用Item来保存数据:

# news_spider.py
...def parse(self, response):# 使用Item保存数据for news in response.css('div.article'):item = NewsItem()item['title'] = news.css('h2::text').get()item['link'] = news.css('a::attr(href)').get()yield itemnext_page = response.css('a.next::attr(href)').get()if next_page is not None:yield response.follow(next_page, self.parse)

最后,我们设置Scrapy的输出格式为JSON:

scrapy crawl news_spider -o news.json
2.3.3 爬虫调度与去重策略

为了避免重复抓取同一页面,Scrapy内置了一个去重机制。通过 DUPEFILTER_CLASS 设置,我们可以启用这个机制:

# settings.py
DUPEFILTER_CLASS = 'scrapy.dupefilters.RFPDupeFilter'

此外,Scrapy的调度器会跟踪每个请求的来源,确保不会重复处理相同的页面。

现在,让我们看看一个更完整的实战项目示例,抓取一个虚构的新闻网站,并存储结果到JSON文件:

# news_spider.py
import scrapy
from news_scraper.items import NewsItemclass NewsSpider(scrapy.Spider):name = 'news_spider'start_urls = ['http://example.com/news']def parse(self, response):for news in response.css('div.article'):yield NewsItem(title=news.css('h2::text').get(),link=news.css('a::attr(href)').get())next_page = response.css('a.next::attr(href)').get()if next_page is not None:yield response.follow(next_page, callback=self.parse)# items.py
import scrapyclass NewsItem(scrapy.Item):title = scrapy.Field()link = scrapy.Field()

在项目根目录下运行爬虫:

scrapy crawl news_spider -o output.json

这个命令会启动名为 news_spider 的爬虫,并将结果以JSON格式保存到 output.json 文件中。

通过这个实战项目,我们不仅学会了如何创建Scrapy项目和编写Spider,还了解了如何处理数据和存储结果。更重要的是,我们学会了如何避免重复抓取同一页面,这是构建高效、有道德的爬虫的关键。

记住,无论我们的技术多么高超,都应该尊重数据来源网站的规定,合理合法地进行数据采集。这样,我们的数据之旅才能行稳致远。

在这里插入图片描述

3. 高级爬虫技巧与框架

在数据采集的江湖中,Scrapy 框架无疑是一把锋利的宝剑,但高手过招,还需掌握一些独门秘籍。接下来,让我们探索几个高级的爬虫技巧,它们就像是给这把宝剑加持了魔法,让你在数据采集的征途上如虎添翼。

3.1 异步爬虫

在传统的爬虫中,每次下载和处理网页都是同步进行的,这就像是你开着一辆老爷车,每次只能载一个乘客,效率自然上不去。而异步爬虫则像是给你的老爷车装上了涡轮增压,让你能够同时处理多个请求,效率大大提升。

3.1.1 异步IO原理

异步IO(Input/Output)是一种计算模型,它允许程序在等待IO操作(如网络请求)完成时,继续执行其他任务。这就像是你在等公交的时候,不是傻站着,而是可以刷刷手机,看看书,时间利用得更充分。

在Python中,asyncio库为我们提供了异步编程的基础,而aiohttp则是一个支持异步的HTTP客户端/服务器框架,它们俩的结合,可以让你的爬虫飞起来。

3.1.2 Aiohttp结合异步爬虫实例

下面是一个使用aiohttp的异步爬虫示例:

import aiohttp
import asyncioasync def fetch(url):async with aiohttp.ClientSession() as session:async with session.get(url) as response:return await response.text()async def main():urls = ['http://example.com', 'http://anotherexample.com']tasks = [fetch(url) for url in urls]results = await asyncio.gather(*tasks)for result in results:print(result)if __name__ == '__main__':asyncio.run(main())

这段代码会并发地抓取两个网页的内容,而不是一个接一个地抓取,大大提升了效率。

3.2 分布式爬虫

当你的爬虫开始处理大规模的数据采集任务时,单台机器的资源可能就不够用了。这时,分布式爬虫的概念就派上了用场。

3.2.1 分布式爬虫概念与优势

分布式爬虫将爬取任务分散到多台机器上执行,每台机器负责一部分任务。这就像是你组织了一支庞大的探险队,每个队员都有自己的任务,大家一起协作,效率自然比单打独斗要高。

分布式爬虫的优势在于:

  • 高吞吐量:多台机器并行工作,可以处理更多的请求。
  • 高可用性:即使某台机器宕机,其他机器仍然可以继续工作。
  • 易于扩展:需要更多资源时,只需增加机器即可。
3.2.2 Scrapy-Redis与分布式部署实践

Scrapy-Redis是一个将Scrapy与Redis结合的库,它使用Redis作为消息队列,协调各个爬虫节点的工作。

部署Scrapy-Redis的大致步骤如下:

  1. 安装Scrapy-Redis:

    pip install scrapy-redis
    
  2. 在项目的settings.py文件中启用Scrapy-Redis:

    # settings.py
    ITEM_PIPELINES = {'scrapy_redis.pipelines.RedisPipeline': 300,
    }
    DUPEFILTER_CLASS = 'scrapy_redis.dupefilter.RFPDupeFilter'
    SCHEDULER = 'scrapy_redis.scheduler.Scheduler'
    
  3. 运行Redis服务器,并在爬虫节点上配置Redis服务器的地址。

  4. 启动爬虫节点,它们会从Redis队列中获取任务,并将自己的结果存回Redis。

通过这种方式,你可以轻松地将爬虫部署到多台机器上,构建起一个强大的分布式爬虫系统。

3.3 机器学习辅助爬虫

在数据采集的江湖中,机器学习就像是一剂神奇的药水,能够让我们的爬虫变得更加智能,更加强大。下面,让我们一起探索如何将机器学习融入到爬虫中,让我们的爬虫变得更加聪明。

3.3.1 数据预处理与特征提取

在机器学习的世界里,数据就是一切。在开始机器学习之前,我们需要对数据进行预处理,提取出有用的特征。

数据预处理就像是在烹饪一道大餐前,需要先准备好食材。我们可能需要清洗数据,去除噪声,提取出有用的信息。然后,我们使用特征提取技术,从预处理后的数据中提取出有用的特征,供机器学习模型使用。

这个过程就像是在挑选食材,只有最新鲜、最优质的食材,才能烹饪出最美味的大餐。

3.3.2 应用案例:内容分类与质量评估

一旦我们准备好了数据,就可以开始训练机器学习模型了。一个典型的应用案例是内容分类和质量评估。通过训练一个机器学习模型,我们可以自动识别网页内容的主题,或者评估内容的质量。

例如,使用TensorFlow和Keras构建一个简单的文本分类模型:

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences# 假设我们有一些文本数据和对应的标签
texts = ["这是一个好的例子", "这是一个坏的例子"]
labels = [0, 1]# 定义Tokenizer
tokenizer = Tokenizer(num_words=100, oov_token="<OOV>")
tokenizer.fit_on_texts(texts)# 转换文本为序列
sequences = tokenizer.texts_to_sequences(texts)
padded = pad_sequences(sequences, maxlen=10)# 构建一个简单的模型
model = keras.Sequential([keras.layers.Embedding(100, 16, input_length=10),keras.layers.GlobalAveragePooling1D(),keras.layers.Dense(24, activation="relu"),keras.layers.Dense(1, activation="sigmoid"),
])# 编译模型
model.compile(loss="binary_crossentropy", optimizer="adam", metrics=["accuracy"])# 训练模型
model.fit(padded, labels, epochs=10)

训练完成后,这个模型就可以用于预测新网页内容的分类了。

通过机器学习,我们的爬虫不仅仅是一个简单的数据采集工具,它还可以变得更加智能,能够理解网页内容的含义,从而做出更加精准的决策。

掌握了这些高级技巧,你就像是拥有了一本秘籍的武林高手,可以在数据采集的江湖中游刃有余。但记住,真正的高手,不仅要有强大的技巧,还要有正确的价值观和责任感。在使用爬虫技术时,一定要遵守法律法规,尊重数据来源网站的规定,做一个有道德的“数据侠”。

在这里插入图片描述
通过训练好的模型,我们可以预测新新闻的主题,或者评估新闻的质量。这就像是给我们的爬虫装上了一个智能大脑,让它能够理解数据的含义,做出更加精准的决策。

当然,机器学习的应用远不止于此。我们还可以使用机器学习来识别验证码,模拟复杂的用户行为,甚至是预测网站的结构变化。

掌握了机器学习辅助爬虫的技巧,你就像是拥有了一件强大的武器,在数据采集的江湖中,你将所向披靡。

但记住,无论我们的技术多么高超,都应该尊重数据来源网站的规定,合理合法地进行数据采集。这样,我们的数据之旅才能行稳致远。

通过机器学习,我们的爬虫不仅仅是一个简单的数据采集工具,它还可以变得更加智能,更加强大。在未来,随着技术的不断进步,爬虫将变得更加智能化,自动化,它将能够更好地理解和处理数据,为我们的决策提供更加有力的支持。

让我们一起,继续在数据的海洋中乘风破浪,勇往直前,探索更多的可能!

我是阿佑,一个专磕 python 的中二青年,欢迎持续关注,未完待续!

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

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

相关文章

卷轴分红商城模式:适用于多种的商业营销模式

卷轴分红商城模式是一种基于区块链技术的去中心化积分商城系统&#xff0c;通过智能合约和数字资产分红实现积分流通和价值回馈&#xff0c;适用于多种场景。 什么是卷轴分红商城模式&#xff1a; 这是一个去中心化的积分商城系统&#xff0c;消费者在商城消费时&#xff0c;可…

番外篇 | 一文读懂卷积神经网络(CNN)的基础概念及原理

前言:Hello大家好,我是小哥谈。卷积神经网络(Convolutional Neural Network,CNN)是一种深度学习模型,主要用于图像识别和计算机视觉任务。本文旨在对卷积神经网络进行详细的讲解,从基本原理到实际应用,帮助读者全面了解CNN的工作原理、优势和基本组成等,以及其在现实生…

异步编程CompletableFuture总结

文章目录 1. 简介&#xff1a;2. 比较1、传统方式2、使用CompletableFuture&#xff1a;异步执行返回值 3、组合处理&#xff1a;anyOfallof : 4. 异步回调&#xff1a;thenAcceptthenApplywhenComplete等同于 thenAccepthandel()等同于thenApply 5. 常用方法&#xff1a;1、su…

Python——IO编程

IO在计算机中指Input/Output&#xff0c;也就是输入和输出。由于程序和运行时数据是在内存中驻留&#xff0c;由CPU这个超快的计算核心来执行&#xff0c;涉及到数据交换的地方&#xff0c;通常是磁盘、网络等&#xff0c;就需要IO接口。 比如你打开浏览器&#xff0c;访问新浪…

Linux查看进程命令ps和top

Linux 是一种自由和开放源代码的操作系统&#xff0c;它的使用在全球范围内非常广泛。在 Linux 中&#xff0c;进程是操作系统中最重要的组成部分之一&#xff0c;它代表了正在运行的程序。了解如何查看正在运行的进程是非常重要的&#xff0c;因为它可以帮助你了解系统的运行状…

ubuntu linux安装了中文字体以后,无法选择中文为默认字体

有一些以ubuntu为基础的发行版本&#xff0c;中文支持不是很完善&#xff0c;可以参考以下的方法试试&#xff1a; 在Ubuntu 22.04系统中安装中文字体&#xff0c;你可以按照以下步骤操作&#xff1a; 1. **安装中文语言包**&#xff1a;首先确保系统安装了中文语言包&#x…

mediasoup源码分析(三)--日志模块

概述 mediasoup是一个基于WebRTC的sfu服务器框架&#xff0c;它允许开发人员构建实时通信应用程序。它包含许多模块和组件&#xff0c;其中之一是日志模块。 mediasoup的日志模块用于记录系统的运行日志和调试信息。它可以帮助开发人员在开发和调试过程中跟踪和分析问题。日志…

【scikit-learn】DBSCAN基于密度聚类ML模型实战及经验总结(更新中)

1.一直以来想写下基于scikit-learn训练AI算法的系列文章&#xff0c;作为较火的机器学习框架&#xff0c;也是日常项目开发中常用的一款工具&#xff0c;最近刚好挤时间梳理、总结下这块儿的知识体系。 2.熟悉、梳理、总结下scikit-learn框架DBSCAN密度聚类机器学习模型相关知识…

Java的NIO提供了非阻塞I/O机制的包

Java的NIO&#xff08;New I/O&#xff09;是一种提供了替代性、非阻塞I/O机制的包。它的引入主要是为了解决传统I/O机制在处理大量连接或大数据量时所带来的性能瓶颈和可扩展性问题。下面详细介绍NIO的一些关键概念和特性&#xff1a; 1.通道&#xff08;Channels&#xff09…

管理Kubernetes平台的工具Rancher

目录 一、特性二、使用方法2.1、安装 Rancher2.2、创建 Kubernetes 集群2.3、管理和部署应用 Rancher 是一个开源的容器管理平台&#xff0c;它提供了企业级的 Kubernetes 管理解决方案&#xff0c;使得部署和管理 Kubernetes 集群变得更加简单。Rancher 提供了一个统一的控制面…

使用pyautogui制作点击器怎么输入中文

通过咨询国内一些大厂的问答软件&#xff0c;发现基本都是让我们使用pinyin库来输入中文&#xff0c;我使用了一下&#xff0c;很难达到我的需求&#xff0c;我就发现可以使用复制、粘贴这两个快捷键来达到这个效果。 它们给的代码基本都是这个模式&#xff0c;但是拼音和需要的…

Python 白底黑字图片去除红色水印

Python 白底黑字图片去除红色水印 import os from PIL import Imagedef remove_color(image_path, new_image_path):"""初始化:param image_path: 图片路径:param new_image_path: 新图片路径"""# 打开图片并转换为RGBA格式img Image.open(imag…

java入门1.1.2

前言&#xff1a; 第一&#xff1a;一坨垃圾的迭代&#xff0c;还是垃圾 第二&#xff1a;本内容为对类&#xff0c;对象&#xff0c;构造函数的最新抽象理解 正片 先将类&#xff0c;对象&#xff0c;还要构造函数翻译成英文 class&#xff0c;object&#xff0c;construc…

汇中 SCL-61D2超声水表汇中通讯协议

RS-485串行通讯接口设置表 通用代码注释 读取正向仪表数据 DD的内容为 通讯示例 主机命令&#xff1a;2A 41 4A 仪表响应&#xff1a;26 41 4A 00 00 13 63 00 00 07 72 00 00 10 34 00 33 读取负向仪表数据&#xff1a;&#xff08;单向型仪表无此命令&#xff09; DD的内容…

用户研究方法论中定性研究的优缺点分析

定性研究是一种探索性研究方法&#xff0c;它侧重于理解用户的感受、态度、动机和行为背后的原因。以下是定性研究的一些优缺点&#xff1a; 优点&#xff1a; 深入理解&#xff1a;定性研究能够提供对用户行为和态度的深入理解&#xff0c;帮助研究者捕捉到用户的真实感受和动…

selenium发展史

Selenium Core 2004 年&#xff0c;Thoughtworks 的工程师 Jason Huggins 正在负责一个 Web 应用的测试工作&#xff0c;由于这个项目需要频繁回归&#xff0c;这导致他不得不每天做着重复且低效的工作。为了解决这个困境&#xff0c;Jason 开发了一个运行在 JavaScript 沙箱中…

PDF 生成目录和页码 点击跳转(新)

为啥又写一篇&#xff1f; 因为之前 用 Anchor 写的&#xff0c;这东西 放到Paragraph 里就不好使了 。 这回 目录里 和 跳转的地方 用的都是 Chunk 添加 目录条目 返回跳转的标记 public String addMenuTag (List<Pair<Chunk, String>> chunks, String[] men…

代码随想录算法训练营第二十九天| LeetCode491.递增子序列* 、LeetCode46.全排列*、LeetCode47.全排列 II

#LeetCode 491. Non-decreasing Subsequences #LeetCode 491. 视频讲解&#xff1a;回溯算法精讲&#xff0c;树层去重与树枝去重 | LeetCode&#xff1a;491.递增子序列_哔哩哔哩_bilibili 首先&#xff0c;本题不能考虑首先对数组排序&#xff0c;排序会导致数组直接变为一个…

2024-5-16

今日安排&#xff1a; 完结 nf_tables 模块的基本学习&#xff0c;然后开始审计源码mount 的使用&#xff0c;学习 namespace (昨昨昨昨天残留的任务)&#xff08;&#xff1a;看我能搁到什么时候静不下心学习新知识就做 CTF 题目&#x1f991;&#x1f991;&#x1f991; 今…

2010-2024年各地级市社会信用体系建设匹配DID数据

2010-2024年各地级市社会信用体系建设匹配DID数据 1、时间&#xff1a;2010-2024年 2、指标&#xff1a;行政区划代码、年份、所属省份、地区、社会信用体系建设示范区 3、范围&#xff1a;310个地级市 4、来源&#xff1a;国家发改委 5、指标解释&#xff1a; 社会信用体…