获取网页源码webread();
从 RESTful Web 服务读取内容
data = webread(url) %常用
data = webread(url,QueryName1,QueryValue1,...,QueryNameN,QueryValueN)
data = webread(___,options)[data,colormap,alpha] = webread(___)
[data,Fs] = webread(___)
爬虫我们只需要用到第一个用法,读取网页源码信息。举个读取图片的例子,例子来自matlab帮助文档。
url = 'http://heritage.stsci.edu/2007/14/images/p0714aa.jpg';
rgb = webread(url);
whos rgb
Name Size Bytes Class Attributes
rgb 1000x800x3 2400000 uint8
rgb = imresize(rgb,0.6);
imshow(rgb)
当然我们是要爬取信息延迟用法比上面更加简单。以二手房网站为例。
url='https://cs.lianjia.com/ershoufang/rs/'; %写入网站
webdata=webread(url); %读取网站HTML内部代码
信息就读取到webdata里面去了,这个信息就算一个字符串,内容大概几十万个字符吧。如果版本过低用不了webread();可以转用*urlreda();*用法类似。
匹配正则表达式regexpi();
这个函数用人话说就是找到你想要的东西的位置。这里强调一下,匹配正则表达式是爬虫的核心。regexp();这个区分大小写,而它的兄弟regexpi();不区分大小写。
网上关于匹配正则表达式内容很多,我就举几个例子。
%在commend window输入下面指令
str='dfajkdfjaifjowfj ^&*$d546&54 中国 1房1厅'; %随便写的字符串
%我们要找到汉字的位置
site=regexpi(str,'[^\x00-\xff]') %没有分号
[\x00-\xff]表示ASCII码,加了^表示非ASCII码即汉字,别的文字我也没试过。
%在matlab字符串中汉字只占一个字节
site=
30 31 34 36
可以看出在regexpi找到了汉字的位置。如果我们要找到中国呢,或者两个相连的汉字怎么找。
site=regexpi(str,'[^\x00-\xff]{2}') %{2}表示重复找两次,
%如果想找n次{n}
%想找n到m次{n,m}
site=regexpi(str,'中国')
%上面指令都会是如下结果
site=
30
str(site)
ans=
中
当然这些指令都是表示中字的位置,要找到国字只需要在后面加end。
site1=regexpi(str,'[^\x00-\xff]{2}','end')
site1=
31
str(site:site1)
ans=
中国
举最后的例子
如果找到字符串里面的1房1厅,中间数字交替的位置
site=regexpi(str,'(?:[0-9][^\x00-\xff]){2,3}');
site1=regexpi(str,'(?:[0-9][^\x00-\xff]){2,3}','end');
str(site:site1)
ans=
1房1厅
因为regexpi这个函数太灵活了,这里我就不做太多赘述了。想继续了解的请借鉴 doc regexpi。
为什么会去用matlab写爬虫
我在周末逛b站无意间看到有up主做了一个视频,我也仿照了它的做了一个。
up主讲解视频在这里
我将会从自己的角度讲述用matlab写爬虫。
我是以长沙家链网的数据为目标爬取。
clear
clc
%清除前面的数据
url='https://cs.lianjia.com/ershoufang/rs/';%写入网站
webdata=webread(url); %读取网站HTML内部代码
由于长沙有很多区网页不一样多了一个后缀,但是人类的本质就是偷懒找规律,我就开启了神奇的F12键,找到了后缀所在的区域。
于是我就把它锁定在区间 区域和地铁 之间
%找到子网页网站结尾
webdata_title_up=regexpi(webdata,'<!-- 区域 -->','end');
webdata_title_down=regexpi(webdata,'<!-- 地铁 -->');
%读取的数据存在web_section(网页段)
web_section=webdata(webdata_title_up:webdata_title_down);
subweb_title_up=regexpi(web_section,'/ershoufang/','end');
subweb_title_down=regexpi(web_section,'/" title=');
name_title=regexpi(web_section,'[^\x00-\xff]{8,11}');
name_title_down=regexpi(web_section,'[^\x00-\xff]{8,11}','end');
subweb_title_up=subweb_title_up';
subweb={''}; %用来存子网页网址
name={''};
for i=1:1:size(subweb_title_up)
name(i,1)={[web_section(name_title(i):name_title_down(i)),'.xls']};
%保存类似长沙雨花在售二手房这种名字信息
subweb(i,1)={['https://cs.lianjia.com/ershoufang',web_section(subweb_title_up(i):subweb_title_down(i))]};
%保存后缀
end
现在我们拥有每个区的网站了,进入雨花区网页后,每个房子都有自己的id,每一页有30套房子在挂牌销售。那么我们就先找到一共有多少页totalPage。再提取每个房子的id,最后找到自己想要的信息。
web_title={''};%存储自己想要的信息。
houes_id={''};
for i=1:1:size(subweb)
url=subweb{i,1};
webdata=webread(url);
%提取子网页总页数
totalPage_up=regexp(webdata,'"totalPage":','end');
totalPage_down=regexp(webdata,',"curPage');
%将字符串转换成数字
totalPage=str2num(webdata(totalPage_up+1:totalPage_down-1));
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%翻页用
for current_of_pages=1:1:totalPage
if current_of_pages>=2
url=char({['https://cs.lianjia.com/ershoufang/pg',num2str(current_of_pages)]});
end
webdata=webread(url);
houes_id_site=regexp(webdata,'houseid="','end');
ct2=1;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for j=1:1:30
houes_id(ct2,1)={webdata(houes_id_site(ct2)+1:houes_id_site(ct2)+12)};
ct2=ct2+1;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
ct=1;
for k=1:1:30 %因为一页有30个房子
%获取每个房子的网站
%因为id被当成数字,所以用char函数帮他改为字符串
web_title(ct+30*(current_of_pages-1),1)={['https://cs.lianjia.com/ershoufang/',char(houes_id(ct)),'.html']};%这里必须加html否则进不去
%抓取信息
url=char({['https://cs.lianjia.com/ershoufang/',char(houes_id(ct)),'.html']});
webdata=webread(url);
%位置
total=regexp(webdata,'小区名称','end');
total_down=regexp(webdata,'所在区域');
residential_area_data=webdata(total+1:total_down-1);
total=regexp(residential_area_data,'[^\x00-\xff]*');
total_down=regexp(residential_area_data,'[^\x00-\xff]*','end');
web_title(ct+30*(current_of_pages-1),2)={residential_area_data(total:total_down)};
%价格
total=regexp(webdata,'"total">','end');
total_down=regexp(webdata,'"total">(\d{2,4}\.\d{0,1}|\d{2,3})','end');
web_title(ct+30*(current_of_pages-1),3)={[webdata(total(1)+1:total_down),'万']};
%均价
total=regexp(webdata,'unitPriceValue">','end');
total_down=regexp(webdata,'unitPriceValue">\d{4,6}','end');
web_title(ct+30*(current_of_pages-1),6)={[webdata(total(1)+1:total_down),'元/平']};
%面积
total_size=regexp(webdata,'houseInfo','end');
total_size_down=regexp(webdata,'aroundInfo');
houseInfo_data=webdata(total_size:total_size_down);
web_title(ct+30*(current_of_pages-1),4)={[houseInfo_data(regexpi(houseInfo_data,'mainInfo">\d\d','end')-1:regexpi(houseInfo_data,'mainInfo">(\d{2,4}\.\d{1,2}|\d{2,3})','end')),'平米']};
%户型room
roominfo_data=regexp(houseInfo_data,'room','end');
roominfo_data_down=regexp(houseInfo_data,'type');
room_data=houseInfo_data(roominfo_data:roominfo_data_down);
web_title(ct+30*(current_of_pages-1),5)={room_data(regexpi(room_data,'(?:[0-9][^\x00-\xff]){1,5}'):regexpi(room_data,'(?:[0-9][^\x00-\xff]){1,5}','end'))};
ct=ct+1;
%随机等几秒钟
pause(randi(5));
end
end
xlswrite('C:\Users\Administrator\Desktop\niubi\长沙.xls',web_title,i);
end
简单的爬虫,用最暴力的方法找信息。上面三段代码同是复制到matlab的.m文件中跑一下。
但是这个爬虫需要很好的网络不然,中断重新跑就比较麻烦,我陆陆续续就断了好几次,个人理解。
由于第一次写这个文章,所以不能把我重点,如果有错误的地方,还请大佬们指正。
今天的文章MATLAB爬虫初级教程分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/24043.html