尽管上一篇博客中我们能够连续地阅读章节了,可是。难道每一次看小说都执行一下我们的 Python 程序?连记录看到哪里都不行,每次都是又一次来过?当然不能这样,改!

如今这么多小说阅读器,我们仅仅须要把我们要的小说抓取到本地的 txt 文件中就好了,然后自己选个阅读器看。怎么整都看你了。

事实上上个程序我们已经完毕了大部分逻辑,我们接下来的修改仅仅须要把抓取到每一章的时候不用显示出来,而是存入 txt 文件之中。另外一个是程序是不断地依据下一页的 Url 进行抓取的,那么什么时候结束呢?注意当到达小说的最后一章时下一页的链接是和返回文件夹的链接是一样的。所以我们抓取一个网页的时候就把这两个链接拿出来,仅仅要出现两个链接一样的时候。就停止抓取。最后就是我们这个程序不须要多线程了,我们仅仅要一个不断在抓取小说页面的线程即可了。

只是,小说章节多一点时候,等待完毕的时间会有点久。眼下就不考虑这么多了,基本功能完毕就 OK....

基础知识:前面的基础知识 - 多线程知识 + 文件操作知识。

源码:

  1. # -*- coding:utf-8 -*-
  2.  
  3. import urllib2
  4. import urllib
  5. import re
  6. import thread
  7. import chardet
  8.  
  9. class Book_Spider:
  10.  
  11. def __init__(self):
  12. self.pages = []
  13. self.page = 1
  14. self.flag = True
  15. self.url = "http://www.quanben.com/xiaoshuo/0/910/59302.html"
  16.  
  17. # 将抓取一个章节
  18. def GetPage(self):
  19. myUrl = self.url
  20. user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
  21. headers = { 'User-Agent' : user_agent }
  22. req = urllib2.Request(myUrl, headers = headers)
  23. myResponse = urllib2.urlopen(req)
  24. myPage = myResponse.read()
  25.  
  26. charset = chardet.detect(myPage)
  27. charset = charset['encoding']
  28. if charset == 'utf-8' or charset == 'UTF-8':
  29. myPage = myPage
  30. else:
  31. myPage = myPage.decode('gb2312','ignore').encode('utf-8')
  32. unicodePage = myPage.decode("utf-8")
  33.  
  34. # 找出 id="content"的div标记
  35. try:
  36. #抓取标题
  37. my_title = re.search('<h1>(.*?
  38.  
  39. )</h1>',unicodePage,re.S)
  40. my_title = my_title.group(1)
  41. except:
  42. print '标题 HTML 变化。请又一次分析!'
  43. return False
  44.  
  45. try:
  46. #抓取章节内容
  47. my_content = re.search('<div.*?
  48.  
  49. id="htmlContent" class="contentbox">(.*?)<div',unicodePage,re.S)
  50. my_content = my_content.group(1)
  51. except:
  52. print "内容 HTML 变化,请又一次分析。"
  53. return False
  54.  
  55. my_content = my_content.replace("<br />","\n")
  56. my_content = my_content.replace(" "," ")
  57.  
  58. #用字典存储一章的标题和内容
  59. onePage = {'title':my_title,'content':my_content}
  60.  
  61. try:
  62. #找到页面下方的连接区域
  63. foot_link = re.search('<div.*?class="chapter_Turnpage">(.*?)</div>',unicodePage,re.S)
  64. foot_link = foot_link.group(1)
  65. #在连接的区域找下一页的连接,依据网页特点为第三个
  66. nextUrl = re.findall(u'<a.*?href="(.*?
  67.  
  68. )".*?>(.*?)</a>',foot_link,re.S)
  69. #文件夹链接
  70. dir_url = nextUrl[1][0]
  71. nextUrl = nextUrl[2][0]
  72. # 更新下一次进行抓取的链接
  73. self.url = nextUrl
  74.  
  75. if(dir_url == nextUrl):
  76. self.flag = False
  77.  
  78. return onePage
  79. except:
  80. print "底部链接变化。请又一次分析!"
  81. return False
  82.  
  83. # 用于载入章节
  84. def downloadPage(self):
  85.  
  86. f_txt = open(u"斗罗大陆.txt",'w+')
  87. while self.flag:
  88. try:
  89. # 获取新的页面
  90. myPage = self.GetPage()
  91.  
  92. if myPage == False:
  93. print '抓取失败!
  94.  
  95. '
  96. self.flag = False
  97.  
  98. title = myPage['title'].encode('utf-8')
  99. content = myPage['content'].encode('utf-8')
  100.  
  101. f_txt.write(title + '\n\n')
  102. f_txt.write(content)
  103. f_txt.write('\n\n\n')
  104.  
  105. print "已下载 ",myPage['title']
  106.  
  107. except:
  108. print '无法连接server!'
  109. self.flag = False
  110.  
  111. f_txt.close()
  112.  
  113. def Start(self):
  114. print u'開始下载......\n'
  115.  
  116. self.downloadPage()
  117.  
  118. print u"下载完毕"
  119.  
  120. #----------- 程序的入口处 -----------
  121. print u"""
  122. ---------------------------------------
  123. 程序:阅读呼叫转移
  124. 版本号:0.3
  125. 作者:angryrookie
  126. 日期:2014-07-08
  127. 语言:Python 2.7
  128. 功能:按下回车開始下载
  129. ---------------------------------------
  130. """
  131.  
  132. print u'请按下回车:'
  133. raw_input(' ')
  134. myBook = Book_Spider()
  135. myBook.Start()

效果见图:

Python 爬虫 之 阅读呼叫转移(三)的更多相关文章

  1. Python 爬虫 之 阅读呼叫转移(一)

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/jcjc918/article/details/37533073     你是否苦恼于网上无法下载的& ...

  2. Python爬虫框架Scrapy实例(三)数据存储到MongoDB

    Python爬虫框架Scrapy实例(三)数据存储到MongoDB任务目标:爬取豆瓣电影top250,将数据存储到MongoDB中. items.py文件复制代码# -*- coding: utf-8 ...

  3. python爬虫之urllib库(三)

    python爬虫之urllib库(三) urllib库 访问网页都是通过HTTP协议进行的,而HTTP协议是一种无状态的协议,即记不住来者何人.举个栗子,天猫上买东西,需要先登录天猫账号进入主页,再去 ...

  4. Python爬虫学习笔记——豆瓣登陆(三)

    之前是不会想到登陆一个豆瓣会需要写三次博客,修改三次代码的. 本来昨天上午之前的代码用的挺好的,下午时候,我重新注册了一个号,怕豆瓣大号被封,想用小号爬,然后就开始出问题了,发现无法模拟登陆豆瓣了,开 ...

  5. python爬虫解析页面数据的三种方式

    re模块 re.S表示匹配单行 re.M表示匹配多行 使用re模块提取图片url,下载所有糗事百科中的图片 普通版 import requests import re import os if not ...

  6. python爬虫-提取网页数据的三种武器

    常用的提取网页数据的工具有三种xpath.css选择器.正则表达式 1.xpath 1.1在python中使用xpath必须要下载lxml模块: lxml官方文档 :https://lxml.de/i ...

  7. Python爬虫与一汽项目【三】爬取中国五矿集团采购平台

    网站地址:http://ec.mcc.com.cn/b2b/web/two/indexinfoAction.do?actionType=showMoreCgxx&xxposition=cgxx ...

  8. Python 爬虫js加密破解(三) 百度翻译 sign

    第一步: 模拟抓包分析加密参数 第二步: 找到加密字段 调试出来的sign和抓取得到的数据一致,都是 275626.55195 第三部: 分析js加密方法 第四部:运行js代码: 仅供交流学习使用

  9. Python爬虫个人记录(三)爬取妹子图

    这此教程可能会比较简洁,具体细节可参考我的第一篇教程: Python爬虫个人记录(一)豆瓣250 Python爬虫个人记录(二)fishc爬虫 一.目的分析 获取煎蛋妹子图并下载 http://jan ...

随机推荐

  1. 洛谷P3459 [POI2007]MEG-Megalopolis [树链剖分]

    题目传送门 MEG 题目描述 Byteotia has been eventually touched by globalisation, and so has Byteasar the Postma ...

  2. scrapy抓取拉勾网职位信息(八)——使用scrapyd对爬虫进行部署

    上篇我们实现了分布式爬取,本篇来说下爬虫的部署. 分析:我们上节实现的分布式爬虫,需要把爬虫打包,上传到每个远程主机,然后解压后执行爬虫程序.这样做运行爬虫也可以,只不过如果以后爬虫有修改,需要重新修 ...

  3. 第10天-JavaScript正则表达式

    正则有什么用 给定的字符串是否符合正则表达式的过滤逻辑 通过正则表达式,从字符串中获取我们想要的特定部分 替换字符串满足正则表达式的字符 例如:验证邮箱.手机号.银行卡.采集器(爬虫).中奖信息133 ...

  4. 外行人都能看懂的SpringCloud

    一.前言 只有光头才能变强 认识我的朋友可能都知道我这阵子去实习啦,去的公司说是用SpringCloud(但我觉得使用的力度并不大啊~~)... 所以,这篇主要来讲讲SpringCloud的一些基础的 ...

  5. Kail Linux渗透测试教程之在Metasploit中扫描

    Kail Linux渗透测试教程之在Metasploit中扫描 在Metasploit中扫描 在Metasploit中,附带了大量的内置扫描器.使用这些扫描器可以搜索并获得来自一台计算机或一个完整网络 ...

  6. Netstat -tln 命令是Linux查看端口使用情况

    Netstat -tln 命令是Linux查看端口使用情况

  7. 初涉springboot(二)

    概述 1.环境说明 2.HelloWorld项目细节   3.小结 一. 关于环境补充 在上一篇的HellWorld项目中,我们构建SpringBoot项目,采用的是jdk1.8版本,springbo ...

  8. bzoj4034 树上操作

    Description 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子树中 ...

  9. VK Cup 2016 - Qualification Round 2 B. Making Genome in Berland 水题

    B. Making Genome in Berland 题目连接: http://www.codeforces.com/contest/638/problem/B Description Berlan ...

  10. MySQL的max_user_connections拒绝连接的一次踩雷经验

    近期线上的数据遇到一个问题,最终原因为max_user_connections和max_connections的一个bug导致,具体过程如下 现象 前端页面不断的出现错误页面. 排查处理过程 按照数据 ...