MATLAB爬虫初级教程[亲测有效]

MATLAB爬虫初级教程[亲测有效]获取网页源码webread();从RESTfulWeb服务读取内容data=webread(url)%常用data=webread(url,QueryName1,QueryValue1,…,QueryNameN,QueryValueN)data=webread(___,options)[data,colormap,alpha]=webread(___)[da…

大家好,欢迎来到IT知识分享网。

获取网页源码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,最后找到自己想要的信息。

F12基本操作

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文件中跑一下。

但是这个爬虫需要很好的网络不然,中断重新跑就比较麻烦,我陆陆续续就断了好几次,个人理解

由于第一次写这个文章,所以不能把我重点,如果有错误的地方,还请大佬们指正。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/26448.html

(0)

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

关注微信