接上篇: ?詳解stata爬蟲抓取網(wǎng)頁(yè)上的數(shù)據(jù) part 1
本文do-file及相關(guān)文件 鏈接:https://pan.baidu.com/s/1smVkcUh 密碼:40uq
若鏈接失效搀罢,請(qǐng)私信依溯,看到會(huì)復(fù),謝謝。
下面開(kāi)始抓取1000個(gè)網(wǎng)頁(yè)的源代碼荠耽,分別為temp1.txt—temp1000.txt保存在 e 盤 2 文件夾中,并再次使用 “合并.bat” 將1000個(gè) txt 合并為一個(gè)文件 all.txt呛牲,先把命令放在這备绽,下面逐一解釋:
注意:第一行的 local 命令必須與下面兩次循環(huán)一起 run,否則提示錯(cuò)誤占贫,原因下面解釋桃熄。
使用 local 命令生成一個(gè)臨時(shí)變量 N = _N(注:在stata中 _n 與 _N 都是默認(rèn)變量,有其固定含義型奥,_N表示的是obsevations的個(gè)數(shù)疼进,這里當(dāng)然就等于 1000,_n則表示從1到1000秩贰,若要理解這兩個(gè)塌西,可以使用 gen N = _N,與 gen n = _n烫葬,然后browse查看 N 與 n 有何區(qū)別)界弧,但是 local 命令生成的變量 N 不會(huì)顯示在變量窗口中凡蜻,而是暫時(shí)存儲(chǔ)在stata的內(nèi)存中,需要的時(shí)候可以進(jìn)行調(diào)用垢箕。下面舉一個(gè)小小的例子演示 local 的作用(需要注意的是 local命令行與下一行調(diào)用local 生成的變量的命令必須一起運(yùn)行划栓,否則會(huì)提示出錯(cuò),因?yàn)閘ocal 宏命令產(chǎn)生的變量只是臨時(shí)的条获,一旦遇到end of do-file【觀察stata主界面忠荞,每運(yùn)行完一條命令都會(huì)提示end of do-file】便會(huì)將生成的臨時(shí)變量刪除,無(wú)法再次調(diào)用帅掘,詳見(jiàn)下下圖中官方給出的英文解釋委煤,已用藍(lán)色部分標(biāo)出,尤其是最后一句):
關(guān)于 marco 宏的進(jìn)一步解釋素标,有興趣的可以參見(jiàn)官方給的 help 文件中相關(guān)說(shuō)明,如下:
理解了local 之后再去看接下來(lái)的兩次循環(huán)就容易得多萍悴,第二次循環(huán)是將 url 變量與 purl 變量(purl變量是之前的1000個(gè)鏈接)一一對(duì)應(yīng)并儲(chǔ)存起來(lái)头遭,但不顯示在變量窗口,而第三次循環(huán)則是調(diào)用 url 變量?jī)?chǔ)存的1000個(gè)網(wǎng)址癣诱,并將這1000個(gè)網(wǎng)頁(yè)的源代碼 copy 下來(lái)计维,儲(chǔ)存在e盤的 2 文件夾中,命名為temp1.txt—temp1000.txt撕予,此一過(guò)程得看網(wǎng)速鲫惶,大約耗時(shí)30分鐘左右,像下圖這樣就看著數(shù)字變实抡,最后到 temp1000.txt 就是完成了欠母。之所以會(huì)提示not found是因?yàn)槲覀冊(cè)谧ト∶詈蟾郊恿?replace 的 option,也就是告訴 stata 如果發(fā)現(xiàn) e 盤 2 文件夾中有同名文件就將其替換掉吆寨,但是stata發(fā)現(xiàn)沒(méi)有同名文件赏淌,于是它就提示 not found 并按要求生成新文件,若stata發(fā)現(xiàn)有同名文件啄清,則不會(huì)有此提示六水,而是直接將其替換。
漫長(zhǎng)的等待之后辣卒,最后再用我們之前在 part 1中用過(guò)的 bat 批處理命令調(diào)用dos將1000個(gè) txt 合并為 all.txt(這次是在文件夾 2 中進(jìn)行處理掷贾,與之前 all.txt 是不一樣的哦)。至此就得到了1000個(gè)網(wǎng)頁(yè)的源代碼荣茫,這1000個(gè)網(wǎng)頁(yè)源代碼就很重要了想帅,因?yàn)槲覀冃枰腉DP信息全部都包含在里面了。同理啡莉,我們用 infix 命令將其讀進(jìn) stata 進(jìn)行處理港准,命令見(jiàn)文初的圖憎乙,因文本輛較大,讀文本之前最好先clear一下叉趣,不然有可能會(huì)導(dǎo)致stata崩潰,寫了半天的dofile要是沒(méi)保存就不好了(具體原因不知道该押,推測(cè)可能是內(nèi)存不夠用疗杉?.?)蚕礼。
文本讀進(jìn)去之后為一個(gè)變量 v烟具,然后開(kāi)始過(guò)濾,提純工作奠蹬,這也是最為繁雜的工作了朝聋,因?yàn)橐獜墓?735748 行代碼中提取出僅兩個(gè)信息,一個(gè)是 “某某地區(qū)幾幾年”囤躁,一個(gè)是 “GDP”冀痕。根據(jù)我們需要的信息,我們?nèi)ふ野@兩個(gè)信息的關(guān)鍵行狸演,觀察其所在的行都有什么共同的特點(diǎn)言蛇,通過(guò)觀察我們看到,地區(qū)名字所在的行都含有 <title> 這樣的字符宵距,而GDP或者是生產(chǎn)總值所在的行都含有 “生產(chǎn)總值” 這樣的字符(如下圖)腊尚,故我們只需要將包含有這兩個(gè)字符的代碼行保留即可。
第1步:設(shè)置兩個(gè)指標(biāo)變量(以dummy variable虛擬變量的形式出現(xiàn))a 和 b婿斥。對(duì) a 變量來(lái)說(shuō),如果 v 變量(即全部代碼行所在的變量)中含有 <title> 則讓 stata 返回值1哨鸭,表示 “是含有”民宿,否則返回0,表示 “不含”像鸡。同理以 “生產(chǎn)總值” 為指標(biāo)生成 b 變量勘高。然后,keep if a==1 | b==1表示將含有 <title> 或者含有 “生產(chǎn)總值” 的行 keep 下來(lái)坟桅。這一步就將代碼行數(shù)迅速過(guò)濾华望,縮減至至僅 4570 行。
第2步—第N步:全部是切割仅乓,保留赖舟,切割,保留夸楣,切割宾抓,保留.....因?yàn)樘幚矸绞娇梢匀收咭?jiàn)仁智者見(jiàn)智子漩,我的不一定就是最好的,但原理是一樣的石洗。因此僅對(duì)使用的部分命令與函數(shù)進(jìn)行解釋幢泼,見(jiàn)do-file中相關(guān)注釋【strpos、duplicates drop】讲衫。
可以看到涉兽,有些數(shù)據(jù)前面還有一些亂七八糟的字符招驴,這是因?yàn)槊糠莨珗?bào)的書寫格式不統(tǒng)一造成的,需要繼續(xù)進(jìn)行處理枷畏,方法同上面一樣别厘,split,replace and keep拥诡,這里不做繼續(xù)演示触趴,感興趣的可以繼續(xù)。
隨機(jī)找?guī)讉€(gè)數(shù)據(jù)去網(wǎng)站上查詢核對(duì)渴肉,看對(duì)應(yīng)的數(shù)據(jù)是否準(zhǔn)確雕蔽。如我這里從上圖的左右分別隨便挑出合肥市2015年 與 九江市2013年去驗(yàn)證,查詢結(jié)果如下宾娜,經(jīng)核對(duì)批狐,準(zhǔn)確無(wú)誤:
最后,對(duì)于空缺的部分前塔,可以單獨(dú)去網(wǎng)站尋找數(shù)據(jù)將其補(bǔ)齊嚣艇。此外,本次應(yīng)得1000行數(shù)據(jù)华弓,但是最終卻得到了 1015 行數(shù)據(jù)食零,究其原因可能還是公報(bào)的格式不完全統(tǒng)一造成的,而且有的數(shù)據(jù)是省的GDP(較少)寂屏,有的是市的GDP贰谣,因此有重復(fù)部分。這類錯(cuò)誤還得根據(jù)研究者需求自行處理迁霎。
好了吱抚,至此本篇詳解就完結(jié)了,撒花?剂(0.0)
最后一個(gè)tips:stata 12秘豹、13 白色主界面默認(rèn)是不支持中文的,顯示中文為亂碼昌粤,可以在主界面任意位置右鍵—>Preferences既绕,然后將 color scheme 的模式由 Standard 改成 Classic 經(jīng)典模式即可正常顯示中文啄刹。