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


*案例:抓取 http://www.tjcn.org 中國統計信息網上前50頁(每頁包含20個市的數據)的1000個地區的GDP數據。


使用stata版本為 stata13,與12版本和14版本都不兼容。本文do-file及相關文件 鏈接:https://pan.baidu.com/s/1smVkcUh 密碼:40uq

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

初學stata爬蟲,見網絡上還未有詳細的案例,此類培訓費用也較高,特分享此篇案例,僅為個人經驗的總結,與諸君共享。學無止境,相信還有更好的處理命令和方法,歡迎指教。

首先對于網頁的數據結構有一定的要求,要求數據在網頁中排布的規律性較強,方便進行抓取,如案例網站中,每個地區就是一份公報,每份公報的格式大同小異,基本開篇都有GDP數據,還比較規律。因此就用此網站作為案例嘗試:

Tips:雜亂無章的網頁也不是不能處理,只是處理起來難度較大而已,只要掌握了基本原理,再去處理復雜網頁數據相信也不是什么難事。

各地區統計公報
點擊進入次級頁面后,每個地區公報基本都是相同格式,開篇就有GDP數據

/*先觀察網站上公報每一頁對應的網址鏈接變化規律,一般是最后的編號有規律變化,一個數字對應一頁,將鼠標放在頁數數字上(不用點擊),在瀏覽器左下角便會顯示相應頁面的鏈接,如下:可以看到網址的后段 list_5_1對應第一頁,list_5_2對應第二頁,依次類推直到最后一頁*/


注意【紅色部分】數字的變化規律

*http://www.tjcn.org/tjgb/list_5_1.html

* http://www.tjcn.org/tjgb/list_5_2.html

*.......................................

* http://www.tjcn.org/tjgb/list_5_50.html,后面更多不在這舉例。

以上我們就得到了翻頁鏈接,看似沒有什么實質性的內容。但是,在這一共50個頁面中,每頁中都有20份地區公報,點擊即可進入查看,所以這50個翻頁鏈接中實際上更包含了50*20共1000個統計公報的鏈接,而這1000個鏈接對我們來說就很重要了,因為我們最終需要從這1000個鏈接分別所對應的頁面中抓取1000個地區的統計公報信息進行分析。

依上,我們的抓取將分為兩輪:第一輪是抓取50個翻頁鏈接所指向的50個網頁的網頁元素(其中就含有50*20個公報的鏈接地址,需要提取處理)。第二輪則是在獲取了1000個公報的鏈接后,分別抓取1000個公報所在網頁的元素信息(耗時較長,約30mins)。

(Tips:為了兩輪處理的方便,建議新建兩個文件夾分別儲存兩輪抓取的文本,本例在 e盤新建文件夾 1 和 2)


有了翻頁規律之后,我們可以開始第一輪的抓取,本輪抓取獲得的是共50個頁面的網頁元素,每頁的元素中都包含了20份公報鏈接。采用 forvalues ( = forv ) 循環語句命令,寫法如下:注意字母 i ,這里表示賦的一個值,這個值范圍是從1-50,中間間隔是1。“copy + 網頁鏈接 +保存位置” 可以抓取該網頁元素,網頁鏈接的最后根據我們開始發現的頁面變化規律設置其隨 i 值變化,copy后保存到e盤的1文件夾,分別命名為temp1.txt—temp50.txt。等待片刻便可完成抓取。

第一次循環,抓取50個頁面信息
抓取結果:共50份txt文檔

我們首先來看如何處理抓取的第1頁的信息,從中提取出20份公報的鏈接,后面再同時處理50個頁面,提取1000個鏈接。

在瀏覽器中打開第1頁,右鍵點擊空白處,查看網頁源代碼,stata抓取的信息實際上就是網頁的源代碼,我們就是要用源代碼中尋找指向每個公報所在的次級網頁的鏈接。尋找的辦法很簡單:尋找與次級網頁title有關的關鍵詞(Note:這些關鍵詞對我們馬上提取鏈接還很有幫助),看關鍵詞附近有沒有網頁地址格式的短鏈接(一般以.html結尾),一般會是彩色,如圖中藍色部分。如果按照我們的分析沒錯,那么該網站的主鏈接加上這個短鏈接一定能直接打開次級網頁,試試在瀏覽器地址欄直接輸入www.tjcn.org/tjgb/201606/32971.html,看看能否打開《拉薩市015年國民經濟和社會發展統計公報》,經嘗試沒有問題。

查看網頁源代碼
在網頁源代碼中尋找線索

OK,既然我們知道了短鏈接都隱藏在這里,下面便可以將其導入 stata 中進行提取,同樣先處理第1頁,后面再同時處理。

使用infix命令將存儲有網頁源代碼的txt文本文檔導入stata,讓網頁源代碼在stata中以1個變量 v,n行的格式顯示,可以把每一行看作一個case便于理解,與我們在瀏覽器中查看源代碼時的格式相同,1-20000指的是對源代碼每一行最多讀取20000個字符,可以設置大一點沒問題,保證每一行都能被完整讀取。

format 命令調整下stata中的顯示格式,讓其顯示200個字符寬度,方便我們查看。

如果變量 v 的case中含有引號中的內容我們就將其keep,這里用到 index 指標函數,將括號中的內容作為stata識別保留與否的指標。

split 切割命令,以后面括號中的內容為標準對文本進行切割。第一個需要注意的是切割之后,括號中作為切割線的引號內部分會被刪除。例如,“拉薩市2015年”,若以 “市” 字作為分割線,則只會得到兩個新變量:“拉薩”、“2015年”,第二次切割同理。此外還需要注意的是括號引用部分(`"xxx "')雙層引號表示絕對引用的意思,因為有些作為分割線的內容本身含有引號,為了避免stata出錯,使用雙層引號的絕對引用,當然,如果作為分割線的內容中不含引號,直接使用單層引號("xxx")即可。

切割完之后就得到了20個次級網頁的短鏈,加上主鏈之后,得到20個公報的鏈接,命名為新變量purl

stata 讀取文本進行處理
變量 purl 即為第一頁的 20 個公報對應的網址鏈接

Ok,到此我們處理完了第1頁的源代碼,獲得了20個我們想要的次級網頁鏈接。

實際上每頁的源代碼都適用同樣的提取處理規則,因此我們只需要將同樣的命令對每個頁面的源代碼都 run 一遍,就能得到50*20共1000個公報的鏈接了。但是我們不想跑二十遍命令,我們想要一次將50個頁面一起處理掉。


而50頁的源代碼分散在50個txt文檔中,因此只要將50個txt文檔合并不就好了嗎,如何合并呢?這里使用一種簡單方法,需要調用計算機 dos 命令:

用記事本編寫 .bat 批處理文件。先右鍵新建一個 txt 文本文檔,輸入type *.txt > all.txt,表示將任意 txt 類型的文件全部合并成一個 all.txt,注意type 和 *之間有空格。寫完保存。然后將該 txt 文檔的格式后綴 txt 改為 bat,在彈出的對話框中選 “是”。文件圖標會變成兩個小齒輪一樣的就對了,下圖所示。

如要合并文件,只需要雙擊 “合并.bat” 文件即可在 dos 中執行寫好的合并命令,黑色dos窗口閃現一下,就會發現文件夾中已經多了一個合并好的 all.txt,可以用記事本直接打開查看。效果是將50個txt 按順序上下拼接,可以理解成 stata 的 append。【這個bat小文件我們后面還會用到】

注意:合并用的 bat 文件必須與待處理的50個 txt 文檔位于同一目錄下,否則沒有執行結果。

在 txt 中輸入批處理的命令
建立bat文件,雙擊執行,合并得到 all.txt文檔

既然得到了50頁的所有源代碼,那么我們只需要以同樣的方式將 all.txt 讀進 stata ,用剛才處理第一頁的命令再跑一遍就好了。命令與上面一致,唯一區別只是將讀入的文件改為了 all.txt,運行一下即可得到1000個地區公報的鏈接。

將 all.txt 文件讀入stata
run 之后得到的1000個指向地區公報的鏈接

至此,我們已經完成了第一輪抓取及相關工作,等待開始第二輪抓取,即根據得到的1000個公報的鏈接,去抓取1000個公報所在網頁的源代碼。

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


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

推薦閱讀更多精彩內容

  • 接上篇: 詳解stata爬蟲抓取網頁上的數據 part 1[http://www.lxweimin.com/p/2...
    大雄君閱讀 8,610評論 8 10
  • ¥開啟¥ 【iAPP實現進入界面執行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程,因...
    小菜c閱讀 6,511評論 0 17
  • 33款可用來抓數據的開源爬蟲軟件工具 要玩大數據,沒有數據怎么玩?這里推薦一些33款開源爬蟲軟件給大家。 爬蟲,即...
    visiontry閱讀 7,413評論 1 99
  • 我希望在未來的這個時候,我大喊:“小二,上酒!”在大洋的彼岸,有一個女孩,透過滿目繁華,輕聲呢喃,大叫道“好嘞!”
    小二上酒_閱讀 289評論 0 0
  • 愛情從來都不公平 你很好但不被人珍惜 不是誰有錯 而是不管你有多好都不被對方所需要 人有時候就都很犯賤 不會喜歡愛...
    哀慕熙榮閱讀 178評論 0 0