【第二十一周】网络爬虫实践

embedded/2024/11/22 5:31:06/

目录

  • 摘要
  • Abstract
  • 案例:使用 Python 抓取微博评论数据
  • 一、数据来源分析
    • 1.明确需求
    • 2.抓包分析
  • 二、代码实现步骤
    • 1.发送请求
    • 2.获取数据
    • 3.解析数据
    • 4.保存数据
    • 5.批量采集数据
    • 6.封装函数
  • 总结

摘要

本周主要完成了陶博的大语言课程中布置的一个爬虫实践任务,为了加深记忆从而把这周自学到的内容都总结为周报。网络爬虫(web crawler)是一种自动化程序,用于在互联网上自动抓取和收集信息。‌ 它通过模拟人类用户的行为,按照一定的规则和算法,自动访问网页并提取所需的数据。网络爬虫通常从一个或多个初始网页的URL开始,然后根据预设的规则递归地访问其他网页,抓取其中的信息。‌爬虫和大语言模型(如GPT系列、BERT等)之间存在密切的关系,主要体现在数据收集和训练两个方面。爬虫为大语言模型提供了丰富的训练数据,而大语言模型则利用这些数据进行各种高级任务,两者相辅相成,共同推动了自然语言处理技术的发展。

Abstract

This week, I mainly completed a web crawling practice task assigned in Dr. Tao’s large language model course. To reinforce my memory, I summarized all the content I self-studied this week into a weekly report. A web crawler is an automated program used to automatically fetch and collect information from the internet. It simulates human user behavior, visiting web pages according to certain rules and algorithms, and extracting the required data. Web crawlers typically start from one or more initial webpage URLs, then recursively visit other web pages based on predefined rules, and fetch the information contained within them. There is a close relationship between web crawlers and large language models (such as the GPT series and BERT), primarily in terms of data collection and training. Web crawlers provide rich training data for large language models, which in turn use this data to perform various advanced tasks. The two complement each other and together drive the development of natural language processing technology.

案例:使用 Python 抓取微博评论数据

实践环节基于B站视频:Python爬取微博评论数据

在这里插入图片描述

微博是一个活跃的社交媒体平台,每天有大量的用户发布评论、帖子和互动内容。这些用户生成的内容提供了丰富的文本数据,可以用于训练大语言模型。并且,微博用户来自不同的背景和地区,他们的评论涵盖了各种话题和领域,这使得数据具有高度的多样性代表性

那么我们要如何进行爬虫呢?

网络爬虫实际上分为以下几个步骤,只要按照步骤去分析,我们就可以解决绝大多数问题。

一、数据来源分析

1.明确需求

在这里插入图片描述

这一步主要是为了明确采集的网站以及数据内容,例如我们要采集杨紫这条微博下的评论数据。
网址:https://weibo.com/1227368500/OFCwW79Nv#comment

2.抓包分析

抓包分析(Packet Analysis)是指通过捕获和分析网络通信中的数据包来了解网络流量、诊断网络问题、检测安全漏洞等的技术手段。抓包工具可以捕获网络接口上传输的所有数据包,并提供详细的分析功能,帮助用户深入理解网络通信的细节。

首先我们按 F12 打开开发者工具,然后选择 network ,可以看到如下画面:

在这里插入图片描述

我们可以看到当前只有10个请求,此时显示的数据是不全的,要想显示整个网站的内容,我们可以先清空然后再重新刷新一遍网址。

在这里插入图片描述

此时直接显示出来了149个请求,并且还在慢慢增加。

接下来我们再进行关键字搜索

在这里插入图片描述
我们点击上面的搜索按钮,然后将评论信息复制到搜索框中进行搜索,可以看到搜索出来了相应的包。

在这里插入图片描述
点进去到 response(响应)界面就可以看到相应的信息,比如评论、用户地区和昵称等。

在这里插入图片描述
再点击这个包的 headers(标头),就可以看到这个数据包的请求地址了。

数据包地址:https://weibo.com/ajax/statuses/buildComments?is_reload=1&id=5099195621705961&is_show_bulletin=2&is_mix=0&count=10&uid=1227368500&fetch_level=0&locale=zh-CN

找到数据包地址我们就可以开始进入代码实践环节了。

二、代码实现步骤

1.发送请求

这部分实际上是用代码模拟浏览器对 URL 地址发送请求,我们可以到 headers 部分寻找我们模拟浏览器想要的参数内容,比如 cookie 和 UA。
在这里插入图片描述在这里插入图片描述

这两部分我们可以使用一个字典来接受:

# 模拟浏览器
headers = {#cookie 用户信息,常用于检测是否有登陆账号'cookie':'',#user-agent 用户代理,表示浏览器/设备基本身份信息'user-agent':''}

然后将我们刚刚获得的数据包地址粘贴下来,得到:

# 请求网址url = 'https://weibo.com/ajax/statuses/buildComments?is_reload=1&id=5099195621705961&is_show_bulletin=2&is_mix=0&count=10&uid=1227368500&fetch_level=0&locale=zh-CN'

接下来我们使用第三方模块 requests 去发送请求。

# 导入 requests 模块
import requests# 发送请求
response = requests.get(url=url,headers=headers)

数据包地址中最后的问号之后其实是携带的各种参数,我们可以在 payload(载荷)部分看到它们。
在这里插入图片描述
因此我们还有第二种进行请求的办法,也就是将参数写到外面进行分段请求。

参数构成的字典:

#查询参数data = {'is_reload': '1','id':'5099195621705961','is_show_bulletin': '2','is_mix': '0','count': '10','type': 'feed','uid': '1227368500','fetch_level': '0','locale': 'zh-CN'}

2.获取数据

获取服务器返回响应数据内容

#获取响应的json数据json_data = response.json()print(json_data)

我们运行看看是否得到我们想要的数据:

在这里插入图片描述
可以看到已经取得了相应的内容了,接下来只需要从里面提取我们想要的内容就好了。

3.解析数据

提取我们需要的数据内容

#字典取值,提取评论信息所在列表
data_list = json_data['data']
# 遍历列表里面元素
for index in data_list:print(index)

我们可以看下结果:
在这里插入图片描述
可以看到只显示了五条结果,但是我们在前面的 preview 里明明看到有20条 data 数据,这是为什么呢?
在这里插入图片描述
我尝试了一下把之前参数中的 type 值改成 all 也就是令'type': 'all'之后得到如下结果:

在这里插入图片描述
结果正常获取20条数据,因此可以猜测 feed 可能代表着只获取前五条数据,而把 type 注释掉或者改成 all 会自动获取全部20条数据。

我们再进行细化,只提取我们想要的信息:

for index in data_list:# 提取具体数据内容,保存字典中dit = {'昵称': index['user']['screen_name'],'地区': index['source'].replace('来自', ''),'评论': index['text_raw']}print(dit)

可以看到我们想要的信息都能正常提取出来了:

在这里插入图片描述

4.保存数据

把数据保存到表格文件中

#创建文件对象f = open('data.csv', mode='a', encoding='utf-8-sig',newline='')# 字典写入方法
csv_writer = csv.DictWriter(f,fieldnames=['昵称','地区','评论'])# 写入表头
csv_writer.writeheader()

我们将写入语句csv_writer.writerow(dit)加入上一个循环中,我们可以看到数据正常保存了:

在这里插入图片描述

5.批量采集数据

在这里插入图片描述
为了批量采集数据,我们需要分析各个包的参数变化。我们可以先用标头的数据过滤一下各个包,用上面的 filter 进行搜索。注意,不是左边的搜索栏。

在这里插入图片描述
过滤之后可以看到一个包,我们将评论区往下滑动,可以看到越来越多的包刷新出来。

在这里插入图片描述

观察这连续的三个包,我们可以找到他们之间发生的规律:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
通过上图我们可以看到,第一个包的 count 为10,后面均为20。对于这个现象我们有两个解决方案:第一个是我们可以试着将初始的参数改为20,看看能不能获得数据,如果可以的话那么全部都改成 20 就好;第二个是采集第一页的时候用 10,采集后面的页面的话统一用 20。

经过代码测试可以发现,初始参数设为 20 时也能获得数据。根据“奥卡姆剃刀原理”——「如无必要,勿增实体」,我们直接将初始参数设为 20 即可。

再观察我们可以发现除了第一个包的 max_id 是0之外,其他的 max_id 都是一串毫无规律的数字。通常这种情况我们可以在上一个包的数据里找到下一个包所需的参数。

在这里插入图片描述
我们可以发现第一个包携带的 max_id 正好是第二个包的 max_id

我们可以声明一个变量来保存每个包携带的 max_id,并且把max_id的初始值设为0:

max_id = json_data['max_id']

6.封装函数

#导入数据请求模块
import requests#导入csv模块
import csv# 反封号机制
import time
import random# 微博反爬机制是基于IP的,同一IP爬取太多数据会被ban掉导致爬不到数据
# 因此我们需要用到一些在线代理商的IP池,每次请求一次数据都要更换一次IP
# 这里使用的是快代理(有12小时免费试用)
# 以下的隧道、用户名和密码都是虚构的,自己替换一下# 隧道域名:端口号
tunnel = "xxxx.kdltpspro.com:15818"  # 用户名密码方式
username = "xxxx"
password = "xxxx"
proxies = {"http": "http://%(user)s:%(pwd)s@%(proxy)s/" % {"user": username, "pwd": password, "proxy": tunnel},"https": "http://%(user)s:%(pwd)s@%(proxy)s/" % {"user": username, "pwd": password, "proxy": tunnel}
}# 要访问的目标网页
target_url = "https://dev.kdlapi.com/testproxy"# 使用代理IP发送请求,测试是否连接上代理服务器
response = requests.get(target_url, proxies=proxies)# 获取页面内容
if response.status_code == 200:print(response.text)# User-Agent 列表,提供随机 User-Agent,每次请求数据会自动切换一次 UA
USER_AGENT_LIST = ["Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; AcooBrowser; .NET CLR 1.1.4322; .NET CLR 2.0.50727)","Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506)","Mozilla/4.0 (compatible; MSIE 7.0; AOL 9.5; AOLBuild 4337.35; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)","Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)","Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)","Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.0.3705; .NET CLR 1.1.4322)","Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.0.04506.30)","Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.3 (Change: 287 c9dfb30)","Mozilla/5.0 (X11; U; Linux; en-US) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.6","Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2pre) Gecko/20070215 K-Ninja/2.1.1","Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/20080705 Firefox/3.0 Kapiko/3.0","Mozilla/5.0 (X11; Linux i686; U;) Gecko/20070322 Kazehakase/0.4.5","Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.8) Gecko Fedora/1.9.0.8-1.fc10 Kazehakase/0.5.6","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.20 (KHTML, like Gecko) Chrome/19.0.1036.7 Safari/535.20","Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; fr) Presto/2.9.168 Version/11.52","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.11 TaoBrowser/2.0 Safari/536.11","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.71 Safari/537.1 LBBROWSER","Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; LBBROWSER)","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E; LBBROWSER)","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.84 Safari/535.11 LBBROWSER","Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)","Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; QQBrowser/7.0.3698.400)","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E)","Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SV1; QQDownload 732; .NET4.0C; .NET4.0E; 360SE)","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E)","Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)","Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1","Mozilla/5.0 (iPad; U; CPU OS 4_2_1 like Mac OS X; zh-cn) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148 Safari/6533.18.5","Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:2.0b13pre) Gecko/20110307 Firefox/4.0b13pre","Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:16.0) Gecko/20100101 Firefox/16.0","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11","Mozilla/5.0 (X11; U; Linux x86_64; zh-CN; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36","Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50","Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50","Mozilla/5.0 (Windows NT 10.0; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0","Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; InfoPath.3; rv:11.0) like Gecko","Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)","Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)","Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)","Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1","Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1","Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; en) Presto/2.8.131 Version/11.11","Opera/9.80 (Windows NT 6.1; U; en) Presto/2.8.131 Version/11.11","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11","Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Maxthon 2.0)","Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; TencentTraveler 4.0)","Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)","Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; The World)","Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SE 2.X MetaSr 1.0; SE 2.X MetaSr 1.0; .NET CLR 2.0.50727; SE 2.X MetaSr 1.0)","Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)","Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Avant Browser)","Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)","Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5","Mozilla/5.0 (iPod; U; CPU iPhone OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5","Mozilla/5.0 (iPad; U; CPU OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5","Mozilla/5.0 (Linux; U; Android 2.3.7; en-us; Nexus One Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1","MQQBrowser/26 Mozilla/5.0 (Linux; U; Android 2.3.7; zh-cn; MB200 Build/GRJ22; CyanogenMod-7) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1","Opera/9.80 (Android 2.3.4; Linux; Opera Mobi/build-1107180945; U; en-GB) Presto/2.8.149 Version/11.10","Mozilla/5.0 (Linux; U; Android 3.0; en-us; Xoom Build/HRI39) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13","Mozilla/5.0 (BlackBerry; U; BlackBerry 9800; en) AppleWebKit/534.1+ (KHTML, like Gecko) Version/6.0.0.337 Mobile Safari/534.1+","Mozilla/5.0 (hp-tablet; Linux; hpwOS/3.0.0; U; en-US) AppleWebKit/534.6 (KHTML, like Gecko) wOSBrowser/233.70 Safari/534.6 TouchPad/1.0","Mozilla/5.0 (SymbianOS/9.4; Series60/5.0 NokiaN97-1/20.0.019; Profile/MIDP-2.1 Configuration/CLDC-1.1) AppleWebKit/525 (KHTML, like Gecko) BrowserNG/7.1.18124","Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Titan)","UCWEB7.0.2.37/28/999","NOKIA5700/ UCWEB7.0.2.37/28/999","Openwave/ UCWEB7.0.2.37/28/999","Mozilla/4.0 (compatible; MSIE 6.0; ) Opera/UCWEB7.0.2.37/28/999",
]def GetContent(MaxId):#创建文件对象f = open('data3.csv', mode='a', encoding='utf-8-sig',newline='')#字典写入方法csv_writer = csv.DictWriter(f,fieldnames=['昵称','地区','评论'])#写入表头#csv_writer.writeheader()#客户端向服务器发送请求的表头headers = {#cookie 用户信息,常用于检测是否有登陆账号'cookie':'xxxx',  # 自己替换自己的cookie,我用自己的cookie可以一直提取#user-agent 用户代理,表示浏览器/设备基本身份信息'user-agent':random.choice(USER_AGENT_LIST)}#请求网址#url = 'https://weibo.com/ajax/statuses/buildComments?is_reload=1&id=5096395729802504&is_show_bulletin=2&is_mix=0&count=20&type=feed&uid=5044281310&fetch_level=0&locale=zh-CN'url = 'https://weibo.com/ajax/statuses/buildComments'#查询参数data = {'is_reload': '1','id':'5090919693681101','is_show_bulletin': '2','is_mix': '0','max_id': MaxId,'count': '20','type': 'all','uid': '2706896955','fetch_level': '0','locale': 'zh-CN'}#发送请求#response = requests.get(url=url,headers=headers)#response = requests.get(url=url,params=data,headers=headers,proxies=proxies,timeout=(3,7))"""获取数据"""#获取响应的json数据#捕获异常,防止程序因为异常而终止try:response = requests.get(url=url,params=data,headers=headers,proxies=proxies,timeout=(1,1.5))# 检查响应状态码if response.status_code == 200:try:json_data = response.json()data_list = json_data['data']# return data_listexcept requests.exceptions.JSONDecodeError:print("Response content is not valid JSON")return Noneelse:print(f"Request failed with status code {response.status_code}")return Noneexcept requests.exceptions.RequestException as e:print(f"An error occurred: {e}")return None#print(json_data)#字典取值,提取评论信息所在列表#data_list = json_data['data'] #一般一次请求是一个data包,是20条评论"""解析数据"""for index in data_list:#print(index)# 提取具体数据内容,保存字典中dit = {'昵称': index['user']['screen_name'],'地区': index['source'].replace('来自', ''),'评论': index['text_raw']}print(dit)"""保存数据"""csv_writer.writerow(dit)#获取下一页Mix_id# 获取下一页max_idmax_id = json_data['max_id']# 返回# 关闭文件f.close()return max_idmax_id = 0
page_count = 0for page in range(1,20000):#通过循环获取max_id以达到翻页的效果print(f'正在采集第{page}页的数据内容')max_id = GetContent(MaxId=max_id)time.sleep(random.uniform(0.1, 0.5)) # 等待0.1到0.5秒再重新采集数据

总结

本周通过对一个爬虫具体案例的学习,总结了爬取任意网站数据的通用流程和思路。通过对实例代码的改进,利用代理ip池成功爬取了一百万的评论数据量。


http://www.ppmy.cn/embedded/139531.html

相关文章

Java算法OJ(7)随机快速排序

目录 1.前言 2.正文 1. 快速排序的基本原理 2. 随机快速排序的改进 3. 随机快速排序的步骤 3.小结 1.前言 哈喽大家好吖,今儿给大家带来算法—随机快速排序相关知识点,废话不多说让我们开始。 2.正文 在了解随机快排之前,先了解一下…

跨平台WPF框架Avalonia教程 八

构建跨平台应用程序 本指南介绍了Avalonia,并概述了如何构建跨平台应用程序,以最大程度地重用代码,并在所有主要平台(Windows、Linux、macOS、iOS、Android和WebAssembly)上提供高质量的用户界面体验。 与Xamarin.Fo…

【贪心算法】贪心算法四

贪心算法四 1.最长回文串2.增减字符串匹配3.分发饼干4.最优除法 点赞👍👍收藏🌟🌟关注💖💖 你的支持是对我最大的鼓励,我们一起努力吧!😃😃 1.最长回文串 题目链接&…

SpringMVC域对象共享数据

目录 一.向 request 域对象共享数据 1.1使用ServletAPI向request域对象共享数据 1.2使用ModelAndView向request域对象共享数据 1.3使用Model向request域对象共享数据 1.4使用map向request域对象共享数据 1.5使用ModelMap向request域对象共享数据 二.Model、ModelMap、Ma…

一文读懂Redis6的--bigkeys选项源码以及redis-bigkey-online项目介绍

一文读懂Redis6的--bigkeys选项源码以及redis-bigkey-online项目介绍 本文分为两个部分,第一是详细讲解Redis6的--bigkeys选项相关源码是怎样实现的,第二部分为自己对--bigkeys源码的优化项目redis-bigkey-online的介绍。redis-bigkey-online是自己开发的…

Springboot + vue 健身房管理系统项目部署

1、前言 ​ 许多人在拿到 Spring Boot 项目的源码后,不知道如何运行。我以 Spring Boot Vue 健身房管理系统的部署为例,详细介绍一下部署流程。大多数 Spring Boot 项目都可以通过这种方式部署,希望能帮助到大家。 ​ 2、项目查看 ​ 首…

Linux应用项目之量产工具(四)——UI系统

前言 前面我们完成了量产工具的显示、输入和文字系统,如下: 量产工具(一)——显示系统 量产工具(二)——输入系统 量产工具(三)——文字系统 项目框架 本节我们来实现量产工具的…

【大数据学习 | flume】flume Sink Processors与拦截器Interceptor

1. Failover Sink Processor 故障转移处理器可以同时指定多个sink输出,按照优先级高低进行数据的分发,并具有故障转移能力。 需要修改第一台服务器agent a1.sourcesr1 a1.sinksk1 k2 a1.channelsc1 a1.sources.r1.typenetcat a1.sources.r1.bindworker…