UCF101动作识别数据集简介绍及数据预处理

article/2025/3/19 20:49:56

文章目录

        • 一、数据集简介:
        • 二、数据集获取及解压缩:
          • 1. 数据下载
          • 2. 数据集解压缩:
        • 三、数据集划分
        • 四、数据集预处理
          • 1. 生成pkl文件
          • 2. 直接对视频文件处理

一、数据集简介:

UCF101是一个现实动作视频的动作识别数据集,收集自YouTube,提供了来自101个动作类别的13320个视频。官方网站:https://www.crcv.ucf.edu/research/data-sets/ucf101/

  • 数据集名称:UCF-101(2012)
  • 总视频数:13,320个视频
  • 总时长:27个小时
  • 视频来源:YouTube采集
  • 视频类别:101 种
  • 主要包括5大类动作 :人与物体交互,单纯的肢体动作,人与人交互,演奏乐器,体育运动
  • 每个类别(文件夹)分为25组,每组4~7个短视频,每个视频时长不等
  • 具体类别:涂抹眼妆,涂抹口红,射箭,婴儿爬行,平衡木,乐队游行,棒球场,篮球投篮,篮球扣篮,卧推,骑自行车,台球射击,吹干头发,吹蜡烛,体重蹲,保龄球,拳击沙袋,拳击速度袋,蛙泳,刷牙,清洁和挺举,悬崖跳水,板球保龄球,板球射击,在厨房切割,潜水,打鼓,击剑,曲棍球罚款,地板体操,飞盘接球,前爬网,高尔夫挥杆,理发,链球掷,锤击,倒立俯卧撑,倒立行走,头部按摩,跳高,跑马,骑马,呼啦圈,冰舞,标枪掷,杂耍球,跳绳,跳跃杰克,皮划艇,针织,跳远,刺,阅兵,混合击球手,拖地板,修女夹头,双杠,披萨折腾,弹吉他,弹钢琴,弹塔布拉琴,弹小提琴,弹大提琴,弹Daf,弹Dhol,弹长笛,弹奏锡塔琴,撑竿跳高,鞍马,引体向上,拳打,俯卧撑,漂流,室内攀岩,爬绳,划船,莎莎旋转,剃胡子,铅球,滑板溜冰,滑雪,Skijet,跳伞,足球杂耍,足球罚球,静环,相扑摔跤,冲浪,秋千,乒乓球拍,太极拳,网球秋千,投掷铁饼,蹦床跳跃,打字,高低杠,排球突刺,与狗同行,墙上俯卧撑,在船上写字,溜溜球。剃胡须,铅球,滑冰登机,滑雪,Skijet,跳伞,足球杂耍,足球罚款,静物环,相扑,冲浪,秋千,乒乓球射击,太极拳,网球秋千,掷铁饼,蹦床跳跃,打字,不均匀酒吧,排球突刺,与狗同行,壁式俯卧撑,船上写字,溜溜球。剃胡须,铅球,滑冰登机,滑雪,Skijet,跳伞,足球杂耍,足球罚款,静物环,相扑,冲浪,秋千,乒乓球射击,太极拳,网球秋千,掷铁饼,蹦床跳跃,打字,不均匀酒吧,排球突刺,与狗同行,壁式俯卧撑,船上写字,溜溜球

二、数据集获取及解压缩:

1. 数据下载

UCF101数据下载地址:https://www.crcv.ucf.edu/datasets/human-actions/ucf101/UCF101.rar

官方数据划分下载地址:https://www.crcv.ucf.edu/wp-content/uploads/2019/03/UCF101TrainTestSplits-RecognitionTask.zip

注:数据集大小为6.46G,数据划分分为三种方式,可自行选择使用

2. 数据集解压缩:

数据集是rar的压缩文件,使用rar进行解压,cd 到对应文件夹

rar x UCF101.rar

解压后就是分类数据集的标准目录格式,二级目录名为人类活动类别,二级目录下就是对应的视频数据。

每个短视频时长不等(零到十几秒都有),大小320*240, 帧率不固定,一般为25帧或29帧,一个视频中只包含一类人类行为。

注:本地没有rar,则需安装,在Linux中安装参考Linux下rar工具安装及常用命令,其中要是自己没有权限可联系管理员让其安装,如果是服务器有使用docker,可用chmod命令更改容器权限进行安装

三、数据集划分

将下载的UCF101TrainTestSplits-RecognitionTask进行解压,解压后如下图所示,共三种划分方式

xxx

自行选择划分方式,本文使用第一种划分方法,将验证集移动到val文件夹下,划分代码:

import shutil,ostxtlist = ['testlist01.txt']
dataset_dir = './UCF-101/'   #数据存放路径
copy_path = './val/'         #验证集存放路径for txtfile in txtlist:for line in open(txtfile, 'r'):o_filename = dataset_dir + line.strip()n_filename = copy_path + line.strip()if not os.path.exists('/'.join(n_filename.split('/')[:-1])):os.makedirs('/'.join(n_filename.split('/')[:-1]))shutil.move(o_filename, n_filename)

四、数据集预处理

数据处理加载分两种方式:先将视频文件生成pkl文件在进行处理,或者直接对视频进行处理

1. 生成pkl文件

将视频文件转换生成pkl文件,加快数据读取速度,代码:

import os
from pathlib import Path
import random
import cv2
import numpy as np
import pickle as pk
from tqdm import tqdm
from PIL import Imageimport multiprocessing
import timeimport torchvision.transforms as transforms
from torch.utils.data import DataLoader, Datasetclass VideoDataset(Dataset):def __init__(self, directory, local_rank, num_local_rank, resize_shape=[168, 168] , mode='val', clip_len=8, frame_sample_rate=2):folder = Path(directory)  # get the directory of the specified splitprint("Load dataset from folder : ", folder)self.clip_len = clip_lenself.resize_shape = resize_shapeself.frame_sample_rate = frame_sample_rateself.mode = modeself.fnames, labels = [], []for label in sorted(os.listdir(folder))[:200]:for fname in os.listdir(os.path.join(folder, label)):self.fnames.append(os.path.join(folder, label, fname))labels.append(label)'''random_list = list(zip(self.fnames, labels))random.shuffle(random_list)self.fnames[:], labels[:] = zip(*random_list)'''# prepare a mapping between the label names (strings) and indices (ints)self.label2index = {label: index for index, label in enumerate(sorted(set(labels)))}# convert the list of label names into an array of label indicesself.label_array = np.array([self.label2index[label] for label in labels], dtype=int)label_file = str(len(os.listdir(folder))) + 'class_labels.txt'with open(label_file, 'w') as f:for id, label in enumerate(sorted(self.label2index)):f.writelines(str(id + 1) + ' ' + label + '\n')if mode == 'train' or 'val' and num_local_rank > 1:single_num_ = len(self.fnames)//24self.fnames = self.fnames[local_rank*single_num_:((local_rank+1)*single_num_)]labels = labels[local_rank*single_num_:((local_rank+1)*single_num_)]for file in tqdm(self.fnames, ncols=80):fname = file.split("/")self.directory = '/root/dataset/{}/{}'.format(fname[-3],fname[-2])if os.path.exists('{}/{}.pkl'.format(self.directory, fname[-1])):continueelse:capture = cv2.VideoCapture(file)frame_count = int(capture.get(cv2.CAP_PROP_FRAME_COUNT))if frame_count > self.clip_len:buffer = self.loadvideo(capture, frame_count, file)else:while frame_count < self.clip_len:index = np.random.randint(self.__len__())capture = cv2.VideoCapture(self.fnames[index])frame_count = int(capture.get(cv2.CAP_PROP_FRAME_COUNT))buffer = self.loadvideo(capture, frame_count, file)def __getitem__(self, index):# loading and preprocessing. TODO move them to transform classesreturn indexdef __len__(self):return len(self.fnames)def loadvideo(self, capture, frame_count, fname):# initialize a VideoCapture object to read video data into a numpy arrayself.transform_nor = transforms.Compose([transforms.Resize([224, 224]),])# create a buffer. Must have dtype float, so it gets converted to a FloatTensor by Pytorch laterstart_idx = 0end_idx = frame_count-1frame_count_sample = frame_count // self.frame_sample_rate - 1if frame_count>300:end_idx = np.random.randint(300, frame_count)start_idx = end_idx - 300frame_count_sample = 301 // self.frame_sample_rate - 1buffer_normal = np.empty((frame_count_sample, 224, 224, 3), np.dtype('uint8'))count = 0retaining = Truesample_count = 0# read in each frame, one at a time into the numpy buffer arraywhile (count <= end_idx and retaining):retaining, frame = capture.read()if count < start_idx:count += 1continueif retaining is False or count > end_idx:breakif count%self.frame_sample_rate == (self.frame_sample_rate-1) and sample_count < frame_count_sample:frame = Image.fromarray(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))buffer_normal[sample_count] = self.transform_nor(frame)sample_count += 1count += 1fname = fname.split("/")self.directory = '/root/dataset/{}/{}'.format(fname[-3],fname[-2])if not os.path.exists(self.directory):os.makedirs(self.directory)# Save tensor to .pkl filewith open('{}/{}.pkl'.format(self.directory, fname[-1]), 'wb') as Normal_writer:pk.dump(buffer_normal, Normal_writer)capture.release()return buffer_normalif __name__ == '__main__':datapath = '/root/dataset/UCF101'process_num = 24for i in range(process_num):p = multiprocessing.Process(target=VideoDataset, args=(datapath, i, process_num))p.start()print('CPU core number:' + str(multiprocessing.cpu_count()))for p in multiprocessing.active_children():print('子进程' + p.name + ' id: ' + str(p.pid))print('all done')

之后对pkl文件进行处理

import os
from pathlib import Pathimport random
import cv2import numpy as np
import pickle as pk
from tqdm import tqdm
from PIL import Imageimport torchvision.transforms as transforms
from torch.utils.data import DataLoader, Datasetclass VideoDataset(Dataset):def __init__(self, directory_list, local_rank=0, enable_GPUs_num=0, distributed_load=False, resize_shape=[224, 224] , mode='train', clip_len=32, crop_size=160):self.clip_len, self.crop_size, self.resize_shape = clip_len, crop_size, resize_shapeself.mode = modeself.fnames, labels = [], []# get the directory of the specified splitfor directory in directory_list:folder = Path(directory)print("Load dataset from folder : ", folder)for label in sorted(os.listdir(folder)):for fname in os.listdir(os.path.join(folder, label)) if mode=="train" else os.listdir(os.path.join(folder, label))[:10]:self.fnames.append(os.path.join(folder, label, fname))labels.append(label)random_list = list(zip(self.fnames, labels))random.shuffle(random_list)self.fnames[:], labels[:] = zip(*random_list)# self.fnames = self.fnames[:240]'''if mode == 'train' and distributed_load:single_num_ = len(self.fnames)//enable_GPUs_numself.fnames = self.fnames[local_rank*single_num_:((local_rank+1)*single_num_)]labels = labels[local_rank*single_num_:((local_rank+1)*single_num_)]'''# prepare a mapping between the label names (strings) and indices (ints)self.label2index = {label:index for index, label in enumerate(sorted(set(labels)))} # convert the list of label names into an array of label indicesself.label_array = np.array([self.label2index[label] for label in labels], dtype=int)def __getitem__(self, index):# loading and preprocessing. TODO move them to transform classessbuffer = self.loadvideo(self.fnames[index])if self.mode == 'train':height_index = np.random.randint(buffer.shape[2] - self.crop_size)width_index = np.random.randint(buffer.shape[3] - self.crop_size)return buffer[:,:,height_index:height_index + self.crop_size, width_index:width_index + self.crop_size], self.label_array[index]else:return buffer, self.label_array[index]def __len__(self):return len(self.fnames)def loadvideo(self, fname):# initialize a VideoCapture object to read video data into a numpy arraywith open(fname, 'rb') as Video_reader:video = pk.load(Video_reader)while video.shape[0]<self.clip_len+2:index = np.random.randint(self.__len__())with open(self.fnames[index], 'rb') as Video_reader:video = pk.load(Video_reader)height, width = video.shape[1], video.shape[2]center = (height//2, width//2)flip, flipCode = True if np.random.random() < 0.5 else False, 1#rotation, rotationCode = True if np.random.random() < 0.2 else False, random.choice([-270,-180,-90,90,180,270])speed_rate = np.random.randint(1, 3) if video.shape[0] > self.clip_len*2+2 and self.mode == "train" else 1time_index = np.random.randint(video.shape[0]-self.clip_len*speed_rate)video = video[time_index:time_index+(self.clip_len*speed_rate):speed_rate,:,:,:]self.transform = transforms.Compose([transforms.Resize([self.resize_shape[0], self.resize_shape[1]]),transforms.ToTensor(),transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])])self.transform_val = transforms.Compose([transforms.Resize([self.crop_size, self.crop_size]),transforms.ToTensor(),transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])])if self.mode == 'train':# create a buffer. Must have dtype float, so it gets converted to a FloatTensor by Pytorch laterbuffer = np.empty((self.clip_len, 3, self.resize_shape[0], self.resize_shape[1]), np.dtype('float16'))for idx, frame in enumerate(video):if flip:frame = cv2.flip(frame, flipCode=flipCode)'''if rotation:rot_mat = cv2.getRotationMatrix2D(center, rotationCode, 1)frame = cv2.warpAffine(frame, rot_mat, (height, width))'''buffer[idx] = self.transform(Image.fromarray(frame))elif self.mode == 'validation':# create a buffer. Must have dtype float, so it gets converted to a FloatTensor by Pytorch laterbuffer = np.empty((self.clip_len, 3, self.crop_size, self.crop_size), np.dtype('float16'))for idx, frame in enumerate(video):buffer[idx] = self.transform_val(Image.fromarray(frame))return buffer.transpose((1, 0, 2, 3))if __name__ == '__main__':datapath = ['/root/data2/dataset/UCF-101']dataset = VideoDataset(datapath, resize_shape=[224, 224],mode='validation')dataloader = DataLoader(dataset, batch_size=16, shuffle=True, num_workers=0)bar = tqdm(total=len(dataloader), ncols=80)for step, (buffer, labels) in enumerate(dataloader):print(buffer.shape)print("label: ", labels)bar.update(1)
2. 直接对视频文件处理

总体处理过程与pkl文件类似,只是处理主体变成了视频文件,代码:

import os
from pathlib import Pathimport randomimport numpy as np
import pickle as pk
import cv2
from tqdm import tqdm
from PIL import Imageimport torchvision.transforms as transforms
import torchfrom prefetch_generator import BackgroundGenerator
from torch.utils.data import DataLoader, Datasetclass VideoDataset(Dataset):def __init__(self, directory_list, local_rank=0, enable_GPUs_num=0, distributed_load=False, resize_shape=[224, 224] , mode='train', clip_len=32, crop_size = 168):self.clip_len, self.crop_size, self.resize_shape = clip_len, crop_size, resize_shapeself.mode = modeself.fnames, labels = [],[]# get the directory of the specified splitfor directory in directory_list:folder = Path(directory)print("Load dataset from folder : ", folder)for label in sorted(os.listdir(folder)):for fname in os.listdir(os.path.join(folder, label)) if mode=="train" else os.listdir(os.path.join(folder, label))[:10]:self.fnames.append(os.path.join(folder, label, fname))labels.append(label)random_list = list(zip(self.fnames, labels))random.shuffle(random_list)self.fnames[:], labels[:] = zip(*random_list)# self.fnames = self.fnames[:240]if mode == 'train' and distributed_load:single_num_ = len(self.fnames)//enable_GPUs_numself.fnames = self.fnames[local_rank*single_num_:((local_rank+1)*single_num_)]labels = labels[local_rank*single_num_:((local_rank+1)*single_num_)]# prepare a mapping between the label names (strings) and indices (ints)self.label2index = {label:index for index, label in enumerate(sorted(set(labels)))} # convert the list of label names into an array of label indicesself.label_array = np.array([self.label2index[label] for label in labels], dtype=int)def __getitem__(self, index):# loading and preprocessing. TODO move them to transform classessbuffer = self.loadvideo(self.fnames[index])height_index = np.random.randint(buffer.shape[2] - self.crop_size)width_index = np.random.randint(buffer.shape[3] - self.crop_size)return buffer[:,:,height_index:height_index + self.crop_size, width_index:width_index + self.crop_size], self.label_array[index]def __len__(self):return len(self.fnames)def loadvideo(self, fname):# initialize a VideoCapture object to read video data into a numpy arrayself.transform = transforms.Compose([transforms.Resize([self.resize_shape[0], self.resize_shape[1]]),transforms.ToTensor(),transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])])flip, flipCode = 1, random.choice([-1,0,1]) if np.random.random() < 0.5 and self.mode=="train" else 0try:video_stream = cv2.VideoCapture(fname)frame_count = int(video_stream.get(cv2.CAP_PROP_FRAME_COUNT))except RuntimeError:index = np.random.randint(self.__len__())video_stream = cv2.VideoCapture(self.fnames[index])frame_count = int(video_stream.get(cv2.CAP_PROP_FRAME_COUNT))while frame_count<self.clip_len+2:index = np.random.randint(self.__len__())video_stream = cv2.VideoCapture(self.fnames[index])frame_count = int(video_stream.get(cv2.CAP_PROP_FRAME_COUNT))speed_rate = np.random.randint(1, 3) if frame_count > self.clip_len*2+2 else 1time_index = np.random.randint(frame_count - self.clip_len * speed_rate)start_idx, end_idx, final_idx = time_index, time_index+(self.clip_len*speed_rate), frame_count-1count, sample_count, retaining = 0, 0, True# create a buffer. Must have dtype float, so it gets converted to a FloatTensor by Pytorch laterbuffer = np.empty((self.clip_len, 3, self.resize_shape[0], self.resize_shape[1]), np.dtype('float16'))while (count <= end_idx and retaining):retaining, frame = video_stream.read()if count < start_idx:count += 1continueif count % speed_rate == speed_rate-1 and count >= start_idx and sample_count < self.clip_len:if flip:frame = cv2.flip(frame, flipCode=flipCode)try:buffer[sample_count] = self.transform(Image.fromarray(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)))except cv2.error as err:continuesample_count += 1count += 1video_stream.release()return buffer.transpose((1, 0, 2, 3))if __name__ == '__main__':datapath = ['/root/data1/datasets/UCF-101']dataset = VideoDataset(datapath, resize_shape=[224, 224],mode='validation')dataloader = DataLoader(dataset, batch_size=8, shuffle=True, num_workers=24, pin_memory=True)bar = tqdm(total=len(dataloader), ncols=80)prefetcher = DataPrefetcher(BackgroundGenerator(dataloader), 0)batch = prefetcher.next()iter_id = 0while batch is not None:iter_id += 1bar.update(1)if iter_id >= len(dataloader):breakbatch = prefetcher.next()print(batch[0].shape)print("label: ", batch[1])'''for step, (buffer, labels) in enumerate(BackgroundGenerator(dataloader)):print(buffer.shape)print("label: ", labels)bar.update(1)'''

http://chatgpt.dhexx.cn/article/E9Fl6DGe.shtml

相关文章

【Java】内部类的定义

目录 一、前言 二、内部类 语法格式&#xff1a; static修饰内部类 内部类未被static修饰时&#xff1a; 内部类被static修饰后 演示操作&#xff1a; 一、前言 前面我们学习了一个小的项目&#xff0c;现在我们来学习新的知识点&#xff0c;关于内部类的描述&#xff0…

Java类的定义、声明及使用

1、 class 类名称{属性方法} 2、声明一个类需要通过一个关键字class 3、类与对象的关系 1&#xff09;类是对某一类事物的描述&#xff0c;是抽象的、概念上的意义&#xff0c;对象是实际存在的该类事物的每一个个体&#xff0c;也被称为实例。 package classdemo; class …

C#类的定义

在C#语言中创建的任何项目都有类的存在&#xff0c;通过类能很好地体现面向对象语言中封装、继承、多态的特性。 类的访问修饰符&#xff1a;用于设定对类的访问限制&#xff0c;包括 public、internal 或者不写&#xff0c;用 internal 或者不写时代表只能在当前项目中访问类…

C#类的定义和声明及使用

类的定义 类的成员 } 例如&#xff0c;以水果为例来声明一个类&#xff0c;代码如下&#xff1a;在 C# 语言中创建的任何项目都有类的存在&#xff0c;通过类能很好地体现面向对象语言中封装、继承、多态的特性。 简单的来说&#xff0c;在C#编程里&#xff0c;类是一种数据结…

(27)python类的定义和使用

面向对象初步 面向对象&#xff08;Object oriented Programming&#xff0c;OOP&#xff09;编程的思想主要是针对大型软件设计而来的。面向对象编程使程序的扩展性更强、可读性更好&#xff0c;使的编程可以像搭积木一样简单。 面向对象编程将数据和操作数据相关的方法封装…

类的认识和定义

前言 C为啥要引入类这个概念呢&#xff0c;以C实现栈为例说明。 typedef int STDataType; typedef struct Stack { . . . .int top; . . . .STDataType* data; . . . .int capacity; }Stack; void StackInit(Stack* ps); //栈的初始化 void StackDestory(Stack* ps); //栈的销…

Python类的定义

类的定义&#xff1a;我们把对象比作一个“饼干”&#xff0c;类就是制造这个饼干的模具。通过类定义数据类型的属性和方法&#xff0c;也就是说&#xff0c;“类将行为和状态打包在一起”。 类的结构 方法&#xff08;函数&#xff09;..............行为 属性&#xff08;…

java类的定义

目录 一、概念二、使用1.成员变量2.成员方法3.权限修饰符4.静态方法 三、重写toString方法 一、概念 我们不能将一个事物称之为一类事物&#xff0c;例如一只鸟我们不能称为鸟类&#xff0c;但是我们需要给一类事物统称&#xff0c;例如大雁&#xff0c;麻雀&#xff0c;燕子&…

C++ 类的定义与使用

十二、类与对象 对象&#xff1a;就是我们生活中的具体事物&#xff0c;看得见摸得到&#xff0c;有一定的属性和行为或操作方式 面向对象&#xff1a;是一种软件的开发方法&#xff0c;对象所指的是计算机系统中的某一个成分。在面向对象程序设计中&#xff0c;对象包含两个…

4.类的定义,变量类型,方法类型

文章目录 1.类的概念1.1 如何创建一个类1.2 如何定义一个类1.2.1变量1.2.2 方法 2.对象3.类定义使用实例4.理解类和对象的关系4.1.一个java程序和类之间的关系 5.细节知识分析5.1.类与类的关系5.2.变量和变量区别5.3.方法的区别5.4.类方法和类变量的特点 1.类的概念 类java是基…

关于类的定义

类的定义 类的概念如何定义类修饰符 类的概念 1、类是把事物的数据与相关功能封装到一起&#xff0c;形成一种特殊的数据结构&#xff0c;用以表达真是事物的一种抽象&#xff1b;而对象则是实际存在的属该类事物的具体个体&#xff0c;因而也称为实例&#xff08;instance&am…

python 爬虫爬取疫情数据,爬虫思路和技术你全都有哈(一)

python 爬虫爬取疫情数据&#xff0c;爬虫思路和技术你全都有哈&#xff08;二、数据清洗及存储&#xff09; 爬起疫情数据&#xff0c;有两个网址&#xff1a; 1、百度&#xff1a;链接 2、丁香园疫情&#xff1a;链接 在这两个中&#xff0c;丁香园的爬虫相对简单一点&#…

采用python爬虫爬取数据然后采用echarts数据可视化分析

前言&#xff1a;采用python爬虫爬取天气数据然后采用echarts数据可视化画图分析未来天气变化趋势 从获取数据到可视化的流程 &#xff08;熟悉爬虫爬取数据然后数据可视化这个过程&#xff09; 一、python爬取未来8-15天的天气数据 1、导入用到的一些python第三方库 imp…

python网络爬虫爬取数据,python全网爬取内容

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;python网络爬虫爬取数据&#xff0c;利用python爬取数据&#xff0c;现在让我们一起来看看吧&#xff01; 网络爬虫&#xff0c;就是按照一定规则自动访问互联网上的信息并把内容下载下来的程序或脚本。 在整个的Python…

Python爬虫爬取网页数据并存储(一)

Python爬虫爬取网页数据并存储&#xff08;一&#xff09; 环境搭建爬虫基本原理urllib库使用requests库使用正则表达式一个示例 环境搭建 1.需要事先安装anaconda&#xff08;或Python3.7&#xff09;和pycharm *anaconda可在中科大镜像下下载较快 2.安装中遇到的问题&#x…

【用Java爬取网页图片——爬虫爬取数据】

用Java爬取网页图片——爬虫爬取数据 1、在创建项目中导入jsoup 2、创建一个保存下载图片的路径 3、使用URL读取网页路径&#xff0c;jsoup读取网页内容 4、利用属性标签获取图片连接块 5、因为该路径没有http&#xff1a;头&#xff0c;用StringBuilder增加 5、完善下载路径…

爬虫爬取数据

打开爬取工具页面,使用爬虫工具列表: 开始节点 仅仅是爬虫的起点,所有流程图必须有该节点。 爬取节点 该节点用于请求HTTP/HTTPS页面或接口 请求方法:GET、POST、PUT、DELETE等方法 URL: 请求地址 延迟时间:单位是毫秒,意思是爬取之前延迟一段时间在执行抓取 超时时间:网…

手把手教会 爬虫爬取json数据

提示&#xff1a;本章爬取练习的url地址 发现曲谱 (yoopu.me) 前言 我们学爬虫&#xff0c;有时候想要的数据并不在html文本里面&#xff0c;而是通过js动态渲染出来的。 如果我们需要爬取此类数据的话&#xff0c;我们该怎么办呢&#xff1f; 请读者接着往下看&#xff1a…

六个步骤学会使用Python爬虫爬取数据(爬虫爬取微博实战)

用python的爬虫爬取数据真的很简单&#xff0c;只要掌握这六步就好&#xff0c;也不复杂。以前还以为爬虫很难&#xff0c;结果一上手&#xff0c;从初学到把东西爬下来&#xff0c;一个小时都不到就解决了。 Python爬虫六部曲 第一步&#xff1a;安装requests库和BeautifulS…

网络爬虫入门:网络爬虫的目的,企业获取数据的方式,可以用于做爬虫的程序语言,爬虫爬取数据的步骤

目录 爬取数据的目的&#xff1a; 1.获取大量数据&#xff0c;用于做数据分析 2.公司项目的测试数据&#xff0c;公司业务所需数据 企业获取数据的方式 1.公司自有数据 2.第三方数据平台购买&#xff08;数据堂&#xff0c;贵阳大数据交易所&#xff09; 3.爬虫爬取数据…