1. 程式人生 > >利用linux curl爬取網站資料

利用linux curl爬取網站資料

  1. 看到一個看球網站的以下截圖紅色框資料,想爬取下來,通常爬取網站資料一般都會從java或者python爬取,但本人這兩個都不會,只會shell指令碼,於是硬著頭皮試一下用shell爬取,方法很笨重,但旨在結果嘛,呵呵。

    技術分享

2.首先利用curl工具後者wget工具把整個網站資料爬取下來

 

curl 網址 >wangzhan.txt

 

3.檢視wangzhan.txt檔案,找出規則,看到資料是存放在哪個地方,本人是把txt檔案拷到本機上用UE開啟方便檢視。通過檢視檔案,我發現數據是儲存在“var automultiMatchList”與 “var setSingleMulti”這間的所有行,每個行後面的},

結束代表一行:

技術分享

 

4. 擷取所需的資料我是通過以下5個步驟

技術分享

shell指令碼分析:

(1)sed -n ‘/var automultiMatchList/,/var setSingleMulti/p‘ wangzhan.txt 

這步是指從wangzhan.txt檔案中查詢到包含“var automultiMatchList”的行與包含“var setSingleMulti”的行之間的所有行:

技術分享···

···

技術分享

(2)sed ‘$d‘ 是指刪除最後一行的內容,因為這不是我們需要的資料。

(3)awk ‘NR<2‘ 是指把第一行取出來做特殊處理,因為第一行包含不要的資料(紅色線框的內容)

技術分享

(4)awk -F‘= {‘ ‘{print $2}‘ 是指通過 ={ 分隔域,輸出$2就把上步紅色線框的內容去掉了

技術分享

(5)>1.txt 把第一行的資料輸出到1.txt檔案中

(6)第二條shell指令碼中的awk ‘/[0-9]/{print $0}‘ 就是把最後的空行都去掉

技術分享

去掉最後的空行變成:

技術分享

(7)第二條shell指令碼中的awk ‘NR>=2‘ >2.txt 是指把第二行及以下的所有行都輸出到2.txt指令碼

(8)awk 1 1.txt 2.txt>3.txt 這條命令是指把第一行和第二行及以下的所有行合併3.txt檔案中,因為之前把第一行單獨處理了,所以現在需要在合併到一塊,相當於sql中union all。

(9)awk ‘{a=match($0,"\"3\"");print substr($0,a)}‘ 3.txt  這條命令,因為通過wangzhan.txt檔案發現,我們需要的內容都是在“3”這個字元之後:

技術分享

這裡用了awk的match和substr函式,就是找到“3”在這一行的所在位置之後,再擷取需要的內容,這裡不用過awk函式的同學可以複習一下awk函式。到這一步,我們要擷取的資料的雛形就出來了。

技術分享

(10)tr -d ‘ ‘ 是指把空格都去掉

技術分享

(11)awk -F‘,‘ ‘{print $1" "$2" "$3" "$4" "$5" "$6" "$7}‘>data.txt  是指通過逗號分隔域,然後再通過空格隔開:

技術分享

(12)sed ‘s/"[[:alnum:]]\+"://g‘ 是指把冒號前面的資料都去掉,例如"3": 這種資料:

技術分享

(13)awk ‘{print $1,$2,$3,$4,$5,$6}‘ 是指只打印我們需要的6個域:

技術分享

(14)xargs -n3 是指按照每3列輸出,我們執行下第5條命令,然後33.txt的資料,就是我們要的資料:

技術分享

 

 

總結:用shell爬取網站資料,需要熟悉sed,grep,awk等文字操作工具以及還運用到正則表示式,需要了解的內容比較多,比較繁瑣複雜,