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(' ', '') 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