1. 程式人生 > >Python使用Scrapy爬蟲框架爬取天涯社群小說“大宗師”全文

Python使用Scrapy爬蟲框架爬取天涯社群小說“大宗師”全文

大宗師是著名網路小說作家蛇從革的系列作品“宜昌鬼事”之一,在天涯論壇具有超級高的訪問量。這個長篇小說於2015年3月17日開篇,並於2016年12月29日大結局,期間每天有7萬多讀者閱讀。如果在天涯社群直接閱讀的話,會被很多讀者留言干擾,如圖


於是,我寫了下面的程式碼,從天涯社群該小說的第一篇開始依次爬取每一頁,提取作者“蛇從革”發過的文字並儲存成為記事本文件。當然,程式碼還可以再優化一下,例如有時候作者就發了一句話“今天沒有了”,按說這樣的話可以過濾掉,大家可以自行修改。

在執行程式碼之前,首先要正確安裝Python的爬蟲框架scrapy,這個擴充套件庫在Python 2.7.x中表現一直不錯,現在也支援Python 3.5.x以及更新版本,可以使用pip直接進行安裝,但是scrapy依賴的某些擴充套件庫對高版本Python支援並不是很好,在使用pip安裝scrapy的過程中如果某個依賴的擴充套件庫安裝失敗,可以到網上下載相應的whl檔案進行安裝,重複上面的過程,知道出現“Successfully installed...”這樣的提示。

接下來就是建立爬蟲專案了,進入命令提示符(cmd)環境,切換至Python安裝目錄的scripts目錄,執行命令scrapy startproject xiaoshuo建立爬蟲專案xiaoshuo,進入該目錄,然後編寫Python程式檔案\spiders\spiderYichangGuishi.py(內容就是下面的程式碼),然後在命令提示符環境中執行命令scrapy crawl spiderYichangGuishi,稍等大概3分鐘左右即可爬取小說全文並生成記事本文件。

當然,在編寫爬蟲程式碼之前,需要對目標網站進行分析一下,開啟要小說首頁,右鍵,單擊“檢視原始碼”,然後分析網頁結構,如圖,紅色標記處是比較重點的地方。


\spiders\spiderYichangGuishi.py程式碼如下:

import scrapy

class MySpider(scrapy.spiders.Spider):

    #爬蟲的名字,每個爬蟲必須有不同的名字

    name = 'spiderYichangGuishi'

    #要爬取的小說首頁,第一篇

    start_urls = ['http://bbs.tianya.cn/post-16-1126849-1.shtml']

    #對每個要爬取的頁面,會自動呼叫下面這個方法

    def parse(self, response):

        #用來存放當前頁中的小說正文

        content = []

        for i in response.xpath('//div'):

            #作者蛇從革的天涯賬號

            if i.xpath('@_hostid').extract()==['13357319']:

                for j in i.xpath('div//div'):

                    #提取文字

                    c = j.xpath('text()').extract()

                    #過濾干擾符號

                    g = lambda x:x.strip('\n\r\u3000').replace('<br>', '\n').replace('|', '')

                    c = '\n'.join(map(g, c)).strip()

                    content.append(c)

        with open('result.txt', 'a+', encoding='utf8') as fp:

            fp.writelines(content)

        #獲取下一頁網址並繼續爬取

        url = response.url

        d = url[url.rindex('-')+1:url.rindex('.')]

        next_url = 'http://bbs.tianya.cn/post-16-1126849-{0}.shtml'.format(int(d)+1)

        try:

            yield scrapy.Request(url=next_url, callback=self.parse)

        except:

            pass

爬取到的小說大概就是下面的樣子了



更多Python技術文章請關注微信公眾號“Python小屋”閱讀。