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()  # 执行主函数

猜你喜欢

转载自blog.csdn.net/qq_42899028/article/details/84542256