1 #! /bin/python
  2 # -*- coding:utf-8 -*-
  3
  4 # --------------------------------------------
  5 #     程序:【23hh小说网】爬虫
  6 #     版本:0.2
  7 #     作者:Silence
  8 #     日期:2014-04-01
  9 #     操作:输入quit
 10 #     功能:提供一个目录页,把这个小说的全部章节都抓取下来
 11 # ---------------------------------------------
 12 import urllib2
 13 import re
 14 import os
 15
 16 class Novel_Tool:
 17
 18     def __init__(self,weburl):
 19         self.url = weburl
 20         self.headers = {
 21             'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'
 22         }
 23
 24         self.pagesInfo = {}
 25
 26     #获取当前页面的编码格式,现在某些小说网喜欢用gbk来编码
 27     # 但是,也有一些不厚道的网站,他们的实际编码格式不是在页面中charset中定义的格式,暂时先忽略了
 28     def getPageType(self,content):
 29         pattern = re.compile('charset=.*?"')
 30         pagetype = pattern.search(content).group()
 31         pagetype = pagetype[8:len(pagetype) - 1]
 32         return pagetype
 33
 34     def start(self):
 35         # 得到utf-8编码的小说返回文本
 36         req = urllib2.Request(
 37             url = self.url,
 38             headers = self.headers
 39         )
 40         myResponse = urllib2.urlopen(req).read()
 41         # print myResponse
 42         decodeResp = myResponse.decode(self.getPageType(myResponse)).encode('utf-8')
 43
 44         pagesInfo = self.getAllUrlsAndNames(decodeResp)
 45         # index = 1
 46         for index,pageInfo in pagesInfo.items():
 47             # print page
 48             print '正在爬第%d个页面……'%index
 49             req = urllib2.Request(
 50                 url = pageInfo['pageurl'],
 51                 headers = self.headers
 52                 )
 53             print pageInfo['pageurl']
 54             pageResponse = urllib2.urlopen(req).read()
 55             decodePageResp = pageResponse.decode(self.getPageType(pageResponse)).encode('utf-8')
 56             pageContent = self.getPageContent(decodePageResp)
 57             self.writeToFile(pageContent,pageInfo['pagename'])
 58
 59     def writeToFile(self,content,filename):
 60         if os.path.exists(os.getcwd() + '/Nodels'):
 61             if not os.path.isdir(os.getcwd() + '/Nodels'):
 62                 os.rename('Nodels','Nodels.bak')
 63                 os.mkdir(os.getcwd() + '/Nodels')
 64         else:
 65             os.mkdir(os.getcwd() + '/Nodels')
 66
 67         ofile = open(os.getcwd() + '/Nodels/' + filename,'w')
 68         print os.getcwd() + '/Nodels/' + filename
 69         try:
 70             ofile.write(content)
 71         except Exception, e:
 72             print '存储网页',filename,'出错!'
 73         finally:
 74             ofile.close()
 75
 76     def getPageContent(self,content):
 77         contentPattern = re.compile('(<dd id="contents">)((.|\s)*?)(</dd>)')
 78         content = contentPattern.search(content).group(2)
 79         content = self.replaceWebTag(content)
 80         return content
 81
 82     # 获取下一页的地址
 83     def getNextPage(self,content):
 84         # 先获取到下一页的位置
 85         footlinkRex = re.compile('(footlink">)(.*?)</dd>')
 86         foot = footlinkRex.search(content).group(2)
 87         pattern = re.compile(r'(返回目录.*?(<a.*?">下一页))')
 88         m = pattern.search(foot).groups()
 89         nextUrl = m[len(m)-1][9:m[len(m)-1].find('">')]
 90
 91         return self.url[0:self.url.rfind('/')+1] + nextUrl
 92
 93     def getAllUrlsAndNames(self,content):
 94         print '正在分析目录页面,请稍后…………'
 95         pageRex = re.compile('<a href=".*?</td>') #定义获取所有章节页面链接的正则
 96         pageUrlRex = re.compile('".*?"')    #获取章节url的正则
 97         pageNameRex = re.compile('>.*?<')    #获取章节名字的正则
 98
 99         pages = pageRex.findall(content)
100         index = 1
101         for page in pages:
102             pageurl = pageUrlRex.search(page).group()
103             pageurl = pageurl[1:len(pageurl) - 1]
104             pageurl = self.url + pageurl
105
106             pagename = pageNameRex.search(page).group()
107             pagename = pagename[1:len(pagename) - 1]
108
109             # print pagename + '     ' + pageurl
110             self.pagesInfo[index] = {
111                 'pagename' : pagename,
112                 'pageurl' : pageurl
113             }
114             index = index + 1
115         print '目录页分析完成!该小说共有%d个章节'%index
116         return self.pagesInfo
117
118
119     def getNovelName(self,content):
120         titleRex = re.compile('<h1>.*?</h1>')
121         title = titleRex.search(content).group()
122         return title[4:len(title) - 5]
123
124     def replaceWebTag(self,content):
125         charToNoneRex = re.compile(r'&nbsp;')
126         charToNewLineRex = re.compile("<br />|<br>|<br/>")
127
128         content = charToNoneRex.sub("",content)
129         content = charToNewLineRex.sub("\n",content)
130         return content
131
132 if __name__ == '__main__':
133     print u"""
134     # --------------------------------------------
135     #     程序:【23hh小说网】爬虫
136     #     版本:0.2
137     #     作者:Silence
138     #     日期:2014-04-01
139     #     操作:启动后输入要爬得小说目录页地址,就可以自动爬了
140     #     功能:提供一个目录页,把目录页中所有的目录章节都抓出来(默认是:23hh的争霸天下),
141     #         分章节保存在启动脚本目录下的Novels目录下;如果该目录下已经有一个Novels,则把这个Novels改名为Novels.bak
142     # ---------------------------------------------"""
143
144     myinput = raw_input('请输入要爬的小说目录页面地址(默认是:23hh的争霸天下)\n')
145     if myinput == '':
146         myinput = 'http://www.23hh.com/book/43/43957/'
147     nodel = Novel_Tool(myinput)
148     nodel.start()

周末自己看小说,发现现在的网页上,一次请求回来的东西有很多无用的js和广告,速度也非常非常的慢;

于是自己就弄了这个一个爬虫,把所有小说章节从网页上爬下来。

看小说到我这种程度,算是苦逼了

转载于:https://www.cnblogs.com/SilenceCity/p/3640395.html

23hh小说网——爬虫python相关推荐

  1. 23hh小说网——爬虫1.0python

    修改点: 1. decode('gbk')修改为decode('gbk','replace'),在遇到不能识别的字符时直接用?替换 2. 将原来的单线程变为多线程,现在处理速度快了好多 1 #! /b ...

  2. python 小说cms系统_「博文小说网」Python爬虫爬取小说网站 - seo实验室

    博文小说网 #!/usr/bin/env Python # -*- coding: utf-8 -*- # @Author : Woolei # @File : book136_singleproce ...

  3. python爬虫17K小说网资料

    python爬虫17K小说网资料 爬虫作业要求:抓取小说网站为例,必须抓取一系列小说(不是一部小说)的篇名.作者.出版单位(或首发网站).出版时间(或网上发布时间).内容简介.小说封面图画.价格.读者 ...

  4. Python爬虫期末作业 | 爬取起点小说网作者和书名,并以Excel形式存储

    使用Python爬虫技术爬取起点小说网作者及书名,并且以xlsx形式保存 前言 随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容. 一. ...

  5. python爬虫三大解析数据方法:bs4 及爬小说网案例

    bs4 python独有可以将html文档转成bs对象,可以直接调用bs对象的属性进行解析 安装 pip install bs4 本地html Beautiful("open('路径')&q ...

  6. python爬虫简单实例-爬取17K小说网小说

    什么是网络爬虫? 网络爬虫(Web Spider),又被称为网页蜘蛛,是一种按照一定的规则,自动地抓取网站信息的程序或者脚本. 爬虫流程 先由urllib的request打开Url得到网页html文档 ...

  7. python爬上去飞卢_pyhon3爬虫爬取飞卢小说网小说

    想看小说,不想看花里胡哨的网页,想着爬下来存个txt,顺便练习一下爬虫. 随便先找了个看起来格式比较好的小说网站<飞卢小说网>做练习样本,顺便记录一下练习成果. ps:未登录,不能爬取VI ...

  8. python爬虫(16)使用scrapy框架爬取顶点小说网

    本文以scrapy 框架来爬取整个顶点小说网的小说 1.scrapy的安装 这个安装教程,网上有很多的例子,这里就不在赘述了 2.关于scrapy scrapy框架 是一个非常好的东西,能够实现异步爬 ...

  9. Python爬虫,爬取百度小说网评论

    #网址如下 #https://yuedu.baidu.com/ebook/0ab2967333687e21ae45a937###import requests import time import x ...

最新文章

  1. Android 虚线实现绘制 - DashPathEffect
  2. 解决Windows与虚拟机ubuntu之间相互直接拖动文件
  3. jQuery元素过滤
  4. JavaScript实现binarySearch二分查找算法(附完整源码)
  5. Nginx安装及配置简介
  6. [tf] tf.gradients vs optimizer.compute_gradients
  7. Android 十年,Google 用 AI 为它画了个句号
  8. word加水印铺满java,Word 2010文档中让水印铺满整个页面的设置方法
  9. 设计模式之笔记--建造者模式(Builder)
  10. 西安交大王之坤摘得金奖桂冠,浙大团体第一,1016名高手同台竞技CCSP2020
  11. 实用小技能 | 用 Word 和 Excel 自制一个题库自判断答题系统!
  12. 微信支付 签名错误 uniapp
  13. 【GNN报告】复旦大学许嘉蓉:基于图数据的鲁棒机器学习
  14. FX5u plc 如何实现网络远程通讯
  15. iPhone X搭载3D感测功能,VCSEL是个什么鬼?
  16. Cadence通孔焊盘制作
  17. 关于举办“2021全国高校计算机视觉实战暑期教师研修班”的通知
  18. 机器学习:使用scikit-learn的线性回归预测Google股票
  19. UG NX 12 鼠标操作
  20. 普通人的2022春招总结(阿里、腾讯offer)

热门文章

  1. ACdream1735 输油管道
  2. 我的世界java额外参数_我的世界超平坦自定义部分参数
  3. 《Python编程无师自通》挑战练习答案
  4. HDFS 分布式文件系统架构原理
  5. android path 画星星
  6. matlab heart scale,matlab下libsvm测试heart_scale的问题
  7. Elementui NavMenu 导航菜单使用
  8. 面试管:Zookeeper在项目的典型应用场景请你回答一下
  9. 拉勾网数据处理与分析
  10. Es检索 must与filter区别