前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SAS-爬取帖子下的邮箱,给他们发一封邮件...

SAS-爬取帖子下的邮箱,给他们发一封邮件...

作者头像
Setup
发布2019-10-21 17:32:10
7080
发布2019-10-21 17:32:10
举报
文章被收录于专栏:SAS程序分享号号号
前一段时间,看到了某些帖子下,有好多邮箱,然后我就想啊,如果我能给这些邮箱发一封邮件邀请关注我公众号,我的关注是不是会蹭蹭的往上涨...那么问题来了,如何可以批量get到网页上的邮箱呢?于是关于“SAS爬虫”这篇文章诞生了...(我知道的仅仅是一点皮毛,但也不妨我用SAS获取了一堆邮箱....)其实不太知道这算不算爬虫,姑且叫爬...

原理

SAS中获取网页上信息的原理其实很简单,就是将网页上的html代码给导入进数据集中,然后利用一定规律来获取自己想要的提取的信息...(目前个人浅显的理解),那么如何来将网页的代码直接导入的数据集中呢,见如下代码...

代码语言:javascript
复制
filename temp url "http://bbs.pinggu.org/thread-6046909-1-1.html";
data a;
infile temp;
input fname $char2000.;
run;

这样就能将网页的代码给鼓捣到数据集中了....还是看一下数据是啥样的....

就上面的那个样子,然后就需要在这样杂乱无章的字符串中准确的提取邮箱,首先想到的是邮箱的标志是啥(XXXXX@XXXX.com)是这样的形式...那么该如何提取这样的字符串呢,最合适的方式就是正则表达式,小编用的不溜,就先不细说了...

写一个循环

知道最基本的原理后,那么就得应用到真实场景来来,最开始的是提取一个页面,显而易见,我们要提取的帖子下有大量的回复,这个时候就会有多个页面...那么页面也页面之间是否有规律呢,就要找到这个规律,利用循环来实现批量的操作...当然像这种规律都是一眼就能发现的....

先来看看某论坛页面的规律:(倒数第三个数字代表帖子的ID,倒数第二个数字代表页面)

http://bbs.pinggu.org/thread-6046909-1-1.html

这个的规律在:页面每加一页,倒数第二个1就加1;

在来看看某贴吧的规律:(倒数第二个数字代表帖子的ID,倒数第一个数字代表页面)

http://tieba.baidu.com/p/4910914860?pn=1

规律就是:每增加一页,倒数第一个数字就加1;

知道了规律那么一切就都好操作了,小编技术还比较low,无法自动获取一个帖子到底有多少页,所以每个帖子的ID,或者页码都是小编人工去设置的..当然页码可以设置稍大一点也是无所谓的...那么就来看看小编这个循环是怎么写的...

代码语言:javascript
复制
%macro gturl(id=,n=);
data ds_url;
length urlpath $200.;
do i=1 to &n.;
urlpath=strip('"http://bbs.pinggu.org/thread-&id.-')||strip(i)||strip('-1.html"');
call execute(strip("filename temp")||strip(i)||" url "||strip(urlpath)||';');
call execute(strip("data ds_")||strip(i)||strip(";infile temp")||strip(i)||";input fname $char2000.;run;");
output;
end;
run;
data final;
  set %do i=1 %to &n.;%sysfunc(compress(ds_&i.)) %end;;
run;
%mend;
%gturl(id=6046909,n=54);

如上,在编写过程的前期的一段小程序,将指定帖子下面的54个页面的全部捣腾到数据集里面去,最后合并成一个叫final的数据集...直到此处,我们第一步就完成了,那么就要开始第二步,利用正则将邮箱提取出来,前面已经知道邮箱的规律(XXX@XXX.com) 在这里,XXX 可以是[0-9]中的任意数字,[a-zA-Z]中的任意字符,而且还可以是包含[-_.]特殊字符的字符串,长度也不固定,这样,我们就可以基本确定了邮箱的规律,那么就需要用语言告诉程序,我们的规律是什么...接下来就看看程序是写的...(我正则用的不好,如有错误还请指正...)

代码语言:javascript
复制
data final;
set final;
len=length(fname);
_lst=find(fname,'.com');
if _lst=0 then delete;
_em1=substr(fname,1,_lst)||strip("com");
POSITION1 = PRXMATCH('/([A-Za-z0-9]|[-_.])+@([A-Za-z0-9]|[-_.])+(.com)/',_em1);  
final=substr(_em1,POSITION1);
keep  final;
run;

代码较长的那一行,就是正则在此处的应用,找出符号这样规则的其实字符,然后利用substr开始截取...

拼凑

Macro其实就是将多个零件进行组装实现某个功能,那么知道了前面的原理和各个知识点,就可以将其组装到一起,在后面的使用过程中不断优化从而形成一个比较好的宏...那么就来看看此处的组装...

代码语言:javascript
复制
%macro gt_em_ds(lib=,dsn=,id=,st=1,en=,desc=);
options nofmterr compress=yes missing='';
data ds_url;
length urlpath $200.;
do i=&st. to &en.;
urlpath=strip('"http://bbs.pinggu.org/thread-&id.-')||strip(i)||strip('-1.html"');
call execute(strip("filename temp")||strip(i)||" url "||strip(urlpath)||';');
call execute(strip("data ds_")||strip(i)||strip(";infile temp")||strip(i)||";input fname $char2000.;run;");
output;
end;
run;
data final;
  set %do i=&st. %to &en.;%sysfunc(compress(ds_&i.)) %end;;
  if find(fname,'@')>0;
  len=length(fname);
  _lst=find(fname,'.com');
  if _lst=0 then delete;
  _em1=substr(fname,1,_lst)||strip("com");
  POSITION1 = PRXMATCH('/([A-Za-z0-9]|[-_.])+@([A-Za-z0-9]|[-_.])+(.com)/',_em1);  
  final=substr(_em1,POSITION1);
  keep  final;
run;
proc sort data=final out=final_a(keep=final) nodupkey;
    by final;
run;
data &lib..&dsn.(label="&desc.");
  set final_a;
  where ^missing(final);
run;
proc datasets lib=work  memtype=data nolist;
save final;
quit;
%mend;

参数的介绍:

代码语言:javascript
复制
/*********************************************************

LIB :输出的数据集存放的逻辑库名称
DSN :输出数据集名称
ID  :帖子ID
ST  :开始的页面(便于后期再一次获取时重复了前面的获取的页面)
EN  :结束的页面 
DESC :数据集Label 可以加一个描述

***********************************************************/

/*

http://bbs.pinggu.org/thread-6046909-1-1.html

http://bbs.pinggu.org/thread-6046909-54-1.html

*/

%gt_em_ds(lib=work,dsn=rtable_1,id=6046909,st=1,en=54,desc=%str(资料));

那么来看看这个宏执行后提取的效果:

提取的准确率还是特别的高,小编从某论坛的某些帖子下一共提取了900个邮箱左右,从某吧的一些帖子下一共提取了1000多个邮箱,最终去重获得邮箱个1881个...

这几天发邮件发现,提取的正确率大概95%+,当然邮件没有都发送完,遇到一个烦恼的事,那就群发邮件有限制

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

本文分享自 SAS程序分享号号号 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云开发 CloudBase
云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档