爬虫实战 用matlab爬取链家房价 爬虫入门( 超详细!)

1. 我们首先进入广州链家网站观察其结构

在这里插入图片描述然后我们勾选需要组合的价格大小等,因为一种组合只能显示100页,一页最多30个选择,为了避免重复爬取数据,我们每一种类型都只勾选一种,得到下面的网址:

在这里插入图片描述我们可以发现 l 代表房型,a表示面积,p表示价格,pg表示页数,后面的数字表示选中的第几个,也可以多选


2. 下一步我们选择一种组合方式查看网页源代码,观察需要的数据怎么提取

在这里插入图片描述在中间找到信息的存放格式


3. 下面以这个网页为例,找到需要的信息

Website='https://gz.lianjia.com/ershoufang/pg1l1a1p1/';
[source, state]=urlread(Website);
Site=string(regexp(source,'(?<=</a><div class="info">).*?(?=</div><div class="tag">)','match')');
% 这个正则表达式的含义为将满足前面 为</a><div class="info">,后面为</div><div class="tag">的字符串提取出来

详细介绍请看另一文章
输出结果:

在这里插入图片描述
下面这段代码用于提取房子信息以及去除不符合条件的房子介绍,比如说里面会混入一些车位,这样会有一些属性没有,会导致后面的字符串矩阵维度错误,实现方式是判断每一套房子的属性的个数,将不等于5的房子去除,里面用到了cellfun函数,这个函数是向量化编程的一个重要函数,可以对元胞数组里面的元素分别使用某一函数,详细介绍请移步 cellfun介绍

            aa=regexp(Site,'<span>/</span>','split');
            haha=cell2mat(cellfun(@size ,aa,'UniformOutput',false));
            haha=find(haha(:,2)~=5);
            aa(haha)=[]

然后将aa按照属性排列

aa=reshape([aa{:}],5,length(aa))'

得到效果如下

在这里插入图片描述
至此,一页的大部分数据就已经全部取出来了,房价和单价都在aa中还没提取,下面爬取对房源的描述,这些属性可以存放到一个矩阵里面然后再一次全部写入Excel中

            Describe=string(regexp(source,'(?<=" data-is_focus=""  data-el="ershoufang">).*?(?=</a><div class="info">)','match')');
            Describe=(regexp(Describe,'(?<=data-is_focus=""  data-el="ershoufang">).*?','split'));
            Describe=reshape([Describe{:}],2,length([Describe{:}])/2)';
            Describe=Describe(:,2);
            Describe(haha)=[]

结果如图:

在这里插入图片描述
需要注意的是,由于我们在前面过滤了不符合条件的房子,这里的房源描述也要根据前面的过滤结果进行过滤,但是有一个问题就是不是所有的房源都有描述,所以还需要自行调整。


            Site=aa(:,1);
            HouseType=string(aa(:,2));
            HouseArea=string(aa(:,3));
            Decoration=string(aa(:,5));

这里分别得到位置,房型,面积,装修

            Average='(?<=data-price=")\d*\.?\d*?(?=">)';
            Average=string(regexp(source,Average,'match')');
            HousePrice='(?<=<div class="price"><span>)\d*\.?\d*?(?=</span>)';
            HousePrice=string(regexp(source,HousePrice,'match')'); 
            HousePrice(haha)=[];
            Average(haha)=[];

同样用正则表达式提取出房价等信息,最后将数据进行整理准备写入

            SS=[SS ;Site]; 
            HT=[HT ;HouseType]; 
            HA=[HA; HouseArea];
            De=[De; Decoration]; 
            HP=[HP; HousePrice] ;
            Av=[ Av ;Average];
            DB=[DB ;Describe];
            Data=[ string('地址') string('房型') string('大小') string('装修') string('总价/万') string('单价/万');SS HT HA De HP Av;];
              xlswrite('Data.xls',Data);

在这里插入图片描述


4. 下面是完整代码

Type='l';    %表示选中的房型
Area='a';   %表示选中的面积
Price='p';  % 表示选中的价格
% 顺序为 pg l a p,后面需要斜杠
SS=[];HT=[];HA=[];HP=[];De=[];Av=[];DB=[]; % 用于保存得到的数据
p=1:6
    for l=1:6
        for a=1:6
            Website=['https://gz.lianjia.com/ershoufang/' 'pg1' Type num2str(l) Area num2str(a) Price num2str(p)];
            [source, state]=urlread(Website);
            if ~state
                continue;
            end
            GetTotalPage='(?<="page-data=''{"totalPage":).*?(?=,"curPage)';
            TotalPage=str2double(regexp(source,GetTotalPage,'match'));
            if isempty(TotalPage)
                continue;
            end
            for pg=1:TotalPage
                 Website=['https://gz.lianjia.com/ershoufang/' 'pg' num2str(pg) Type num2str(l) Area num2str(a) Price num2str(p)];
                [source state]=urlread(Website);
                if ~state
                disp('爬取网页出错,当前序号:');
                l 
                a
                p
                   end
            Site=string(regexp(source,'(?<=</a><div class="info">).*?(?=</div><div class="tag">)','match')');
            % aa 为数据集
            try
            aa=regexp(Site,'<span>/</span>','split');
            haha=cell2mat(cellfun(@size ,aa,'UniformOutput',false));
            haha=find(haha(:,2)~=5);
            aa(haha)=[];
            catch
                continue;
            end
            try
            aa=reshape([aa{:}],5,length(aa))';
            catch
                continue
            end
             Describe=string(regexp(source,'(?<=" data-is_focus=""  data-el="ershoufang">).*?(?=</a><div class="info">)','match')');
            Describe=(regexp(Describe,'(?<=data-is_focus=""  data-el="ershoufang">).*?','split'));
            Describe=reshape([Describe{:}],2,length([Describe{:}])/2)';
            Describe=Describe(:,2);
            Describe(haha)=[]; % 简介,标题   
            Site=aa(:,1);
            HouseType=string(aa(:,2));
            HouseArea=string(aa(:,3));
            Decoration=string(aa(:,5));
            clear aa;
            Average='(?<=data-price=")\d*\.?\d*?(?=">)';
            Average=string(regexp(source,Average,'match')');
            HousePrice='(?<=<div class="price"><span>)\d*\.?\d*?(?=</span>)';
            HousePrice=string(regexp(source,HousePrice,'match')'); 
            HousePrice(haha)=[];
            Average(haha)=[];
            SS=[SS ;Site]; 
            HT=[HT ;HouseType]; 
            HA=[HA; HouseArea];
            De=[De; Decoration]; 
            HP=[HP; HousePrice] ;
            Av=[ Av ;Average];
            DB=[DB ;Describe];      
            end
        end        
    end    
end
 Data=[ string('地址') string('房型') string('大小') string('装修') string('总价/万') string('单价/万');SS HT HA De HP Av;];
 xlswrite('Data.xls',Data);

结果如下:
在这里插入图片描述
如果需要得到更美观的Excel表格请看matlab对Excel进行控制

  • 11
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
好的,我可以为您提供一个简单的爬取链家网广州市番禺区二手房信息并写入 Excel 表格的 Matlab 代码示例。请注意,这个代码示例仅供参考,具体的实现可能需要根据您的需要进行修改。 ```matlab % 设置网站 URL 和需要爬取的页面数量 url = 'https://gz.lianjia.com/ershoufang/pfdistrict/pg'; page_count = 5; % 创建 Excel 表格并写入表头 filename = 'ershoufang.xlsx'; headers = {'名称', '位置', '房型', '面积', '朝向', '装修', '总价', '单价'}; xlswrite(filename, headers, 'Sheet1', 'A1'); % 循环爬取每个页面的信息并写入表格 for i = 1:page_count % 构造当前页面的 URL current_url = strcat(url, num2str(i), '/'); % 读取当前页面的内容 page = webread(current_url); % 提取房源信息 expr = '<div class="houseInfo">.*?<a.*?>(.*?)</a>.*?<div class="positionInfo">.*?<a.*?>(.*?)</a>.*?<div class="houseInfo">.*?<span class="houseIcon"></span>(.*?)</div>.*?<div class="houseInfo">.*?<span class="houseIcon"></span>(.*?)</div>.*?<div class="houseInfo">.*?<span class="houseIcon"></span>(.*?)</div>.*?<div class="houseInfo">.*?<span class="houseIcon"></span>(.*?)</div>.*?<div class="totalPrice">.*?<span>(.*?)</span>.*?<div class="unitPrice".*?<span>(.*?)</span>'; tokens = regexp(page, expr, 'tokens'); % 将房源信息写入表格 for j = 1:numel(tokens) row = [tokens{j}{1}, tokens{j}{2}, tokens{j}{3}, tokens{j}{4}, tokens{j}{5}, tokens{j}{6}, tokens{j}{7}, tokens{j}{8}]; row_num = size(xlsread(filename)); xlswrite(filename, row, 'Sheet1', strcat('A', num2str(row_num(1)+1))); end end ``` 需要注意的是,链家网有反爬虫机制,可能会封禁 IP,导致无法访问网站。同时,爬取网站信息需要遵守网站的规定和法律法规,不得侵犯他人权益。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

肆拾伍

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值