之前讲了用python如何爬取网页数据,仅简单的爬取了纯文本网页,不涉及模拟登录等操作。因此实现起来比较简单。
这次以爬取中国天气网的雷达图为例,讲一下如何使用MATLAB爬取网页数据。
这时候,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标签,然后正则匹配即可。
总结
主要命令:
关于上述命令的具体使用方法可 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