Linux抓取網頁,簡單方法是直接通過 curl 或 wget 兩種命令。
curl 和 wget 命令,目前已經支援Linux和Windows平台,後續將介紹。
curl 和 wget支援協議
curl 支援 http,https,ftp,ftps,scp,telnet等網路通訊協定,詳見手冊 man curl
wget支援 http,https,ftp網路通訊協定,詳見手冊man wget
curl 和 wget下載安裝
1、Ubuntu平台
wget 命令安裝: sudo apt-get install wget (普通使用者登入,需輸入密碼; root賬戶登入,無需輸入密碼)
curl 命令安裝: sudo apt-get install curl (同 wget)
2、Windows平台
wget :wget for Windows
curl :curl Download
wget 和 curl 打包:Windows平台下的wget和curl工具包
Windows平台下,curl下載解壓後,直接是curl.exe格式,拷貝到系統命令目錄下 C:\Windows\System32 即可
Windows平台下,wget下載解壓後,是wget-1.11.4-1-setup.exe格式,需要安裝;安裝後,在環境變數 - 系統變數 - Path 中添加其安裝目錄即可
curl 和 wget抓取執行個體
抓取網頁,主要有url 網址和proxy代理兩種方式,下面以抓取“百度”首頁為例,分別介紹
1、 url 網址方式抓取
(1)curl下載百度首頁內容,儲存在baidu_html檔案中
curl http://www.baidu.com/ -o baidu_html
(2)wget下載百度首頁內容,儲存在baidu_html檔案中
wget http://www.baidu.com/ -O baidu_html2
有的時候,由於網速/資料丟包/伺服器宕機/等原因,導致暫時無法成功下載網頁
這時,可能就需要多次嘗試發送串連,請求伺服器的響應;如果多次仍無響應,則可以確認伺服器出問題了
(1)curl多次嘗試串連
curl --retry 10 --retry-delay 60 --retry-max-time 60 http://www.baidu.com/ -o baidu_html
註: --retry表示重試次數; --retry-delay表示兩次重試之間的時間間隔(秒為單位); --retry-max-time表示在此最大時間內只容許重試一次(一般與--retry-delay相同)
(2)wget多次嘗試串連
wget -t 10 -w 60 -T 30 http://www.baidu.com/ -O baidu_html2
註:-t(--tries)表示重試次數; -w表示兩次重試之間的時間間隔(秒為單位); -T表示連線逾時時間,如果逾時則串連不成功,繼續嘗試下一次串連
附: curl 判斷伺服器是否響應,還可以通過一段時間內下載擷取的位元組量來間接判斷,命令格式如下:
curl -y 60 -Y 1 -m 60 http://www.baidu.com/ -o baidu_html
註:-y表示測試網速的時間; -Y表示-y這段時間下載的位元組量(byte為單位); -m表示容許請求串連的最大時間,超過則串連自動斷掉放棄串連
2、 proxy代理方式抓取
proxy代理下載,是通過串連一台中間伺服器間接下載url網頁的過程,不是url直接連接網站伺服器下載
兩個著名的免費代理網站:
freeproxylists.net(全球數十個國家的免費代理,每日都更新)
xroxy.com(通過設定連接埠類型、代理類型、國家名稱進行篩選)
在freeproxylists.net網站,選擇一台中國的免費Proxy 伺服器為例,來介紹proxy代理抓取網頁:
218.107.21.252:8080(ip為218.107.21.252;port為8080,中間以冒號“:”隔開,組成一個通訊端)
(1)curl 通過代理抓取百度首頁
curl -x 218.107.21.252:8080 -o aaaaa http://www.baidu.com(port 常見有80,8080,8086,8888,3128等,預設為80)
註:-x表示Proxy 伺服器(ip:port),即curl先串連到Proxy 伺服器218.107.21.252:8080,然後再通過218.107.21.252:8080下載百度首頁,最後218.107.21.252:8080把下載的百度首頁傳給curl至本地(curl不是直接連接百度伺服器下載首頁的,而是通過一個中介代理來完成)
(2)wget 通過代理抓取百度首頁
wget通過代理下載,跟curl不太一樣,需要首先設定Proxy 伺服器的http_proxy=ip:port
以ubuntu為例,在目前使用者目錄(cd ~),建立一個wget設定檔(.wgetrc),輸入代理配置:
http_proxy=218.107.21.252:8080
然後再輸入wget抓取網頁的命令:
wget http://www.baidu.com -O baidu_html2
代理下載:
=======================
抓取的百度首頁資料():
其它命令參數用法,同url網址方式,在此不再贅述
ftp協議、迭代子目錄等更多的curl 和 wget用法,可以man查看協助手冊
知識拓展:
在國內,由於某種原因一般難以直接存取國外某些敏感網站,需要通過 VPN 或 Proxy 伺服器才能訪問
如果校園網和教育網有IPv6,則可以通過sixxs.org免費代理訪問facebook、twitter、六維空間等網站
其實,除了VPN 和 IPv6+sixxs.org代理方式外,普通使用者還是有其它途徑訪問到國外網站
下面介紹兩個著名的免費代理網站:
freeproxylists.net(全球數十個國家的免費代理,每日都更新)
xroxy.com(通過設定連接埠類型、代理類型、國家名稱進行篩選)
curl 項目執行個體
使用curl + freeproxylists.net免費代理,實現了全球12國家google play遊戲排名的網頁抓取以及趨勢圖查詢(抓取網頁模組全部使用Shell編寫,核心代碼約1000行)
遊戲排名趨勢圖請見我先前的部落格:JFreeChart項目執行個體