五月天婷亚洲天久久综合网,婷婷丁香五月激情亚洲综合,久久男人精品女人,麻豆91在线播放

  • <center id="8gusu"></center><rt id="8gusu"></rt>
    <menu id="8gusu"><small id="8gusu"></small></menu>
  • <dd id="8gusu"><s id="8gusu"></s></dd>
    樓主: 1989pengwei
    17444 20

    [原創(chuàng)博文] SAS網(wǎng)絡(luò)爬蟲抓取網(wǎng)頁數(shù)據(jù) [推廣有獎(jiǎng)]

    • 0關(guān)注
    • 1粉絲

    高中生

    55%

    還不是VIP/貴賓

    -

    威望
    0 級(jí)
    論壇幣
    5 個(gè)
    通用積分
    1.0018
    學(xué)術(shù)水平
    4 點(diǎn)
    熱心指數(shù)
    4 點(diǎn)
    信用等級(jí)
    4 點(diǎn)
    經(jīng)驗(yàn)
    51 點(diǎn)
    帖子
    8
    精華
    0
    在線時(shí)間
    56 小時(shí)
    注冊時(shí)間
    2013-12-8
    最后登錄
    2015-8-19

    相似文件 換一批

    +2 論壇幣
    k人 參與回答

    經(jīng)管之家送您一份

    應(yīng)屆畢業(yè)生專屬福利!

    求職就業(yè)群
    趙安豆老師微信:zhaoandou666

    經(jīng)管之家聯(lián)合CDA

    送您一個(gè)全額獎(jiǎng)學(xué)金名額~ !

    感謝您參與論壇問題回答

    經(jīng)管之家送您兩個(gè)論壇幣!

    +2 論壇幣
    本人剛剛完成SAS正則表達(dá)式的學(xué)習(xí),初學(xué)SAS網(wǎng)絡(luò)爬蟲,看到過一些前輩大牛們爬蟲程序,感覺很有趣,F(xiàn)在結(jié)合實(shí)際例子,淺談一下怎么做一些最基本的網(wǎng)頁數(shù)據(jù)抓取。第一次發(fā)帖,不妥之處,還望各位大牛們指正。
    本帖研究網(wǎng)頁為'http://health.gmw.cn/2012-10/03/content_5266132.htm',意在提取該網(wǎng)頁中全國各省降雨量信息,部分截圖如下: L8_]9SD~K)PD$H[A`0MI_14.png
    大致步驟就是用filename  fileref  url '網(wǎng)頁地址'獲取網(wǎng)頁代碼信息(包含有待提取數(shù)據(jù)),再用infile fileref將字符代碼讀入變量中,接著根據(jù)待提取數(shù)據(jù)的特點(diǎn)對(duì)寫入的觀測進(jìn)行“數(shù)據(jù)清洗”,最后獲得所需數(shù)據(jù)觀測。
    先針對(duì)該過程中可能出現(xiàn)的問題,做一下簡單說明:
    1.本人所用SAS軟件為多國語言9.2版,剛開始運(yùn)行含有filename  fileref  url '網(wǎng)頁地址'及infile fileref時(shí),很不友好的顯示錯(cuò)誤:無法連接主機(jī)。這一問題困惑我好久。最后看到有前輩發(fā)帖,從一個(gè)網(wǎng)站http://ftp.sas.com/techsup/download/hotfix/f9_sbcs_prod_list.html#034098下載相關(guān)hot fix(F9BA26)以后,得以解決。
    2.若未在infile語句中加encoding='utf-8',得出的觀測亂碼。
    3.正則表達(dá)式并不是必須的,但是用起來簡潔明了,與一些字符函數(shù)配合使用,絕對(duì)可以達(dá)到你想要的提取目的。
    4.大家進(jìn)入網(wǎng)頁后,點(diǎn)擊右鍵,查看源代碼(有些是源文件),這個(gè)源代碼就是我們需要寫入數(shù)據(jù)集的文件。先用
    filename fileref url 'http://health.gmw.cn/2012-10/03/content_5266132.htm';
    5.怎樣將網(wǎng)頁源文件代碼寫入數(shù)據(jù)集?用infile+input。不過根據(jù)寫入方式不同,后續(xù)清洗數(shù)據(jù)的程序自然也不一樣了。由于源代碼中每一個(gè)input line的形式為<...>!!!<...>或者<...><...>(大家可以觀察網(wǎng)頁的源代碼),而我們需要的數(shù)據(jù)就包含在!!!里面。而由于一個(gè)網(wǎng)頁包含的信息太多,也有可能找到的!!!不包含所需數(shù)據(jù)。為了“清洗”數(shù)據(jù)方便,在這里我采用了一個(gè)比較笨的方法,通過觀察源代碼中待提取數(shù)據(jù)的大致范圍,如第一個(gè)待提取字符串"黑龍江"出現(xiàn)在第184個(gè)input line,而最后一個(gè)"120”(澳門人均降水) 則出現(xiàn)在第623個(gè)input line,其他input line我們不需要,可以考慮在infile語句中加入firstobs=184 obs=623。
    注意:由于網(wǎng)頁可能發(fā)生小的變化,firstobs=與obs= 的值可能不準(zhǔn)確,從而影響結(jié)果。建議查看源代碼確定相應(yīng)值。
    這里介紹兩種不同的寫入方式。
    a.以'>'為分隔符,寫入后每個(gè)觀測就形如<...或者!!!<...,而后者是我們所需保留的觀測。根據(jù)!!!<...寫出對(duì)應(yīng)正則表達(dá)式進(jìn)行清洗。考慮用正則表達(dá)式'/.+/'。
    此種方式編程如下:
    /*.............................................................................................................................*/
    filename  fileref  url 'http://health.gmw.cn/2012-10/03/content_5266132.htm';
    data a;
    infile fileref  lrecl=10000  dlm='>' encoding='utf-8' firstobs=184 obs=623;
    length text $1000;
    input text $ @@;
    run;

    data newa;
    if  _n_=1 then prx=prxparse('/.+</');
    retain  prx;/*必須要用retain 否則下次循環(huán)時(shí)prx置為空值而產(chǎn)生錯(cuò)誤*/
    set a;
    if  prxmatch(prx,text);/*篩選那些不符合正則表達(dá)式形式的觀測值*/
    text=substr(text,1,find(text,'<')-1);/*從合適觀測中提取所需數(shù)據(jù)的字符形式*/
    drop prx;
    run;
    /*.................................................................................................................................*/

    b.源代碼文件中每一個(gè)input line整體作為一個(gè)值,這樣就保留了原來形式<...>!!!<...>或者<...><...>,根據(jù)>!!!<寫出對(duì)應(yīng)表達(dá)式進(jìn)行清洗?紤]用正則表達(dá)式'/>.{1,8}</'(數(shù)據(jù)位數(shù)最多為8)。
    此種方式編程如下:
    /*................................................................................................................................*/
    filename  fileref  url  'http://health.gmw.cn/2012-10/03/content_5266132.htm';
    data b;
    infile fileref  lrecl=10000  encoding='utf-8'  firstobs=184  obs=623  length=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;
    /*...............................................................................................................................*/
    以上兩種方式主要看各位的習(xí)慣吧。得到了篩選后的數(shù)據(jù)集work.newa(work.newb),數(shù)據(jù)集只含有1個(gè)變量text。而網(wǎng)頁中則有6個(gè)變量。這是就需要對(duì)數(shù)據(jù)集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;
    /*.............................................................................................................................................................*/
    注意:為避免重復(fù),上述6個(gè)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;/*由于數(shù)據(jù)集t中f已經(jīng)按序排列,故不必再用sort過程*/
    label text1='名稱(1)' text2='人口' text3='面積' text4='年降水量' text5='總降水量' text6='人均降水';
    run;
    /*...............................................................................................................................................................*/










    二維碼

    掃碼加我 拉你入群

    請(qǐng)注明:姓名-公司-職位

    以便審核進(jìn)群資格,未注明則拒絕

    關(guān)鍵詞:抓取網(wǎng)頁數(shù)據(jù) 網(wǎng)絡(luò)爬蟲 filename download Content 降雨量 表達(dá)式 網(wǎng)絡(luò) 網(wǎng)頁 程序

    已有 2 人評(píng)分論壇幣 學(xué)術(shù)水平 熱心指數(shù) 信用等級(jí) 收起 理由
    玩于股漲之上 + 1 + 1 + 1 精彩帖子
    Tigflanker + 5 + 3 + 3 + 3 很感興趣,感謝分享

    總評(píng)分: 論壇幣 + 5  學(xué)術(shù)水平 + 4  熱心指數(shù) + 4  信用等級(jí) + 4   查看全部評(píng)分

    本帖被以下文庫推薦

    • · MyLib|主題: 411, 訂閱: 41
    沙發(fā)
    sqy 發(fā)表于 2014-9-23 08:35:19 |只看作者 |壇友微信交流群
    牛。。。。。。。!
    藤椅
    Jojo很幸福 發(fā)表于 2014-9-23 09:26:50 |只看作者 |壇友微信交流群
    支持哦       
                  
                              
                      
                       
                                     
            
    板凳
    小鱷魚a 發(fā)表于 2014-9-26 14:51:47 |只看作者 |壇友微信交流群
    直接復(fù)制粘貼上去了 ,  不行呢
    報(bào)紙
    小鱷魚a 發(fā)表于 2014-9-26 14:52:23 |只看作者 |壇友微信交流群
    1. /*.............................................................................................................................*/
    2. filename  fileref  url 'http://health.gmw.cn/2012-10/03/content_5266132.htm';
    3. data a;
    4. infile fileref  lrecl=10000  dlm='>' encoding='utf-8' firstobs=174 obs=613;
    5. input text @@;
    6. run;

    7. data newa;
    8. if  _n_=1 then prx=prxparse('/.+</');
    9. retain  prx;/*必須要用retain 否則下次循環(huán)時(shí)prx置為空值而產(chǎn)生錯(cuò)誤*/
    10. set a;
    11. if  prxmatch(prx,text);/*篩選那些不符合正則表達(dá)式形式的觀測值*/
    12. text=substr(text,1,find(text,'<')-1);/*從合適觀測中提取所需數(shù)據(jù)的字符形式*/
    13. drop prx;
    14. run;  
    15. /*.................................................................................................................................*/

    16. b.源代碼文件中每一個(gè)input line整體作為一個(gè)值,這樣就保留了原來形式<...>!!!<...>或者<...><...>,根據(jù)>!!!<寫出對(duì)應(yīng)表達(dá)式進(jìn)行清洗?紤]用正則表達(dá)式'/>.{1,8}</'(數(shù)據(jù)位數(shù)最多為8)。
    17. 此種方式編程如下:
    18. /*................................................................................................................................*/
    19. filename  fileref  url  'http://health.gmw.cn/2012-10/03/content_5266132.htm';
    20. data b;
    21. infile fileref  lrecl=10000  encoding='utf-8'  firstobs=174  obs=613  length=len;
    22. input textvarying1000. len;
    23. run;

    24. data newb;
    25. if _n_=1 then prx=prxparse('/>.{1,8}</');
    26. retain prx;
    27. set b;
    28. call prxsubstr(prx,text,position,length);
    29. if position;
    30. text=substrn(text,position+1,length-2);
    31. keep text;
    32. run;
    33. /*...............................................................................................................................*/
    34. 以上兩種方式主要看各位的習(xí)慣吧。得到了篩選后的數(shù)據(jù)集work.newa(work.newb),數(shù)據(jù)集只含有1個(gè)變量text。而網(wǎng)頁中則有6個(gè)變量。這是就需要對(duì)數(shù)據(jù)集work.newa做寫什么了。
    35. 法1.set操作:
    36. /*.................................................................................................................................................................*/
    37. data new;
    38. set newa(rename=(text=text1) firstobs=1);
    39. set newa(rename=(text=text2) firstobs=2);
    40. set newa(rename=(text=text3) firstobs=3);
    41. set newa(rename=(text=text4) firstobs=4);
    42. set newa(rename=(text=text5) firstobs=5);
    43. set newa(rename=(text=text6) firstobs=6);
    44. if not anydigit(text1);
    45. label text1='名稱(1)'  text2='人口'  text3='面積'  text4='年降水量'  text5='總降水量' text6='人均降水';
    46. run;
    47. /*.............................................................................................................................................................*/
    48. 注意:為避免重復(fù),上述6個(gè)set語句完全可以用宏語句來代替,程序如下:
    49. %macro t(n);
    50. %do i=1 %to &n;
    51. %str(set n(rename=(text=text&i) firstobs=&i);)
    52. %end;
    53. %mend;
    54. data new;
    55. %t(6)
    56. if not anydigit(text1);
    57. label text1='名稱(1)'  text2='人口'  text3='面積'  text4='年降水量'  text5='總降水量' text6='人均降水';
    58. run;

    59. 法2.分組transpose:
    60. /*...............................................................................................................................................................*/
    61. data t;
    62. set newa;
    63. f=ceil(_n_/6);/*引入新變量f作為分組變量*/
    64. run;
    65. proc transpose data=t out=new(drop=_name_ f) prefix=text;
    66. var text;
    67. by f;/*由于數(shù)據(jù)集t中f已經(jīng)按序排列,故不必再用sort過程*/
    68. label text1='名稱(1)' text2='人口' text3='面積' text4='年降水量' text5='總降水量' text6='人均降水';
    69. run;
    70. /*...............................................................................................................................................................*/
    復(fù)制代碼


    地板
    小鱷魚a 發(fā)表于 2014-9-26 14:53:06 |只看作者 |壇友微信交流群
    就是復(fù)制的上面的,不知道哪個(gè)地方有問題
    7
    1989pengwei 發(fā)表于 2014-9-27 12:54:27 |只看作者 |壇友微信交流群
    小鱷魚a 發(fā)表于 2014-9-26 14:53
    就是復(fù)制的上面的,不知道哪個(gè)地方有問題
    SAS 報(bào)錯(cuò)了么?
    8
    1989pengwei 發(fā)表于 2014-9-27 12:59:28 |只看作者 |壇友微信交流群
    1989pengwei 發(fā)表于 2014-9-27 12:54
    SAS 報(bào)錯(cuò)了么?
    肯定不能全部復(fù)制的,從a或b代碼中任選一種,再從法一或法二中任選一種即可(你試一下a+法2)
    9
    just31415 發(fā)表于 2014-9-27 23:29:15 |只看作者 |壇友微信交流群
    感謝分享,學(xué)習(xí)了~~
    10
    jzx江湖浪子 發(fā)表于 2014-9-28 17:44:04 |只看作者 |壇友微信交流群
    很好不錯(cuò),我前段時(shí)間也寫了一個(gè),不過網(wǎng)頁都是比較簡單的get提交那類,樓主能否也寫個(gè)post提交的,有空一起交流學(xué)習(xí)下。
    您需要登錄后才可以回帖 登錄 | 我要注冊

    本版微信群
    加好友,備注cda
    拉您進(jìn)交流群

    京ICP備16021002-2號(hào) 京B2-20170662號(hào) 京公網(wǎng)安備 11010802022788號(hào) 論壇法律顧問:王進(jìn)律師 知識(shí)產(chǎn)權(quán)保護(hù)聲明   免責(zé)及隱私聲明

    GMT+8, 2024-12-23 17:33