SAS网络爬虫抓取网页数据-经管之家官网!

人大经济论坛-经管之家 收藏本站
您当前的位置> 软件培训>>

SAS软件培训

>>

SAS网络爬虫抓取网页数据

SAS网络爬虫抓取网页数据

发布:1989pengwei | 分类:SAS软件培训

关于本站

人大经济论坛-经管之家:分享大学、考研、论文、会计、留学、数据、经济学、金融学、管理学、统计学、博弈论、统计年鉴、行业分析包括等相关资源。
经管之家是国内活跃的在线教育咨询平台!

获取电子版《CDA一级教材》

完整电子版已上线CDA网校,累计已有10万+在读~ 教材严格按考试大纲编写,适合CDA考生备考,也适合业务及数据分析岗位的从业者提升自我。

完整电子版已上线CDA网校,累计已有10万+在读~ 教材严格按考试大纲编写,适合CDA考生备考,也适合业务及数据分析岗位的从业者提升自我。

本人刚刚完成SAS正则表达式的学习,初学SAS网络爬虫,看到过一些前辈大牛们爬虫程序,感觉很有趣。现在结合实际例子,浅谈一下怎么做一些最基本的网页数据抓取。第一次发帖,不妥之处,还望各位大牛们指正。本帖研究网 ...
免费学术公开课,扫码加入


本人刚刚完成SAS正则表达式的学习,初学SAS网络爬虫,看到过一些前辈大牛们爬虫程序,感觉很有趣。现在结合实际例子,浅谈一下怎么做一些最基本的网页数据抓取。第一次发帖,不妥之处,还望各位大牛们指正。
本帖研究网页为'http://health.gmw.cn/2012-10/03/content_5266132.htm',意在提取该网页中全国各省降雨量信息,部分截图如下:
大致步骤就是用filenamefilerefurl '网页地址'获取网页代码信息(包含有待提取数据),再用infile fileref将字符代码读入变量中,接着根据待提取数据的特点对写入的观测进行“数据清洗”,最后获得所需数据观测。
先针对该过程中可能出现的问题,做一下简单说明:
1.本人所用SAS软件为多国语言9.2版,刚开始运行含有filenamefilerefurl '网页地址'及infile fileref时,很不友好的显示错误:无法连接主机。这一问题困惑我好久。最后看到有前辈发帖,从一个网站http://ftp.sas.com/techsup/download/hotfix/f9_sbcs_prod_list.html#034098下载相关hot fix(F9BA26)以后,得以解决。
2.若未在infile语句中加encoding='utf-8',得出的观测乱码。
3.正则表达式并不是必须的,但是用起来简洁明了,与一些字符函数配合使用,绝对可以达到你想要的提取目的。
4.大家进入网页后,点击右键,查看源代码(有些是源文件),这个源代码就是我们需要写入数据集的文件。先用
filename fileref url 'http://health.gmw.cn/2012-10/03/content_5266132.htm';
5.怎样将网页源文件代码写入数据集?用infile+input。不过根据写入方式不同,后续清洗数据的程序自然也不一样了。由于源代码中每一个input line的形式为<...>!!!<...>或者<...><...>(大家可以观察网页的源代码),而我们需要的数据就包含在!!!里面。而由于一个网页包含的信息太多,也有可能找到的!!!不包含所需数据。为了“清洗”数据方便,在这里我采用了一个比较笨的方法,通过观察源代码中待提取数据的大致范围,如第一个待提取字符串"黑龙江"出现在第184个input line,而最后一个"120”(澳门人均降水) 则出现在第623个input line,其他input line我们不需要,可以考虑在infile语句中加入firstobs=184 obs=623。
注意:由于网页可能发生小的变化,firstobs=与obs= 的值可能不准确,从而影响结果。建议查看源代码确定相应值。
这里介绍两种不同的写入方式。
a.以'>'为分隔符,写入后每个观测就形如<...或者!!!<...,而后者是我们所需保留的观测。根据!!!<...写出对应正则表达式进行清洗。考虑用正则表达式'/.+/'。
此种方式编程如下:
/*.............................................................................................................................*/
filenamefilerefurl 'http://health.gmw.cn/2012-10/03/content_5266132.htm';
data a;
infile filereflrecl=10000dlm='>' encoding='utf-8' firstobs=184 obs=623;
length text $1000;
input text $ @@;
run;
data newa;
if_n_=1 then prx=prxparse('/.+</');
retainprx;/*必须要用retain 否则下次循环时prx置为空值而产生错误*/
set a;
ifprxmatch(prx,text);/*筛选那些不符合正则表达式形式的观测值*/
text=substr(text,1,find(text,'<')-1);/*从合适观测中提取所需数据的字符形式*/
drop prx;
run;
/*.................................................................................................................................*/
b.源代码文件中每一个input line整体作为一个值,这样就保留了原来形式<...>!!!<...>或者<...><...>,根据>!!!<写出对应表达式进行清洗。考虑用正则表达式'/>.{1,8}</'(数据位数最多为8)。
此种方式编程如下:
/*................................................................................................................................*/
filenamefilerefurl'http://health.gmw.cn/2012-10/03/content_5266132.htm';
data b;
infile filereflrecl=10000encoding='utf-8'firstobs=184obs=623length=len;
input text $varying1000. len;
run;
data newb;
if _n_=1 then prx=prxparse('/>.{1,8}</');
retain prx;
set b;
call prxsubstr(prx,text,position,length);
if position;
text=substrn(text,position+1,length-2);
keep text;
run;
/*...............................................................................................................................*/
以上两种方式主要看各位的习惯吧。得到了筛选后的数据集work.newa(work.newb),数据集只含有1个变量text。而网页中则有6个变量。这是就需要对数据集work.newa做写什么了。
法1.set操作:
/*.................................................................................................................................................................*/
data new;
set newa(rename=(text=text1) firstobs=1);
set newa(rename=(text=text2) firstobs=2);
set newa(rename=(text=text3) firstobs=3);
set newa(rename=(text=text4) firstobs=4);
set newa(rename=(text=text5) firstobs=5);
set newa(rename=(text=text6) firstobs=6);
if not anydigit(text1);
label text1='名称(1)'text2='人口'text3='面积'text4='年降水量'text5='总降水量' text6='人均降水';
run;
/*.............................................................................................................................................................*/
注意:为避免重复,上述6个set语句完全可以用宏语句来代替,程序如下:
%macro t(n);
%do i=1 %to &n;
%str(set n(rename=(text=text&i) firstobs=&i);)
%end;
%mend;
data new;
%t(6)
if not anydigit(text1);
label text1='名称(1)'text2='人口'text3='面积'text4='年降水量'text5='总降水量' text6='人均降水';
run;
法2.分组transpose:
/*...............................................................................................................................................................*/
data t;
set newa;
f=ceil(_n_/6);/*引入新变量f作为分组变量*/
run;
proc transpose data=t out=new(drop=_name_ f) prefix=text;
var text;
by f;/*由于数据集t中f已经按序排列,故不必再用sort过程*/
label text1='名称(1)' text2='人口' text3='面积' text4='年降水量' text5='总降水量' text6='人均降水';
run;
/*...............................................................................................................................................................*/
「经管之家」APP:经管人学习、答疑、交友,就上经管之家!
免流量费下载资料----在经管之家app可以下载论坛上的所有资源,并且不额外收取下载高峰期的论坛币。
涵盖所有经管领域的优秀内容----覆盖经济、管理、金融投资、计量统计、数据分析、国贸、财会等专业的学习宝库,各类资料应有尽有。
来自五湖四海的经管达人----已经有上千万的经管人来到这里,你可以找到任何学科方向、有共同话题的朋友。
经管之家(原人大经济论坛),跨越高校的围墙,带你走进经管知识的新世界。
扫描下方二维码下载并注册APP
本文关键词:

本文论坛网址:https://bbs.pinggu.org/thread-3219276-1-1.html

人气文章

1.凡人大经济论坛-经管之家转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责;
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。
数据分析师 人大经济论坛 大学 专业 手机版
联系客服
值班时间:工作日(9:00--18:00)