1. 程式人生 > >Python這麼厲害的麼?一次爬完整站小說

Python這麼厲害的麼?一次爬完整站小說

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框架

後面可將這裡的程式碼重構一邊遍,速度會幾十倍甚至幾百倍的提高了!這其實也是多執行緒的威力!