首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用MATLAB爬取网页数据

使用MATLAB爬取网页数据

作者头像
bugsuse
发布2020-04-21 17:32:46
4K0
发布2020-04-21 17:32:46
举报
文章被收录于专栏:气象杂货铺气象杂货铺

之前讲了用python如何爬取网页数据,仅简单的爬取了纯文本网页,不涉及模拟登录等操作。因此实现起来比较简单。

这次以爬取中国天气网的雷达图为例,讲一下如何使用MATLAB爬取网页数据。

  • 首先,打开中国天气网首页,可以看到红色框中标注的URL (http://www.weather.com.cn) 和雷达选项;
  • 然后,点击 雷达 选项,即可打开雷达图页面

这时候,URL变为: http://www.weather.com.cn/radar/

这是默认的全国雷达拼图页URL地址,通常不需要雷达拼图,而是需要单站雷达图。因此,我们主要以下载单站雷达图为例。

右击查看网页源代码,一直下拉可以看到单站雷达的名称,坐标以及URL信息。后面可以根据此网页提供的单站雷达信息,通过单站雷达检索,跳转到指定的单站雷达页然后下载雷达图。

以北京的单站雷达为例:

以 北京 为关键词搜索,可以定位到北京雷达的URL,然后可以打开网页地址,即可跳转到北京雷达的页面:

单击图片可以发现,雷达图为 png 格式,这样下面在搜索时直接搜索png即可。

跳转后右击查看网页源代码,然后以 png 为关键词搜索,可以定位到雷达图的URL地址。图中同一张图有两个URL,value 标签和 bigPic 标签均指向一个雷达图。为了方便定位,只检索 bigPic 标签的值,因为 value 标签的值除了雷达图的URL外,还有很多干扰项,不便于获取雷达图。

利用正则表达式,匹配雷达图URL,然后就可以下载图片了。

上述是获取网页数据的分析思路以及流程,下面上代码。毕竟实践出真知~

在查看网页源代码时可以发现,网页编码采用的是:UTF8编码方式。因此,获取数据之前,要配置一些参数:

% 设置网页编码格式
options = weboptions('characterencoding','UTF-8');
% 获取网页数据
data  =  webread('http://www.weather.com.cn/radar/',options);
% 检索单站雷达
station = regexp(data, '(?<=<area.title=")\w+','match');

上述单站雷达的信息均包含在 area title 标签的信息中,因此对 area title 标签进行匹配。

staname = '北京';
staname =  deblank(staname);
% 获取站点索引
indx = strfind(station, staname, 'ForceCellOutput', 1);
% 确定站点具体索引值
stain = false; 
for i = 1:length(indx)
    if ~isempty(indx{i})
        staind = i;
        stain = true;
    end
end

获取站点索引值之后就可以匹配雷达图的URL信息了:

staurl = regexp(data,'(?<=<area.title="\w+".target="\w+".href=")\w+...(\w+\.)+(\w+.)+\w+','match');
stadata = webread(staurl{staind});
% 获取单站雷达的所有雷达图URL地址
stapic = regexp(stadata, '(?<=bigPic=")\w+.//(\w+\.)+(\w+/)+(\w+.)+\.png','match');

获取到所有雷达图的URL地址之后就是循环下载了。至此,就完成了单站雷达基本发射率图的下载。

totalnum = length(stapic);
for i = 1: totalnum
    file = regexp(stapic{i},'\d+\.png','match');
    filename = [filepath staname syp file{1}];
    try
        websave(filename, stapic{i});
        n = n+1;
    catch
        fprintf('%s fail to save! Maybe the url \n %s \nis error!\n', filename, stapic{i});
    end
end

为了更好的利用函数,方便后面使用,还需要对函数进行一定的异常处理。比如,有时候站点信息不一定对,就要在站点错误时进行提示;由于网络连接或是其他原因,可能会导致一些图片下载出现问题,就要记录哪些下载成功了,哪些下载失败了。对于下载失败的图片是否再次下载还是忽略等等。如果要长期使用,并且要求用户友好,那么这些都需要进行处理。

网页中除了提供了雷达图之外,还提供了降雨量,风速等信息,如果感兴趣的话同样可以顺便下载。这部分就不说了,感兴趣的话可以查看网页源代码,确定这部分信息对应的哪些 HTML标签,然后正则匹配即可。

总结

主要命令

  1. weboptions 主要用于设置网页参数
  2. webread 主要用于获取网页内容
  3. websave 主要用于存储网页数据
  4. strfind 主要用于检索信息
  5. regexp 主要用于正则匹配

关于上述命令的具体使用方法可 help 查看。

随着MATLAB版本的升级,其中关于网页爬取的函数也在发生着变化。比如urlread 变为 webread,2016b开始增加了string函数,更方便了网页数据的获取。由于篇幅限制,这部分内容下次再说。

上述函数在 气象家园 相关帖子中提供了下载,同样页放到网盘中,同时提供中国气象局雷达图的下载程序。


注1:http://bbs.06climate.com/forum.php?mod=viewthread&tid=48241&extra=

注2:链接: https://pan.baidu.com/s/1dF5sPlZ 密码: feq8

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-07-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 气象杂货铺 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档