爬蟲技術簡析與實戰

首先我們看看爬蟲的定義:

網絡爬蟲(又被稱爲網頁蜘蛛,網絡機器人,在FOAF社區中間,更經常的稱爲網頁追逐者),是一種按照一定的規則,自動的抓取萬維網信息的程序或者腳本。

也就是說,從網絡上抓取數據的程序都可以稱爲是爬蟲。一般來說,爬蟲一般使用Python等腳本語言來編寫,Java等高級語言不是說不能寫,只是不適合,腳本語言本身語法簡單,自帶功能強大的庫,編寫爬蟲這種小程序簡單快捷。所以一般我們選用Python來寫爬蟲。

以上我們簡單瞭解了爬蟲的定義和使用的語言工具。接下來,我們開始用一個實際的例子來熟悉爬蟲的實現。
華工的教務系統在選課的時候是最繁忙,也是經常崩潰的。原因就在於在一時間大量用戶登錄,服務器內存不足,無法處理這麼多的請求。如果你厭倦了不停的點擊刷新,提交的話,那麼可以考慮用爬蟲幫你自動選課。
既然有了這個念頭,那麼從哪裏着手呢?直接寫代碼嗎?肯定不是。要開發軟件的時候直接上來就寫代碼的行爲就是耍流氓。
第一步應該是分析選課的流程
- 登錄教務系統
- 點擊校公選課
- 查看所有的課程列表
- 選中要選的課程
- 提交

以上是選課的五個步驟。我們先來看看這五個步驟背後的技術實現。
在登錄的時候,瀏覽器會發送一個post請求,附上賬戶密碼,服務器驗證通過之後,返回相應的頁面。
這裏有個地方要注意,就是我們如何保持登陸狀態?一般來說,保持登陸狀態,採取的方法無非是cookie和session。觀察請求,我發現瀏覽器本地並沒有存儲cookie,(本質上session也要利用到cookie)這就產生一個問題了,沒有cookie,服務器是如何保持登錄狀態的呢?難道它用一種新的技術。這時候就考驗我們的信息檢索能力了。首先我發現服務器用的是asp,那麼我就去搜索關於asp保持登錄狀態的資料,結果發現原來asp有一種保存cookie的方法,把cookie字段放在url中,所以我們可以發現我們訪問的網址中會有一串奇怪的字符串。
第二個要注意的,提交選課的表單中,它是如何標識我們選了哪一門的。觀察網頁的源碼,最後我發現課程都有一個唯一的課程代碼。當你選中一門課的時候,瀏覽器會把相應的課程代碼添加到表單中。當你點擊提交的時候,瀏覽器就把表單post給服務器。這樣就完成了選課。選不選上這門要看數據庫中這麼課還有沒有餘量。即使課程餘量爲0,只要有人退選,那麼你還是可以選上。這也是我們爲什麼能刷課的原因。用爬蟲24小時不停的post選課表單,代替我們的手工勞動,解放雙手,這也是技術讓生活變得更好的例子。
第二步根據以上分析開始實現設計
- 登錄教務系統,我們可以通過發送對應的表單給服務器,登錄成功之後,我們用帶有cookie的網址請求數據就可以保持登錄狀態,就像我們在用瀏覽器一樣。
- 訪問到課程列表之後,我們要考慮一下,怎麼獲取課程代碼。答案是正則表達式。通過正則表達式,我們可以用一定規則從一堆代碼裏面獲取需要的字段。
- 最後一步就把選課表單post到服務器就行。但事情沒有那麼簡單。由於服務器使用的是window,它接受的字符集是gbk,但是Python解析字符集默認是ascii.這就涉及到字符集的轉化問題。我的做法改變Python的默認編碼爲utf8,接受的數據轉化爲utf8編碼,在程序中處理之後,在發送時,把表單數據轉化爲gbk編碼,再發送出去。

第三步根據設計開發編碼
這一步主要就是要耐心細心的編寫並調試。

最後,總結一下,在互聯網時代,網絡已經融入了我們的生活,學會編寫爬蟲,可以提高我們的工作效率,把重複繁瑣的工作交給爬蟲去做。刷課只是一個簡單應用,大的應用是搜索引擎,谷歌的爬蟲應該是世界上最複雜最強大的了。以後如果做數據挖掘,那麼爬蟲也是必需的工具。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章