最近寫了一個(gè)課程助手類Android App基公,寫了一大半的時(shí)候發(fā)現(xiàn)這個(gè)課程助手適用于低頻用戶場(chǎng)景琴庵,如果做一個(gè)App反倒不如做成微信公眾號(hào)伤溉。頓時(shí)喪失了一半寫下去的毅力辫秧。那就停下來束倍,把爬取教務(wù)處和一些類似網(wǎng)站的過程記錄下來。
登錄
成功登錄教務(wù)處網(wǎng)站是拿到后續(xù)數(shù)據(jù)的關(guān)鍵盟戏。首先需要知道POST的數(shù)據(jù)格式绪妹。如果有驗(yàn)證碼則要爬取驗(yàn)證碼,識(shí)別之后柿究,攜帶參數(shù)進(jìn)行POST邮旷。在這之中一定要保持在同一會(huì)話中,也就是緩存cookie蝇摸。登錄成功后的cookie是獲取之后數(shù)據(jù)的憑證婶肩。我常用的網(wǎng)絡(luò)庫為okhttp3,在okhttp3中cookie可以在okhttpclient創(chuàng)建的過程中配置貌夕。例如
在saveFromResponse和loadForRequest中分別緩存和提取cookie
在緩存cookie這一塊是要根據(jù)不同網(wǎng)站來設(shè)置的律歼,可能在同一個(gè)host不同的path下需要使用同一個(gè)cookie。如果使用Map來緩存cookie那就不能簡(jiǎn)單地用HttpUrl來作為key啡专,否則就可能因?yàn)椴辉谕粫?huì)話中導(dǎo)致驗(yàn)證碼無法通過险毁。
很多教務(wù)處的網(wǎng)站的登錄并沒有做的復(fù)雜,只需要簡(jiǎn)單的POST模擬植旧,注意下緩存cookie就可以繼續(xù)其他頁面的獲取辱揭。
解析
拿到數(shù)據(jù)之后,下一步就是從html頁面中解析出想要的數(shù)據(jù)病附。我用過的頁面解析包郵Jsoup和HtmlUnit问窃。相比較Jsoup更加輕量化。Jsoup有很多很強(qiáng)大的API來幫助操作DOM完沪,CSS域庇,對(duì)于復(fù)雜的結(jié)構(gòu)還可以使用選擇器(selector)來提取,但一些網(wǎng)站會(huì)異步加載數(shù)據(jù)覆积,這樣會(huì)導(dǎo)致拿到的html頁面并不是最終和在瀏覽器中看到一致听皿,數(shù)據(jù)也不全。這時(shí)候就要用另一大利器HtmlUnit宽档,它支持JS尉姨,CSS,所以操作HtmlUnit就像操作一個(gè)瀏覽器一樣簡(jiǎn)單吗冤。htmlunit
有了利器又厉,就要學(xué)著用了九府。提取復(fù)雜數(shù)據(jù)Jsoup可以使用選擇器,HtmlUnit可以使用Xpath覆致。selector和xpath的語法很簡(jiǎn)單侄旬,當(dāng)然你也可以不學(xué),為什么呢煌妈?
因?yàn)镃hrome可以幫你儡羔!
例如
對(duì)于如此復(fù)雜的界面,只需要:
移動(dòng)鼠標(biāo)到想要的數(shù)據(jù)上 -> 然后輕輕點(diǎn)擊鼠標(biāo)右鍵 -> 看到COPY復(fù)選框 -> 會(huì)出現(xiàn)copy as selector 和 copy as xpath璧诵。
對(duì)于教務(wù)處頁面的提取汰蜘,可以看做是爬蟲的入門。如果要提取微博這樣的復(fù)雜地頁面腮猖,建議從移動(dòng)端入口鉴扫,移動(dòng)端的頁面更容易爬取和解析。附一個(gè)之前寫的垃圾demo /捂臉 垃圾demo??