使用python3.6爬取笔趣阁的小说

from urllib.request import urlopen
import re
import sys
# 发现python默认的递归深度是很有限的,大概是900多的样子,当递归深度超过这个值的时候,就会引发这样的一个异常。
# 解决的方式是手工设置递归调用深度,方式为:
sys.setrecursionlimit(1000000)

class StorySpider:
    # 构造方法 运行即加载
    def getHttpResponse(self, url):
        self.url = url
        # 获取网页返回的对象并用read()方法读取成字节形的格式并解码过后为字符串型 解码需与网页编码一致
        self.httpResponse = urlopen(self.url).read().decode('gbk')
        # print(type(self.httpResponse))
        # self.mateTitle()

    # 匹配标题函数
    def mateTitle(self):
        # 用正则写出想要匹配的内容形式
        reg = '<h1>(.*?)</h1>'
        # 将正则进行编译 方便以后重复使用
        regCopile = re.compile(reg)
        # re.findall方法将正则表达式与网页返回内容进行匹配 生成一个内容列表
        # 因为每页只有一个标题 所以在后面使用直接用索引取出
        self.titleList = re.findall(regCopile, self.httpResponse)
        # self.mateContent()

    # 匹配内容函数
    def mateContent(self):
        # 用正则写出想要匹配的内容形式
        reg = '<div id="content" class="showtxt">(.*?)http'
        # 将正则进行编译 方便以后重复使用
        regCopile = re.compile(reg)
        # re.findall方法将正则表达式与网页返回内容进行匹配 生成一个内容列表
        # 因为每页只有一个标题 所以在后面使用直接用索引取出
        self.contentList = re.findall(regCopile, self.httpResponse)
        # 替换掉字符串中不想要的部分 \r\n window下的换行符
        myStr = self.contentList[0].replace('&nbsp;', '')
        self.myStr2 = myStr.replace('<br />', '\r\n')
        # self.saveFile()

    # 写入文件函数
    def saveFile(self):
        # 文件不存在则创建 存在则追加
        self.file = open('C:/Users/acer/Desktop/mySpider/story/阴长生.txt', 'ab')
        # 写入标题 在标题结尾加上换行 整理格式
        self.file.write((self.titleList[0]+'\r\n').encode('gbk'))
        # 写入内容
        self.file.write(self.myStr2.encode('gbk'))
        self.file.close()
        # self.getNextUrl()

    def getNextUrl(self):
        try:
            reg = '<a href="(.*?)">下一章</a>'
            regCopile = re.compile(reg)
            linkList = re.findall(regCopile, self.httpResponse)
        except IndexError:
            print('恭喜你,小说下载完毕')
            return
        else:
            self.link = 'http://www.biqukan.com/' + linkList[0]
            # self.getHttpResponse(self.link)
            return self.link

url = 'http://www.biqukan.com/15_15626/5374104.html'
myStorySpider = StorySpider()
num = 1
# 循环执行操作 由于内存分给程序的栈有限 可能会发生递归太过消耗资源而退出 所以不建议用递归
while True:
    try:
        if num != 1:
            link = myStorySpider.getNextUrl()
            myStorySpider = StorySpider()
        else:
            link = url
        myStorySpider.getHttpResponse(link)
        myStorySpider.mateTitle()
        myStorySpider.mateContent()
        myStorySpider.saveFile()
    except:
        print('下载成功')
        break
    num += 1




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值