Nutch工作流程

分析Nutch的工作流程 描述Nutch的工作流程,介绍Nutch对页面获取、分析、建立索引的过程。 立即下载
Nutch工作流程:建立初始URL集合分析

初始URL集的建立有两种方式:超链接和站长提交。

超链接 是指机器人程序根据网页链到其他网页中的超链接,就像日常生活中所说的“一传十,十传百……”一样,从少数几个网页开始,连到数据库上所有到其他网页的链接。理论上,若网页上有适当的超连结,机器人便可以遍历绝大部分网页。

站长提交 是指在实际运行中,爬虫不可能抓取到所有站点,为此,网站站长可以向搜索引擎进行提交,要求收录,搜索引擎经过核查之后,便将该网站加入到URL集合中,进行抓取。

 

Nutch工作流程:inject操作分析

inject操作调用的是nutch的核心包之一crawl包中的类org.apache.nutch.crawl.Injector。它执行的结果是:crawldb数据库内容得到更新,包括URL及其状态。

inject操作主要作用可以从下面3方面来说明:

(1) 将URL集合进行格式化和过滤,消除其中的非法URL,并设定URL状态(UNFETCHED),按照一定方法进行初始化分值;

(2) 将URL进行合并,消除重复的URL入口;

(3) 将URL及其状态、分值存入crawldb数据库,与原数据库中重复的则删除旧的,更换新的。

 

Nutch工作流程:generate操作分析

generate操作调用的是crawl包中的类org.apache.nutch.crawl.Generator。它执行的结果是:创建了抓取 列表,存放于segments目录下,以时间为文件夹名称。循环抓取多少次,segments文件夹下就会有多少个以时间为名称的文件夹。

generate操作主要作用可以从下面3方面来说明:

(1) 从crawldb数据库中将URL取出并进行过滤;

(2) 对URL进行排序,通过域名、链接数和一种hash算法综合进行降序排列;

(3) 将排列列表写入segments目录中。

  

Nutch工作流程:fetch操作分析

fetch操作调用的是fetcher包中的类org.apache.nutch.fetcher.Fetcher。它执行的结果是:将页面内容抓取下来,存于segment目录下。

fetch操作主要作用可以从下面4方面来说明:

(1) 执行抓取,按照segments目录下的抓取列表进行;

(2) 抓取过程中,页面的URL地址可能因为链接发生改变,从而需要更新URL地址;

(3) 抓取采用多线程方式进行,以提高抓取速度;

(4) fetch操作过程中调用了parse操作。

 

Nutch工作流程:parse操作分析

parse操作调用的是parse包中的类org.apache.nutch.parse.ParseSegment。它执行的结果是:将fetch得到的页面解析为text和data,存于segments目录下。

parse操作主要作用可以从下面3方面来说明:

(1) 解析segment中由fetch得到的页面,并进行整理,将页面分成为parse-date和parse-text;

(2) parse-date中保存的是页面的题名、作者、日期、链接等内容;

(3) parse-text中保存的是页面的文本内容。

 

Nutch工作流程:updatedb操作分析

updatedb操作调用的是crawl包中的类org.apache.nutch.crawl.CrawlDb。它执行的结果是:更新了crawldb数据库,为下一轮抓取做准备。

updatedb操作主要作用如下:

根据segments目录下fetch目录和parse目录中的内容,对crawldb进行更新,增加新的URL,更换旧的URL。

 

Nutch工作流程:index过程分析

index过程,即索引过程,包括:将数据转换成文本、分析文本、将分析过的文本保存到数据库中这三个操作。

(1) 转换成文本

在索引数据之前,首先必须将数据转换成nutch 能够处理的格式――纯文本字符流。但是,在现实世界中,信息多以富媒体(rich media)文档格式呈现:PDF、WORD、EXCEL、HTML、XML等。为此,nutch采用了插件机制(plugin),通过各种各样的文档解 析器,将富媒体转换成纯文字字符流。文档解析器种类繁多,开发人员可以根据需要进行选择,同时还可以自己修改或编写,非常灵活方便。

(2) 分析文本

在对数据进行索引前,还需要进行预处理,对数据进行分析使之更加适合被索引。分析数据时,先将文本数据切分成一些大块或者语汇单元 (tokens),然后对它们执行一些可选的操作,例如:在索引之前将这些语汇单元转换成小写,使得搜索对大小写不敏感;最有代表性的是要从输入中去掉一 些使用很频繁但却没有实际意义的词,比如英文文本中的一些停止词(a、an、the、in、on等)。同样的,我们也需要分析输入的语汇单元,以便从词语 中去掉一些不必要的字母以找到它们的词干。这一处理过程称为分析(analyze)。分析技术在索引和搜索时都会用到,比较重要。

(3) 将分析过的文本保存到数据库中

对输入的数据分析处理完成之后,就可以将结果写入到索引文件中。Nutch采用的是Lucene的索引格式,可以参考关于Lucene的索引机制。Lucene采用“倒排索引”的数据结果来存储索引的。

 

Nutch工作流程:搜索程序分析

Nutch的搜索程序执行过程,可以从下面的步骤了解:

(1) HTTP服务器接收用户发送过来的请求。对应到nutch的运行代码中就是一个servlet,称为查询处理器(Query Handler)。查询处理器负责响应用户的请求,并将相应的HTML结果页面返回给用户。

(2) 查询处理器对查询语句做一些微小的处理并将搜索的项(terms)转发到一组运行索引搜索器的机器上。Nutch的查询系统似乎比lucene简单的多, 这主要是因为搜索引擎的用户对他自己所要执行的查询内容有非常清晰的思路。然而,lucene的系统结构非常灵活,且提供了多种不同的查询方式。看似简单 的nutch查询最终被转换为特定的lucene查询类型。每个索引搜索器并行工作且返回一组有序的文档ID列表。

(3) 现在存在这大量从查询处理器返回过来的搜索结果数据流。查询处理器对这些结果集进行比较,从所有的结果查找出匹配最好的那些。如果其中任何一个索引搜索器在1~2秒之后返回结果失败,该搜索器的结果将被忽略。因此,最后列表由操作成功的搜索器返回的结果组成

Nutch爬虫工作流程及文件格式详细分析 Nutch爬虫工作流程及文件格式详细分析,文档不大 立即下载

相关推荐

疾病负担研究(GBD)介绍

今天我们来聊一聊第一个公共数据库——GBD数据库,全称叫做global burden of disease(全球疾病负担),该数据库每年都会更新,目前已经更新到GBD2019。 这里直接给大家贴出网址:Global Burden of Disease Study 2019 (GBD 2019) Data Resources | GHDx 上图中红色圈圈标识的就是数据库的数据获取界面的链接,大家直接点击即可. 数据的检索十分方便: Context下拉菜单中可以选择不同的选项,默认是caus

weixin_44240228的博客 1万+

nutch工作流程简介

先用一幅图来形容nutch的工作流程:  先对上图做一个简单说明,图中标的数字为nutch工作的顺序。它的基本流程可分为两部分,即抓取部分和搜索部分: 一、抓取部分(网络爬虫) 1.建立初始URL集 2.将URL集注入crawlDB数据库(inject包) 3. 根据crawldb数据库创建抓取列表---generate 4.执行抓取,获取网页信息---

Horizon_wing的博客 994

数据采集卡架构与PCIe优化设计详解

数据采集卡(DAQ)作为工业自动化中的关键设备,其核心在于模数转换(ADC)和数字信号处理技术。现代系统普遍采用PCIe总线架构,通过DMA传输和时钟同步技术实现高速数据采集。在信号调理环节,可编程增益放大器(PGA)和抗混叠滤波器确保信号质量;而Σ-Δ型ADC则提供高达24位的分辨率。实际应用中,从电力监测到机床振动分析,数据采集卡需要结合具体场景优化配置。通过合理的PCB布局和EMI防护设计,可以有效提升系统在工业环境中的可靠性。

weixin_29168675的博客 911

nutch v1.9源码分析(3)——nutch基本爬取流程

1      nutch基本爬取流程 nutch是大名鼎鼎的Doug Cutting发起的爬虫项目,nutch孵化了现在大数据处理事实上的标准Hadoop。在nutch V 0.8.0 版本之前,Hadoop是nutch的一部分,从nutch V0.8.0开始,HDFS和MapReduce从nutch中剥离出成为Hadoop。v0.8.0之后,nutch就完全构建在Hadoop的基础之上了。

重来 3920

AIGC实战:用ComfyUI和Lora微调打造专属原神角色(含完整工作流)

本文详细介绍了如何利用ComfyUI和Lora微调技术打造专属原神风格角色,涵盖从环境配置、数据集准备到工作流构建和Lora训练的全过程。通过模块化节点设计和高级控制技术,创作者可实现高度个性化的AIGC艺术创作,提升二次元角色生成的效率与质量。

weixin_29185199的博客 348

汇川EASY521 PLC实战指南:从硬件选型到程序架构与故障排查

可编程逻辑控制器(PLC)是工业自动化系统的核心大脑,其工作原理基于循环扫描机制,持续读取输入、执行用户程序并更新输出。这种确定性控制方式,使其在逻辑控制、顺序控制和运动控制中具有不可替代的技术价值,广泛应用于机械设备、生产线和过程控制等场景。对于汇川EASY521这类紧凑型高性能PLC,其核心优势在于集成了运动控制与丰富通讯接口,为中小型设备提供了高性价比的一站式解决方案。在实际应用中,工程师常需处理如“汇川sv660n”伺服驱动器的集成调试,或利用“hslcommunication”等开源库实现C#上位

weixin_42525264的博客 736

nutch 执行流程以及简介

Nutch体系流程图:          第一步:generator差生抓取列表,在generator产生抓取列表的过程中,会生成crawl_generator文件夹。     第二步:fetcher 从网上抓取网页,生成crawl_fetch以及content,content抓取下来的网页的源代码二进制的内容,crawl_fetch,每一个抓取URL的状态。     第三步:对抓取得网页

Alan Zhuang的博客 861

22、自动化地图制作与Pandas数据处理

本文介绍了在ArcGIS Pro中使用arcpy.mp模块进行自动化地图制作的关键技术,涵盖地图元素的访问、移动与文本修改,以及将布局批量导出为JPEG、PNG和PDF格式的方法。同时,文章深入探讨了Pandas在数据处理和地理空间分析中的应用,特别是Spatially Enabled DataFrames(SEDFs)的使用。通过综合案例展示了地图更新与数据清洗、分析的结合,提升了地图制作与数据处理的效率,为GIS自动化工作流提供了实用指南。

w8x9y0z1的博客 79

nutch的基本工作流程理解

(一):Nutch的工作流程: Crawdb、linkdb 是web link目录,存放url及url的互联关系,作为爬行与重新爬行的依据。 segments 是主目录,存放抓回来的网页。页面内容有bytes[]的raw content和parsed text的形式。nutch以广度优先的原则来爬行,因此每爬完一轮会生成一个segment目录。 index 是lucene的...

coco_ethan的专栏 264

手把手教你学Simulink--四翼无人机滑模控制器设计与仿真

四翼无人机(Quadcopter)滑模控制(Sliding Mode Control, SMC)是一种鲁棒性很强的非线性控制方法,特别适用于存在模型不确定性和外部扰动的情况。滑模控制器通过强制系统状态进入并保持在一个预定义的滑模面上,从而实现对期望轨迹或姿态的精确跟踪。在这个教程中,我们将使用MATLAB和Simulink来设计并仿真一个基于滑模控制策略的四翼无人机系统。

MHD0815的博客 184

华为OD机试真题 新系统 2026-04-19 C语言 实现【8位LED控制器】

有一个8位LED控制器,包含8个LED灯(编号0-7),初始状态全灭,用8位二进制表示为:00000000。控制器可以接收以下三种指令: Lx:L表示点亮操作,x表示LED的编号(0一7),操作得到的结果是:点亮第x个LED灯,把状态设为1。 Dx:D表示熄灭操作,x表示LED的编号(0-7),操作得到的结果是:熄灭第x个LED灯,把状态设为0。 Tx:T表示切换操作,x表示LED的编号(0-7),操作得到的结果是:切换第x个LED灯的状态,若状态为0则变为1,为1则变为0。 现在给定一组指令字符串(0<

MISAYAONE的博客 148

Nutch的工作流程

Nutch的工作流程: Crawdb、linkdb 是web link目录,存放url及url的互联关系,作为爬行与重新爬行的依据。 segments 是主目录,存放抓回来的网页。页面内容有bytes[]的raw content 和 parsed text的形式。nutch以广度优先的原则来爬行,因此每爬完一轮会生成一个segment目录。 index 是lucene的索引目录,是indexes目...

shupan001的专栏 241

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

理解Nutch的工作流程

在没有学习研究Nutch的源代码之前,我认为还是有必要对Nutch的工作流程有一个感性的认识和了解。通过对Nutch工作流程的学习认识,先有一个整体的印象,然后可以很好地指导我们去阅读学习它的源代码,从而更加深入理解Nutch。 当然,也不是唯一的,在阅读一个框架的源代码的时候,只要你选择了一个好的突破口,然后按照基于深度遍历的特性来学习理解,也能起到一定效果。但是,这种方式有点像是对着一个黑盒...

nhy520 201

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Nutch爬虫工作流程

Nutch爬虫工作流程Nutch主要分为两个部分:爬虫crawler和查询searcher。Crawler主要用于从网络上抓取网页并为这些网页建立索引。Searcher主要利用这些索引检索用户的查找关键词来产生查找结果。两者之间的接口是索引,所以除去索引部分,两者之间的耦合度很低。 Crawler和Searcher两部分尽量分开的目的主要是为了使两部分可以分布式配置在硬件平台上,例如将Crawle

自强不息.厚德载物 1631

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Nutch1.7基本工作流程分析

找到分析源头 分析软件的基本工作流程,通常都是从它的运行命令开始。在前面的一文 (地址:http://blog.youkuaiyun.com/gobitan/article/details/13916981)中提到了运行Nutch的命令为$bin/nutch crawl urls -dir crawl -depth 3 -topN 5。从命令中分析nutch脚本可以得到,该命令实际运行的为org.a

july_2的专栏 422

Nutch工作流程-说明性文档

Nutch工作流程:建立初始URL集合分析 初始URL集的建立有两种方式:超链接和站长提交。 超链接 是指机器人程序根据网页链到其他网页中的超链接,就像日常生活中所说的“一传十,十传百……”一样,从少数几个网页开始,连到数据库上所有到其他网页的链接。理论上,若网页上有适当的超连结,机器人便可以遍历绝大部分网页。 站长提交 是指在实际运行中,爬虫不可能抓取到所有站点,为此,网站站长

ATCO[这里,只是顺手插曲] 778

爬虫调研II:Nutch的工作流程和扩展性

Nutch 的工作流程可以分为两个大的部分:抓取部分与搜索部分。抓取程序抓取页面并把抓取回来的数据进行反向索引,搜索程序则对反向索引进行搜索回答用户的请求,索引是联系这两者的纽带。    I. create db  建立并初始化的 WebDB 。 webDB 用于存储的 URL 和页面内容。 webDB 包括 crawldb 和 linkdb 。 crawldb 就是 Page

TJT999 1522
上一篇: 浅谈Nutch插件机制(含开发实例)
下一篇: Nutch-0.9源代码:Crawl类整体分析
RuizeMa
博客等级 码龄18年 8粉丝 45原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值