Python這麼厲害的麼?一次爬完整站小說
阿新 • • 發佈:2019-01-12
1.目標
排行榜的地址: http://www.qu.la/paihangbang/
找到各類排行旁的的每一部小說的名字,和在該網站的連結。
2.觀察頁的結構
很容易就能發現,每一個分類都是包裹在:
之中,
這種條理清晰的網站,大大方便了爬蟲的編寫。
在當前頁面找到所有小說的連線,並儲存在列表即可。
3.列表去重的小技巧
就算是不同類別的小說,也是會重複出現在排行榜的。
這樣無形之間就會浪費很多資源,尤其是在面對爬大量網頁的時候。
這裡只要一行程式碼就能解決:
這裡呼叫了一個list的建構函式set:這樣就能保證列表裡沒有重複的元素了。
4.程式碼實現
模組化,函數語言程式設計是一個非常好的習慣,堅持把每一個獨立的功能都寫成函式,這樣會使程式碼簡單又可複用。
- 網頁抓取頭
- 獲取排行榜小說及其連結: 爬取每一型別小說排行榜,按順序寫入檔案。檔案內容為:小說名字+小說連結。將內容儲存到列表,並且返回一個裝滿url連結的列表
- 獲取單本小說的所有章節連結:
獲取該小說每個章節的url地址,並建立小說檔案
- 獲取單頁文章的內容並儲存到本地 這裡有個小技巧: 從網上爬下來的檔案很多時候都是帶著<br>之類的格式化標籤,可以通過一個簡單的方法把它過濾掉: html = get_html(url).replace('<br/>', '\n') 這裡單單過濾了一種標籤,並將其替換成‘\n’用於文章的換行,
- 主函式
- 輸出結果
5.缺點
本次爬蟲寫的這麼順利,更多的是因為爬的網站是沒有反爬蟲技術,以及文章分類清晰,結構優美。
但是,按照這篇文的思路去爬取小說,大概計算了一下:一篇文章需要:0.5s,一本小說(1000張左右):8.5分鐘,全部排行榜(60本): 8.5小時!
那麼,這種單執行緒的爬蟲,速度如何能提高呢?
自己寫個多執行緒模組?
其實還有更好的方式: Scrapy框架
後面可將這裡的程式碼重構一邊遍,速度會幾十倍甚至幾百倍的提高了!這其實也是多執行緒的威力!