(6)詳解 stata 爬蟲抓取網頁上的數據 part 2

接上篇: ?詳解stata爬蟲抓取網頁上的數據 part 1

本文do-file及相關文件 鏈接:https://pan.baidu.com/s/1smVkcUh 密碼:40uq

若鏈接失效,請私信,看到會復,謝謝。

下面開始抓取1000個網頁的源代碼,分別為temp1.txt—temp1000.txt保存在 e 盤 2 文件夾中,并再次使用 “合并.bat” 將1000個 txt 合并為一個文件 all.txt,先把命令放在這,下面逐一解釋:

注意:第一行的 local 命令必須與下面兩次循環一起 run,否則提示錯誤,原因下面解釋。

抓取1000個網頁源代碼并合并

使用 local 命令生成一個臨時變量 N = _N(注:在stata中 _n 與 _N 都是默認變量,有其固定含義,_N表示的是obsevations的個數,這里當然就等于 1000,_n則表示從1到1000,若要理解這兩個,可以使用 gen N = _N,與 gen n = _n,然后browse查看 N 與 n 有何區別),但是 local 命令生成的變量 N 不會顯示在變量窗口中,而是暫時存儲在stata的內存中,需要的時候可以進行調用。下面舉一個小小的例子演示 local 的作用(需要注意的是 local命令行與下一行調用local 生成的變量的命令必須一起運行,否則會提示出錯,因為local 宏命令產生的變量只是臨時的,一旦遇到end of do-file【觀察stata主界面,每運行完一條命令都會提示end of do-file】便會將生成的臨時變量刪除,無法再次調用,詳見下下圖中官方給出的英文解釋,已用藍色部分標出,尤其是最后一句):

local 命令演示,并對比 _n 與 _N 區別

關于 marco 宏的進一步解釋,有興趣的可以參見官方給的 help 文件中相關說明,如下:

marco 宏的官方解釋

理解了local 之后再去看接下來的兩次循環就容易得多,第二次循環是將 url 變量與 purl 變量(purl變量是之前的1000個鏈接)一一對應并儲存起來,但不顯示在變量窗口,而第三次循環則是調用 url 變量儲存的1000個網址,并將這1000個網頁的源代碼 copy 下來,儲存在e盤的 2 文件夾中,命名為temp1.txt—temp1000.txt,此一過程得看網速,大約耗時30分鐘左右,像下圖這樣就看著數字變,最后到 temp1000.txt 就是完成了。之所以會提示not found是因為我們在抓取命令后附加了 replace 的 option,也就是告訴 stata 如果發現 e 盤 2 文件夾中有同名文件就將其替換掉,但是stata發現沒有同名文件,于是它就提示 not found 并按要求生成新文件,若stata發現有同名文件,則不會有此提示,而是直接將其替換。

抓取1000個網頁源代碼過程

漫長的等待之后,最后再用我們之前在 part 1中用過的 bat 批處理命令調用dos將1000個 txt 合并為 all.txt(這次是在文件夾 2 中進行處理,與之前 all.txt 是不一樣的哦)。至此就得到了1000個網頁的源代碼,這1000個網頁源代碼就很重要了,因為我們需要的GDP信息全部都包含在里面了。同理,我們用 infix 命令將其讀進 stata 進行處理,命令見文初的圖,因文本輛較大,讀文本之前最好先clear一下,不然有可能會導致stata崩潰,寫了半天的dofile要是沒保存就不好了(具體原因不知道,推測可能是內存不夠用?.?)。



文本讀進去之后為一個變量 v,然后開始過濾,提純工作,這也是最為繁雜的工作了,因為要從共 735748 行代碼中提取出僅兩個信息,一個是 “某某地區幾幾年”,一個是 “GDP”。根據我們需要的信息,我們去尋找包含這兩個信息的關鍵行,觀察其所在的行都有什么共同的特點,通過觀察我們看到,地區名字所在的行都含有 <title> 這樣的字符,而GDP或者是生產總值所在的行都含有 “生產總值” 這樣的字符(如下圖),故我們只需要將包含有這兩個字符的代碼行保留即可

觀察代碼行特征,找規律

第1步:設置兩個指標變量(以dummy variable虛擬變量的形式出現)a 和 b。對 a 變量來說,如果 v 變量(即全部代碼行所在的變量)中含有 <title> 則讓 stata 返回值1,表示 “是含有”,否則返回0,表示 “不含”。同理以 “生產總值” 為指標生成 b 變量。然后,keep if a==1 | b==1表示將含有 <title> 或者含有 “生產總值” 的行 keep 下來。這一步就將代碼行數迅速過濾,縮減至至僅 4570 行。

生成兩個指標變量

第2步—第N步:全部是切割,保留,切割,保留,切割,保留.....因為處理方式可以仁者見仁智者見智,我的不一定就是最好的,但原理是一樣的。因此僅對使用的部分命令與函數進行解釋,見do-file中相關注釋【strpos、duplicates drop】。

切割與replace
繼續切割、替換、保留
最終得到的數據

可以看到,有些數據前面還有一些亂七八糟的字符,這是因為每份公報的書寫格式不統一造成的,需要繼續進行處理,方法同上面一樣,split,replace and keep,這里不做繼續演示,感興趣的可以繼續。

隨機找幾個數據去網站上查詢核對,看對應的數據是否準確。如我這里從上圖的左右分別隨便挑出合肥市2015年 與 九江市2013年去驗證,查詢結果如下,經核對,準確無誤:

查詢驗證結果

最后,對于空缺的部分,可以單獨去網站尋找數據將其補齊。此外,本次應得1000行數據,但是最終卻得到了 1015 行數據,究其原因可能還是公報的格式不完全統一造成的,而且有的數據是省的GDP(較少),有的是市的GDP,因此有重復部分。這類錯誤還得根據研究者需求自行處理。

好了,至此本篇詳解就完結了,撒花!(0.0)

最后一個tips:stata 12、13 白色主界面默認是不支持中文的,顯示中文為亂碼,可以在主界面任意位置右鍵—>Preferences,然后將 color scheme 的模式由 Standard 改成 Classic 經典模式即可正常顯示中文。

Standard —>Classic
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容