利用linux curl爬取網站數據
-
看到一個看球網站的以下截圖紅色框數據,想爬取下來,通常爬取網站數據一般都會從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等文本操作工具以及還運用到正則表達式,需要了解的內容比較多,比較繁瑣復雜,
利用linux curl爬取網站數據