最近寫了一個課程助手類Android App,寫了一大半的時候發(fā)現(xiàn)這個課程助手適用于低頻用戶場景,如果做一個App反倒不如做成微信公眾號。頓時喪失了一半寫下去的毅力。那就停下來,把爬取教務處和一些類似網(wǎng)站的過程記錄下來。
登錄
成功登錄教務處網(wǎng)站是拿到后續(xù)數(shù)據(jù)的關鍵。首先需要知道POST的數(shù)據(jù)格式。如果有驗證碼則要爬取驗證碼,識別之后,攜帶參數(shù)進行POST。在這之中一定要保持在同一會話中,也就是緩存cookie。登錄成功后的cookie是獲取之后數(shù)據(jù)的憑證。我常用的網(wǎng)絡庫為okhttp3,在okhttp3中cookie可以在okhttpclient創(chuàng)建的過程中配置。例如
在saveFromResponse和loadForRequest中分別緩存和提取cookie
在緩存cookie這一塊是要根據(jù)不同網(wǎng)站來設置的,可能在同一個host不同的path下需要使用同一個cookie。如果使用Map來緩存cookie那就不能簡單地用HttpUrl來作為key,否則就可能因為不在同一會話中導致驗證碼無法通過。
很多教務處的網(wǎng)站的登錄并沒有做的復雜,只需要簡單的POST模擬,注意下緩存cookie就可以繼續(xù)其他頁面的獲取。
解析
拿到數(shù)據(jù)之后,下一步就是從html頁面中解析出想要的數(shù)據(jù)。我用過的頁面解析包郵Jsoup和HtmlUnit。相比較Jsoup更加輕量化。Jsoup有很多很強大的API來幫助操作DOM,CSS,對于復雜的結構還可以使用選擇器(selector)來提取,但一些網(wǎng)站會異步加載數(shù)據(jù),這樣會導致拿到的html頁面并不是最終和在瀏覽器中看到一致,數(shù)據(jù)也不全。這時候就要用另一大利器HtmlUnit,它支持JS,CSS,所以操作HtmlUnit就像操作一個瀏覽器一樣簡單。htmlunit
有了利器,就要學著用了。提取復雜數(shù)據(jù)Jsoup可以使用選擇器,HtmlUnit可以使用Xpath。selector和xpath的語法很簡單,當然你也可以不學,為什么呢?
因為Chrome可以幫你!
例如
對于如此復雜的界面,只需要:
移動鼠標到想要的數(shù)據(jù)上 -> 然后輕輕點擊鼠標右鍵 -> 看到COPY復選框 -> 會出現(xiàn)copy as selector 和 copy as xpath。
對于教務處頁面的提取,可以看做是爬蟲的入門。如果要提取微博這樣的復雜地頁面,建議從移動端入口,移動端的頁面更容易爬取和解析。附一個之前寫的垃圾demo /捂臉 垃圾demo??