1. 程式人生 > >Python用面向物件的方式爬取小說

Python用面向物件的方式爬取小說

這裡以爬取小說《夢裡花落知多少為例》

昨天幫同學爬的一部小說,現在把程式碼放在部落格上希望也能幫到其他人
# -*- coding:utf-8 -*-
# @time:  2018/11/25 22:28
# @Author: cen


import requests, re
from bs4 import BeautifulSoup



class NovelSpider:
    '''這是個爬取夢裡花落知多少小說的類'''
    def __init__(self):
        self.index_url = 'http://www.xiaoshuo77.com/view/38/38672/'  # 小說主頁
        # 請求頭,模擬瀏覽器登陸網站
        self.headers = {
            'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'
        }

    def GetUrlList(self, html):
        '''這是一個構造url列表的函式'''
        # 小說主頁裡每個章節對應著每節的url,把這些章節的url存放到一個列表中
        reg = '<dd><a href="(.*?)">(.*?)</a></dd>'
        hrefs = re.findall(reg, html)  # 用正則表示式匹配小說每節的標題和url,
        url_list = []  # 先建立一個空列表
        for href in  hrefs:
            url_list.append(href)  # 利用for迴圈把每節標題和url依次存放在列表中
        return url_list  # 函式最後返回一個url列表

    def GetHtml(self, url):
        '''這是一個獲取url的html頁面內容的函式'''
        # 這裡直接返回html頁面內容,網頁的編碼格式是gbk,所以我們解碼也應使用gbk
        return requests.get(url, headers=self.headers).content.decode('gbk')

    # 主函式
    def main(self):
        html = self.GetHtml(self.index_url)  # 呼叫GetHtml函式並賦給變數html,從而獲取小說主頁頁面內容
        url_list = self.GetUrlList(html)  # 將頁面內容html傳給函式GetUrlList,函式執行即生成的url列表存放在url_list這個變數中
        # 因為url_list中每個元素是一個元祖,像這樣('/view/38/38672/10577600.html', '文學小青年')
        for url in url_list:  # 用for迴圈遍歷列表,得到一個個元組
            title = url[1]  # 標題在元組第二個位置,url在第一個位置
            # 因為得到的url並不是完整的,所以我們要拼接成完整的url
            full_url = "http://www.xiaoshuo77.com" + url[0]
            # print(title, full_url)  # 這裡是列印一下標題和url,看下效果
            novel_html = self.GetHtml(full_url)  # 這裡是獲取小說的章節頁面內容
            soup = BeautifulSoup(novel_html, 'html.parser')  # 用BeautifulSoup解析頁面
            content = soup.find(id='content').getText()  # 找到小說內容位置,獲取小說文字

            # 儲存
            print('正在儲存...%s' % title)
            with open('《夢裡花落知多少》全集.doc', 'a', encoding='utf-8') as f:
                f.write(title + content + '\n\n')

if __name__ == '__main__':
    novel_spider = NovelSpider()  # 例項化類為一個物件
    novel_spider.main()  # 執行主函式