请选择 进入手机版 | 继续访问电脑版
楼主: cashes93
3803 7

[学习分享] SAS爬虫的简单应用-爬取帖子下的邮箱,给他们发一封邮件... [推广有奖]

  • 1关注
  • 3粉丝

本科生

73%

还不是VIP/贵宾

-

威望
0
论坛币
6 个
通用积分
0.4502
学术水平
3 点
热心指数
6 点
信用等级
3 点
经验
1651 点
帖子
30
精华
0
在线时间
191 小时
注册时间
2016-3-19
最后登录
2024-2-24

cashes93 发表于 2018-2-23 19:53:21 |显示全部楼层 |坛友微信交流群
相似文件 换一批

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

前一段时间,看到了某些帖子下,有好多邮箱,然后我就想啊,如果我能给这些邮箱发一封邮件邀请关注我公众号,我的关注是不是会蹭蹭的往上涨...那么问题来了,如何可以批量get到网页上的邮箱呢?于是关于“SAS爬虫”这篇文章诞生了...(我知道的仅仅是一点皮毛,但也不妨我用SAS获取了一堆邮箱....)其实不太知道这算不算爬虫,姑且叫爬...


原理

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


  1. filename temp url "https://bbs.pinggu.org/thread-6046909-1-1.html";
  2. data a;
  3. infile temp;
  4. input fname $char2000.;
  5. run;
复制代码


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

微信图片_20180223195042.jpg


就上面的那个样子,然后就需要在这样杂乱无章的字符串中准确的提取邮箱,首先想到的是邮箱的标志是啥(

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

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

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

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

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

  1. %macro gturl(id=,n=);
  2. data ds_url;
  3. length urlpath $200.;
  4. do i=1 to &n.;
  5. urlpath=strip('"https://bbs.pinggu.org/thread-&id.-')||strip(i)||strip('-1.html"');
  6. call execute(strip("filename temp")||strip(i)||" url "||strip(urlpath)||';');
  7. call execute(strip("data ds_")||strip(i)||strip(";infile temp")||strip(i)||";input fname $char2000.;run;");
  8. output;
  9. end;
  10. run;
  11. data final;
  12. set %do i=1 %to &n.;%sysfunc(compress(ds_&i.)) %end;;
  13. run;
  14. %mend;
  15. %gturl(id=6046909,n=54);
复制代码

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

  1. data final;
  2. set final;
  3. len=length(fname);
  4. _lst=find(fname,'.com');
  5. if _lst=0 then delete;
  6. _em1=substr(fname,1,_lst)||strip("com");
  7. POSITION1 = PRXMATCH('/([A-Za-z0-9]|[-_.])+@([A-Za-z0-9]|[-_.])+(.com)/',_em1);  
  8. final=substr(_em1,POSITION1);
  9. keep  final;
  10. run;
复制代码


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


拼凑


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


  1. %macro gt_em_ds(lib=,dsn=,id=,st=1,en=,desc=);
  2. options nofmterr compress=yes missing='';
  3. data ds_url;
  4. length urlpath $200.;
  5. do i=&st. to &en.;
  6. urlpath=strip('"https://bbs.pinggu.org/thread-&id.-')||strip(i)||strip('-1.html"');
  7. call execute(strip("filename temp")||strip(i)||" url "||strip(urlpath)||';');
  8. call execute(strip("data ds_")||strip(i)||strip(";infile temp")||strip(i)||";input fname $char2000.;run;");
  9. output;
  10. end;
  11. run;
  12. data final;
  13. set %do i=&st. %to &en.;%sysfunc(compress(ds_&i.)) %end;;
  14. if find(fname,'@')>0;
  15. len=length(fname);
  16. _lst=find(fname,'.com');
  17. if _lst=0 then delete;
  18. _em1=substr(fname,1,_lst)||strip("com");
  19. POSITION1 = PRXMATCH('/([A-Za-z0-9]|[-_.])+@([A-Za-z0-9]|[-_.])+(.com)/',_em1);  
  20. final=substr(_em1,POSITION1);
  21. keep  final;
  22. run;
  23. proc sort data=final out=final_a(keep=final) nodupkey;
  24.    by final;
  25. run;
  26. data &lib..&dsn.(label="&desc.");
  27. set final_a;
  28. where ^missing(final);
  29. run;
  30. proc datasets lib=work  memtype=data nolist;
  31. save final;
  32. quit;
  33. %mend;参数的介绍:/*********************************************************

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

  40. ***********************************************************/
  41. /*https://bbs.pinggu.org/thread-6046909-1-1.htmlhttps://bbs.pinggu.org/thread-6046909-54-1.html*/%gt_em_ds(lib=work,dsn=rtable_1,id=6046909,st=1,en=54,desc=%str(资料));
复制代码

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

2.png


提取的准确率还是特别的高,小编从某论坛的某些帖子下一共提取了900个邮箱左右,从某吧的一些帖子下一共提取了1000多个邮箱,最终去重获得邮箱个1881个...这几天发邮件发现,提取的正确率大概95%+


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝


回帖推荐

勤勤鱼 发表于8楼  查看完整内容

我i收到邮件了,也关注了,没想到SAS还能发邮件
已有 2 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
eijuhz + 1 精彩帖子
lovexialulu + 5 + 2 + 2 + 2 观点有启发

总评分: 论坛币 + 5  学术水平 + 2  热心指数 + 2  信用等级 + 3   查看全部评分

扫描我头像....
cashes93 发表于 2018-2-23 21:08:33 |显示全部楼层 |坛友微信交流群
更多内容欢迎扫描我头像关注公众号

使用道具

cashes93 发表于 2018-2-23 21:16:30 |显示全部楼层 |坛友微信交流群
欢迎扫描我头像 资料.jpg

扫描我头像....

使用道具

流水不朽 发表于 2018-2-24 11:24:02 |显示全部楼层 |坛友微信交流群
学习了!

使用道具

bridge1989 发表于 2018-2-24 16:53:47 |显示全部楼层 |坛友微信交流群
有没有SAS9.4 m4的版本分享?

使用道具

cashes93 发表于 2018-2-24 18:37:27 来自手机 |显示全部楼层 |坛友微信交流群
bridge1989 发表于 2018-2-24 16:53
有没有SAS9.4 m4的版本分享?
没有唉

使用道具

cashes93 发表于 2018-3-5 21:51:05 |显示全部楼层 |坛友微信交流群

  1. 第一步:option选项的配置options emailsys=smtp;
  2. options emailauthprotocol=PLAIN;
  3. options emailhost="smtp.sina.com";/*SMTP,中间填写对应厂商*/
  4. options emailport=25;/*端口*/
  5. options emailackwait=30;
  6. options emailid="xiaocgn@sina.com";/*发件箱*/
  7. options emailpw="邮箱的密码";
  8. 第二步:filename设置邮件主题、收件人等等
  9. filename temp email to = ( "xiaocgn@sohu.com" ) cc = ("cashes@126.com" )
  10. subject="填写邮件主题"  type="text/html"    attach=("D:\日常练习\sas_gteml\new\doc\二维码.jpg");
  11. 第三步:制作邮件中资料列表的数据集....(连接都是真实可靠的资料...)data temp1;
  12. length name url $200.;
  13. input name $ ;
  14. input url $ ;
  15. cards;
  16. SAS各版本安装包及下载资源
  17. http://pan.baidu.com/s/1kV5mU6F
  18. SAS安装教程
  19. http://mp.weixin.qq.com/s/_8SkZfL_mDaWfJMsSRBP5Q
  20. SAS最新SID及更新方法
  21. http://mp.weixin.qq.com/s/582kFr9x9GtTpUjtjqkwpg
  22. SAS基础相关书籍
  23. https://pan.baidu.com/s/1eUaWTBs
  24. SAS统计类书籍及视频及考证资料题库
  25. https://pan.baidu.com/s/1raduvKw
  26. ;
  27. run;
  28. 第四步:既然要用到Ods输出,为了字体样式好看一点,就稍微用proc template写一下邮件的样式...也就想改变一下边框,所以随便找了一个系统自带style,修改了一下边框...proc template;
  29. define style style_tb1;
  30. parent = styles.rtf;
  31. replace table from output /
  32. frame = void
  33. rules = all
  34. cellspacing = 0pt
  35. cellpadding = 0pt;
  36. end;
  37. run;
  38. 第五步:ods text与proc report书写正文、制作样式....(注意:下面的第一句body=temp,这里temp是filename哪儿定义的,所以执行这部分就是在发邮件)ods html body=temp  style =style_tb1;
  39. title ;
  40. ods html text = "Hi,您好!";
  41. ods html text = "首先请允许我做一个简单的自我介绍,我是微信公众号:SAS程序分享号号号(公众号的微信号:xiaocgn)的小编,
  42. 同时值此新春佳节之际,我在这里给您拜年了!";
  43. ods html text = "诚邀各位前辈关注小编的公众号,为了推广,小编已经无所不用其极了,如有打扰,真诚的在此给您道歉~
  44. 同时,作为一个SAS编程的晚辈,也欢迎各位前辈关注、指点以及交流...";
  45. ods html text = "在这里,我为您准备了很多迟到的SAS资源....";
  46. proc report data=temp1 nowd headline headskip
  47. style(report)={just=left asis=on }
  48. style(header)={just=left asis=on }
  49. style (column) = {background =   #E0FFFF CELLHEIGHT = 2.5% font_face = "Times New Roman" font_size = 7pt just=left};
  50. columns ("资料列表" name url) ;
  51. define name /display ' ' ;
  52. define url / display ' ' ;
  53. run;
  54. ods html text = "Br";
  55. ods html text = "xiaocgn";
  56. ods _all_ close;
  57. 单个群发
  58. 用程序来发邮件,是为了实现一个群发功能,上面的代码只是发一个人,虽然说可以filename 中的to=(“收件邮箱1" “收件邮箱2” “收件邮箱3”...),但是邮箱对单封邮件最多发送的人都是有限制的,而且同一封邮件如果多个收件人的话,那么很容易造成进入别人垃圾箱...所以在这里就并没有用单封多个收件的人的手段,而且一封邮件一个人收件人...那么也是仅仅写一个循环就可以的...
  59. %macro sas_send(mail=);
  60. filename temp email to = (" &mail.")  subject="....."  type="text/html"    attach=("D:\日常练习\sas_gteml\new\doc\二维码.jpg");
  61. ods html body=temp  style =style_tb1;
  62. title ;
  63. ods html text = "Hi,您好!";
  64. ods html text = "首先请允许我做一个简单的自我介绍,我是微信公众号:SAS程序分享号号号(公众号的微信号:xiaocgn)的小编,同时值此新春佳节之际,我在这里给您拜年了!";
  65. ods html text = "诚邀各位前辈关注小编的公众号,为了推广,小编已经无所不用其极了,如有打扰,真诚的在此给您道歉~
  66. 同时,作为一个SAS编程的晚辈,也欢迎各位前辈关注、指点以及交流...";
  67. ods html text = "在这里,我为您准备了很多迟到的SAS资源....";
  68. proc report data=temp1 nowd headline headskip
  69. style(report)={just=left asis=on }
  70. style(header)={just=left asis=on }
  71. style (column) = {background =   #E0FFFF CELLHEIGHT = 2.5% font_face = "Times New Roman" font_size = 7pt just=left};
  72. ;
  73. columns ("资料列表" name url) ;
  74. define name /display ' ' ;
  75. define url / display ' ' ;
  76. run;
  77. ods html text = "Br";
  78. ods html text = "xiaocgn";
  79. ods _all_ close;
  80. %mend;

  81. data _null_;
  82. set eml_ds;
  83. call execute('%sas_send(mail='||strip(final)||strip(')'));
  84. run;
  85. 前面的配置就不在这里放到Macro中包裹起来(也可以包裹起来), 然后通过call execute来实现循环执行宏的操作,set eml_ds;是包含邮箱的数据,final是一个变量(下面的每一条观测是一个邮箱)...这样就可以实现群发功能了,如果有更高的需求,比如说弄多个发件箱,实现自动交替发件,都可以基于本文代码进行一些简单的修改就可以实现了....
复制代码

微信图片_20180305215031.jpg




扫描我头像....

使用道具

勤勤鱼 发表于 2018-3-13 16:02:14 |显示全部楼层 |坛友微信交流群
我i收到邮件了,也关注了,没想到SAS还能发邮件

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-3-28 16:37