查看: 14039| 回复: 21
跳转到指定楼层
上一主题 下一主题
收起左侧

用SAS抓取网页简易版

全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
如果是一些比较简单的规则的网页抓取,可以用SAS,纯属娱乐,SAS入门的话推荐SAS BASE和ADVANCE认证的教材,这两个认证其实没啥用,但教材的内容对于一个专业的SAS Programmer足够了,sas data step, sql, macro,会这些日常处理应该都没问题了。
%macro webScholar;
/*memlib选项是将data放在内存里,而不是放在D盘,可以提高读取速度,最后别忘记把dataset存盘*/
libname mywork "D:\" memlib;

/*建立存取结果的空数据集,抓取google学术搜索出来的标题和应用次数*/
proc sql;.google  и
        create table mywork.results_web (titles char(500), citenumber char(500));
quit;

. .и/*pageno相当于google学术搜索下面的第几页,这里试着抓取前两页,当然可以加*/. ----
/*q=python 后的python可以换成其他的关键词*/. 1point3acres.com
%do pageno = 0 %to 20 %by 10;
        data _null_;
                length url $ 256;
                url = 'http://scholar.google.com/scholar?start=0&q=python&hl=en&as_sdt=0,5';
                url = prxchange("s/start=0/start=&pageno/", 1, url);
                call symput("url", url);
        run;

        /*recfm=n是将input分成长度为256的小块,因为sas字符变量最长3万多,超过的话会被截断,有时网页代码的一行会很长*/
        filename web url "%superq(url)" recfm=n debug;

       /*$varying 这个format/informat很有意思,具体可以参考help*/
        data mywork.web;
                length webtext $ 256;
                infile web length=len;
                input webtext $varying256.len;
                textlength = len;
        run;

        data mywork.extracted;. ----
                length s $ 32767; /*sas能处理的最长字符变量*/
                length r $ 500;
                length cite $500;
                retain s; /*每次data步,将字符累加到s中,用了retain,s不会重置成缺失值*/
                set mywork.web;
                s = cats(s, webtext);

                /*用正则表达式来匹配标题和文献引用次数*/
                /*其他编程语言的话可以找到很多package来做,sas这一点不太方便*/
                position = .;
                do until (position = 0);
                        patternID = prxparse('/<h3(\w|\W)*?<\/h3>(\w|\W)*?>Cite(d by )??\d*<\/a>/i');
                        call prxsubstr(patternID, s, position, length);
                        if position ^= 0 then do;
                                patternID = prxparse('/<h3(\w|\W)*?<\/h3>/i');. From 1point 3acres bbs
                                call prxsubstr(patternID, s, position, length);.--
                                r = substr(s, position, length);

                                /*把标题中的tag之类的奇怪字符去掉*/
                                r = prxchange('s/(<[^>]*?>)|(\[[^\]]*?\])|(&[^;]*?;s?)//', -1, r);. 1point 3 acres
                                s = substrn(s, position + length);
                                . 1point3acres
                                patternID = prxparse('/>Cite(d by )??\d*<\/a>/i');
                                call prxsubstr(patternID, s, position, length);
                                cite = substr(s, position, length);

                                /*把数字提取出来*/. Waral dи,
                                cite = prxchange('s/(\D*)(\d*)(\D*)/$2/',1, cite);
                                s = substrn(s, position + length);
                                output;
                        end;
                end;                .google  и
                if length(s) > 29000 then s = substrn(s, 257);
        run;


       /*将结果存起来,最后的数据中会有两个变量,论文的标题和引用次数*/
       /*因为开头memlib选项,这个dataset并没有存到硬盘中*/
        proc sql;
                insert into mywork.results_web
                select r, cite from mywork.extracted;
        quit;

%end;. check 1point3acres for more.

%mend webScholar;.1point3acres

%webScholar


评分

参与人数 3大米 +140 收起 理由
jacksterling + 20 感谢分享!
anonym + 60
alonever + 60 感谢分享!

查看全部评分


上一篇:Earth Science的PhD有转data scientist的可能吗
下一篇:有data analyst/scientist 相关的qq群么?

本帖被以下淘专辑推荐:

推荐
readman 2014-5-21 23:18:33 | 只看该作者
全局:
EroicaCMCS 发表于 2014-5-21 23:13. 1point 3acres
这么高级。。
换us地址就没法破了er-agent可能还不行,可能会记录网卡

- = 网卡是mac地址, 在七层模型第二层, 估计记录的是ip地址把...
我见过一个分布式爬虫才高级.....
是通过bt协议传播的. bt上不是有种子服务器么? 然后你们先下种子, 然后去得到对方节点的数据完整度,然后share数据.
那爬虫就是让你们过去下载种子数据的时候, 先访问一个页面, 然后你把结果传给另一个服务器. 就相当于一个去中心化的爬虫..完克记录ip什么的...
回复

使用道具 举报

推荐
EroicaCMCS 2014-5-22 00:23:19 | 只看该作者
全局:
readman 发表于 2014-5-21 23:35
mac 地址在本地通过路由的时候, 会用ARP找到你的路由表中mac对应的ip, 然后就是ip之间传播了...
你代理 ...

你在学校是公网ip么,我在学校没有公网ip的,需要NAT。
表示全校满地跑也是禁,相当无语。

代理试过goagent, 也试过自己在校内服务器(squid搭的),还是不行。。。
过一段时间(一两天)就又可以了。。

回复

使用道具 举报

推荐
readman 2014-5-21 23:35:32 | 只看该作者
全局:
EroicaCMCS 发表于 2014-5-21 23:24
上条回复网卡了结果出来结果语序是乱的。。。

我觉得是记录mac地址的。我试过换了很多ip包括用代理一 ...

mac 地址在本地通过路由的时候, 会用ARP找到你的路由表中mac对应的ip, 然后就是ip之间传播了... ..
你代理怎么用的? 我以前不知道算法的时候, 用自己的macbook air 满学校跑换ip. 就可以了
回复

使用道具 举报

🔗
chenhaowei 2014-3-27 00:12:19 | 只看该作者
全局:
不顶顶对不起我的良心
回复

使用道具 举报

🔗
EroicaCMCS 2014-3-27 20:58:27 | 只看该作者
全局:
好奇地问下抓google scholar多少次给封的?哈哈
回复

使用道具 举报

🔗
 楼主| venomtian 2014-3-27 22:08:01 | 只看该作者
全局:
EroicaCMCS 发表于 2014-3-27 20:58
好奇地问下抓google scholar多少次给封的?哈哈
..
差不多100次的话就不给访问了,不知道sleep个几秒钟或者加上一些header会不会好点。。。. 1point 3 acres
回复

使用道具 举报

🔗
EroicaCMCS 2014-3-27 22:47:51 | 只看该作者
全局:
venomtian 发表于 2014-3-27 22:08
差不多100次的话就不给访问了,不知道sleep个几秒钟或者加上一些header会不会好点。。。

我也差不多是这个数,现在都有后遗症了,有时候(隔了很多天)google scholar还会时不时block一下。。。
回复

使用道具 举报

🔗
Adrienne 2014-5-21 16:15:53 | 只看该作者
全局:
牛掰,赞
回复

使用道具 举报

🔗
readman 2014-5-21 22:23:06 | 只看该作者
全局:
EroicaCMCS 发表于 2014-3-27 22:47
我也差不多是这个数,现在都有后遗症了,有时候(隔了很多天)google scholar还会时不时block一下。。。

不知道一样不一样, 但是google的搜索页有特定的抓取方法 - =
回复

使用道具 举报

🔗
EroicaCMCS 2014-5-21 23:06:09 | 只看该作者
全局:
readman 发表于 2014-5-21 22:23
不知道一样不一样, 但是google的搜索页有特定的抓取方法 - =

专门反反爬虫的方法?
回复

使用道具 举报

🔗
readman 2014-5-21 23:08:18 | 只看该作者
全局:
EroicaCMCS 发表于 2014-5-21 23:06
专门反反爬虫的方法?

我不知道现在什么样, 他是个叫什么 冲浪模型的 反爬虫.
有个算法, 比如第一次是1秒间隔, 然后是3秒, 然后是5秒, 就可以一直扫下去..以前google一下就有, 有人专门研究这个....拿来用就可以.
然后记得扫几个换个user-agent..
回复

使用道具 举报

🔗
readman 2014-5-21 23:12:22 | 只看该作者
全局:
EroicaCMCS 发表于 2014-5-21 23:06.google  и
专门反反爬虫的方法?

- = 记错了, 冲浪模型是page rank 的算法..我忘了那个监测bot算法叫什么了..
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表