Python爬蟲零基礎實例---爬取小說吧小說內容到本地

Python爬蟲實例--爬取百度貼吧小說

寫在前面

本篇文章是我在簡書上寫的第一篇技術文章,作為一個理科生,能把僅剩的一點文筆拿出來獻丑已是不易,希望大家能在指教我的同時給予我一點點鼓勵,謝謝。


一.介紹

小說吧:顧名思義,是一個小說愛好者的一個聚集地。當然這不是重點,重點是,我們要做的事情便是將小說吧中以帖子連載形式的小說用爬蟲給拿下來保存到本地

這個項目是我曾初學python之時做的一個練習項目,現在再重新拿出來作為一篇開篇簡作獻給大家。閱讀本文不需要有很高的python技術或者爬蟲知識,只要略微有些python基礎就可以,在一些地方,我會盡量給大家詳細備注。

二.環境

Python版本:Python2.7

IDE:Pycharm2017

第三方庫:
urllib2 模塊:urllib2是python的一個獲取url(Uniform ResourceLocators,統一資源定址器)的模塊。
re模塊:Python 的 re模塊(Regular Expression 正則表達式)提供各種正則表達式的匹配操作

注:以上兩個第三方庫在Python2.7中自帶,因此不用再安裝。本案例在使用第三方庫函數時會詳細介紹用法與功能。

三.案例

1.導入模塊

首先創建一個python文件,我這里為main.py(文件名隨意取,本案例只使用一個py文件)。本案例中我們使用兩個模塊urllib2re,因此首先導入模塊.

# -*- coding:utf-8 -*-
import urllib2 , re

當然,python2版本需要在開頭聲明編碼格式。除了上述代碼的寫法以外,也可以這樣聲明

# coding = utf-8

2.理解思路

我個人在做項目前習慣先分析項目,將步驟一步一步的寫出來,然后去慢慢實現。

  1. 找到目標網頁,獲取源碼
  2. 匹配標題,獲取標題內容
  3. 匹配正文,獲取正文內容
  4. 去除或者替換雜項

OK,這里思路就是這樣的一個四部曲。現在來看一下代碼框架。

# -*- coding:utf-8 -*-
import urllib2 , re


#這是本案例的類
class Novel:

    baseUrl = '' #這里是你要爬取的小說的鏈接
    #這個方法用來獲取網頁源碼
    def getPage(self):
        pass
    #這個方法用來獲取小說標題并保存
    def getTitle(self):
        pass
    #這個方法用來獲取小說文本并保存
    def getText(self):
        pass

#這是一個測試模塊,執行本文件時的入口
if __name__ == '__main__':
    n = Novel() #實例化一個類
    #print n.getPage() #獲取網頁源碼
    n.getTitle()#獲取小說題目
    n.getText() #獲取小說內容

現在開始一步步實現功能:

1.找到目標網頁,獲取網頁源碼

我在小說吧精品貼里面隨便翻了一個帖子,就以這個帖子為案例。
【原創】《貧僧為什么不可以談戀愛》(古言,長篇)
現在我們需要爬取這個帖子中小說內容,我們需要直接將它的鏈接地址給baseUrl嗎?當然不是
爬取一個帖子上的小說,實際上是去爬取該小說作者的所發表的內容,所以我們還需要進行一步操作,只看樓主

這里寫圖片描述

我們所需要的鏈接地址,就是當前這個了

https://tieba.baidu.com/p/4973334088?see_lz=1
注意一定是要只看樓主后的鏈接,比之前的會多出個?see_lz=1

現在就將你得到的鏈接地址賦值給baseUrl

baseUrl = 'https://tieba.baidu.com/p/4973334088?see_lz=1'

接下來我們來獲取這個網頁的源碼,也就是實現getPage函數:

    def getPage(self):
        request = urllib2.Request(self.baseUrl)
        response = urllib2.urlopen(request).read()
        return response

本函數現實通過以基本鏈接baseUrl為參數實現了一個Request請求類的對象request。接著通過urlopen去執行request請求對象打開目標網頁。接著通過調用read`函數獲取目標網頁的源碼,并作為函數返回值返回.
返回的網頁源碼,可在測試代碼塊中通過調用輸出本函數查看。
例:

if __name__ == '__main__':
    n = Novel() #實例化一個類
    print n.getPage() #獲取網頁源碼

2.匹配標題,獲取標題內容

首先先亮出我的代碼:

    def getTitle(self):
        html = self.getPage() #調用獲取源碼
        #r防止轉義
        reg = re.compile(r'<h3 class="core_title_txt pull-left text-overflow  " title="(.*?)" style=')
        items = re.findall(reg,html)
        for item in items:
            print item
            f = open('novel.txt','w')
            f.write('標題===>>>'+item)
            f.close()

注意:代碼錯行要在行末加\
例如:

print 'hello   \
          world'

首先我們在網頁源碼中尋找包含小說主題部分的源碼,可以通過Ctrl+F搜索。查找到<div>^=……中間包含小說主題<.div>這么一長串的包含小說主題的代碼。只要將主題部分全部置換為(.*?)號就可以了。

在正則表達式中的含義:
.:匹配任意字符,除了換行符
:匹配前面的子表達式零次或多次
?:匹配前面的子表達式零次或一次
():標記一個子表達式的開始和結束位置。子表達式可以獲取供以后使用
(.>)
:匹配所有滿足條件的表達式并作為結果集返回

re.compile函數是將正則表達式的字符串形式編譯為Pattern實例,然后使用Pattern實例處理文本并獲得匹配結果,其中字符串前的r是為了防止轉義
findall(正則表達式,文本) ------將滿足的匹配結果以list列表返回
用迭代拿到items中的主題名后在將之寫入名為novel.txt的文件中

3.匹配正文,獲取小說正文內容

匹配正文,與匹配標題相差無幾,首先是尋找以樓主發表的第一層為例的代碼<div>段,從中獲取可以作為正則匹配的語句。并將正文部分改為(.*?)
如下

class="d_post_content j_d_post_content "> (.*?)</div><br>
實現函數如下:

    #這個方法用來獲取小說文本并保存
    def getText(self):
        html = self.getPage()
        reg = re.compile(r'class="d_post_content j_d_post_content ">            (.*?)</div><br>',re.S)#匹配換行符
        req = re.findall(reg,html)
        for i in req:
            print i
            f = open('novel.txt','a') #a 追加模式
            f.write('\n'+i)
            f.close()

如同匹配主題一樣的步驟匹配正文,但是并沒有結束,因為你會在你的結果中看到這樣


雜亂無章

對沒錯。雜亂無章的正文,中間還有HTML中的<a>,<img>,<br>等標簽
我們接著來處理

4.替換或者去出雜項

re模塊中有sub函數

sub(被替換的內容,替換的內容,需要處理的文本) ---- 返回處理后的文本

現在我們將雜項全部給替換成空字符吧""
當然<br>標簽可以直接調用字符串中的replace函數替換成換行符\n

修改后的函數模塊如下:

    def getText(self):
        html = self.getPage()
        reg = re.compile(r'class="d_post_content j_d_post_content ">            (.*?)</div><br>',re.S)#匹配換行符
        req = re.findall(reg,html)
        for i in req:
            removeA = re.compile('<a.*?>|</a>')
            removeIMG = re.compile('<img.*?>')
            removeHTTP = re.compile('<http.*?.html>')
            i = re.sub(removeA,"",i)
            i = re.sub(removeIMG,"",i)
            i = re.sub(removeHTTP,"",i)
            i = i.replace('<br>','\n')
            print i
            f = open('novel.txt','a') #a 追加模式
            f.write('\n'+i)
            f.close()

注意:記得在打開文件函數中,對文件的操作方式為a追加模式

案例結束:
將完整代碼貼給大家:

# -*- coding: utf-8 -*-

import urllib2 , re

#這是本案例的類
class Novel:
    baseUrl = 'https://tieba.baidu.com/p/4973334088?see_lz=1' #這里是你要爬取的小說的鏈接
    #這個方法用來獲取網頁源碼
    def getPage(self):
        request = urllib2.Request(self.baseUrl) 
        response = urllib2.urlopen(request).read()
        return response
    #這個方法用來獲取小說標題并保存
    def getTitle(self):
        html = self.getPage() #調用獲取源碼
        #r防止轉義
        reg = re.compile(r'<h3 class="core_title_txt pull-left text-overflow  " title="(.*?)" style=')
        items = re.findall(reg,html)
        for item in items:
            print item
            f = open('novel.txt','w')
            f.write('標題===>>>'+item)
            f.close()

    #這個方法用來獲取小說文本并保存
    def getText(self):
        html = self.getPage()
        reg = re.compile(r'class="d_post_content j_d_post_content ">            (.*?)</div><br>',re.S)#匹配換行符
        req = re.findall(reg,html)
        for i in req:
            removeA = re.compile('<a.*?>|</a>')
            removeIMG = re.compile('<img.*?>')
            removeHTTP = re.compile('<http.*?.html>')
            i = re.sub(removeA,"",i)
            i = re.sub(removeIMG,"",i)
            i = re.sub(removeHTTP,"",i)
            i = i.replace('<br>','\n')
            print i
            f = open('novel.txt','a') #a 追加模式
            f.write('\n'+i)
            f.close()
#這是一個測試代碼塊,執行本文件時的入口
if __name__ == '__main__':
    n = Novel() #實例化一個類
    #print n.getPage() #獲取網頁源碼
    n.getTitle()#獲取小說題目
    n.getText() #獲取小說內容

以后想要獲取小說吧哪個小說,只要將baseUrl的地址修改一下就好咯。




撒花撒花撒花,從11點寫到了將近2點,終于搞定了。
因為是第一次寫技術文寫這么長時間,所以,,后面耐心不太好,導致后半篇文章質量太差勁。
不過,終究是先搞完了一篇哪,簡書處女技術作。。
至于文章瑕疵,我在白天會花時間去修改,也希望大家給我多多提意見。我呢~爭取展現給大家的是一篇更加完美的文章。

夜了,晚安。


看在作者君這么辛苦的份上,求您點個喜歡吧!!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,362評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,013評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,346評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,421評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,146評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,534評論 1 325
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,585評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,767評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,318評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,074評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,258評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,828評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,486評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,916評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,156評論 1 290
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,993評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,234評論 2 375

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,692評論 25 708
  • # Python 資源大全中文版 我想很多程序員應該記得 GitHub 上有一個 Awesome - XXX 系列...
    aimaile閱讀 26,530評論 6 427
  • 那一院靜默的僧人 在我眼中是一本平裝的故事書 每件青衣之下 都曾是深邃而遙遠的故事 走出廟門 我看見滾滾紅塵 那是...
    徐曙光閱讀 267評論 0 2
  • 各位爸爸媽媽們,大家好! 先表揚孩子們今天的表現,今天孩子們全都帶了紅領巾了,這真是開學以來第一回啊,值得表揚,說...
    陽光溫溫閱讀 287評論 2 4
  • 原文鏈接:http://wyb0.com/posts/docker-image-and-container 操作系...
    cws閱讀 766評論 0 0