配套课件可访问https://github.com/BIMK/MATLAB下载,是安徽大学Matlab本科教学课件,逻辑清晰,简洁明了,颇为实用,用来入门再好不过(机器学习方向)。
本系列博文是课后练习的个人解答,通过几个小实验展示matlab基本语法和技巧。接触Matlab也有几年了,略有心得,分享给大家。
1. 熟悉matlab数据处理的基本方法
2. 掌握基本的爬虫和正则表达式使用方法
3. 掌握数据的后续处理、排序等操作
1. 从安居客上爬取合肥各小区二手房信息,并汇总保存至Excel中。
2. 从 https://hf.anjuke.com/community/p1/至p50/中获取每个小区的名称、行政区、子区域和价格信息,共计1500条。
3. 将所有信息保存在Excel中,并按以下规则重排:
所属子区域相同的小区排列在一起,且小区按价格进行降序排列
所属行政区相同的子区域排列在一起,且子区域按
其中小区最高价进行降序排列
行政区按其中小区最高价进行降序排列
代码(详见注释)
function task()
%% 爬虫
Data = {};
for num = 1:50
try
str = urlread(['https://hf.anjuke.com/community/p',num2str(num),'/']);
name = regexp(str,'(?<=\n\s{35}target="_blank">).*?(?=)','match');
temp = regexp(str,'(?<=).*?(?=)','match');
loc = cell(size(temp,2),2);
for i = 1:size(temp,2)
loc(i,1) = regexp(temp{i},'(?<=£Û).*?(?=-)','match');
loc(i,2) = regexp(temp{i},'(?<=-).*?(?=£Ý)','match');
loc = cellfun(@(s)s(s>999),loc,'UniformOutput',false);
end
price = regexp(str,'(?<=)\d+','match');
Data = [Data;name',loc,price'];
clc;fprintf('%d %d',num,size(Data,1));
catch
break;
end
end
%% 爬虫数据存读 方便调试
% save Data Data
load('Data.mat');
%% 按小区分类
Loc2{1} = Data(1,:);
for i = 2:size(Data,1)
for j = 1:size(Loc2,1)
if isequal(Loc2{j}(1,3),Data(i,3))
Loc2{j} = [Loc2{j};Data(i,:)];
break;
elseif j==size(Loc2,1)
temp{1} = Data(i,:);
Loc2 = [Loc2;temp];
end
end
end
%% 小区内按价钱排序
for i = 1:size(Loc2,1)
[~,rank] = sort(str2double(Loc2{i}(:,4)),'descend');
Loc2{i} = Loc2{i}(rank,:);
end
%% 按行政区分类&按小区最高价排列
Loc1{1} = Loc2{1};
for i = 2:size(Loc2,1)
for j = 1:size(Loc1,1)
%如果行政区已经存在
if isequal(Loc1{j}(1,2),Loc2{i}(1,2))
%寻找该小区在行政区中插入点
for k = 1:size(Loc1{j},1)
if k == 1
if str2double(Loc1{j}(1,4))<=str2double(Loc2{i}(1,4))
Loc1{j} = [Loc2{i};Loc1{j}];
break;
end
elseif ~isequal(Loc1{j}(k,3),Loc1{j}(k-1,3))
if str2double(Loc1{j}(k,4))<=str2double(Loc2{i}(1,4))
Loc1{j} = [Loc1{j}(1:k-1,:);Loc2{i};Loc1{j}(k:end,:)];
break;
end
end
if k == size(Loc1{j},1)
Loc1{j} = [Loc1{j};Loc2{i}];
break;
end
end
break;
%行政区未存在则添加
elseif j == size(Loc1,1)
temp{1} = Loc2{i};
Loc1 = [Loc1;temp];
end
end
end
%% 按行政区最高价排列
Result = Loc1{1};
for i = 2:size(Loc1,1)
for j = 1:size(Result,1)
if j == 1
if str2double(Result(j,4))
运行结果(详见my.xlsx)
合肥房价也是越来越高了啊