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

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

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

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

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

源码:

# -*- coding:utf-8 -*-

import urllib2
import urllib
import re
import thread
import chardet class Book_Spider: def __init__(self):
self.pages = []
self.page = 1
self.flag = True
self.url = "http://www.quanben.com/xiaoshuo/0/910/59302.html" # 将抓取一个章节
def GetPage(self):
myUrl = self.url
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
headers = { 'User-Agent' : user_agent }
req = urllib2.Request(myUrl, headers = headers)
myResponse = urllib2.urlopen(req)
myPage = myResponse.read() charset = chardet.detect(myPage)
charset = charset['encoding']
if charset == 'utf-8' or charset == 'UTF-8':
myPage = myPage
else:
myPage = myPage.decode('gb2312','ignore').encode('utf-8')
unicodePage = myPage.decode("utf-8") # 找出 id="content"的div标记
try:
#抓取标题
my_title = re.search('<h1>(.*? )</h1>',unicodePage,re.S)
my_title = my_title.group(1)
except:
print '标题 HTML 变化。请又一次分析!'
return False try:
#抓取章节内容
my_content = re.search('<div.*? id="htmlContent" class="contentbox">(.*?)<div',unicodePage,re.S)
my_content = my_content.group(1)
except:
print "内容 HTML 变化,请又一次分析。"
return False my_content = my_content.replace("<br />","\n")
my_content = my_content.replace(" "," ") #用字典存储一章的标题和内容
onePage = {'title':my_title,'content':my_content} try:
#找到页面下方的连接区域
foot_link = re.search('<div.*?class="chapter_Turnpage">(.*?)</div>',unicodePage,re.S)
foot_link = foot_link.group(1)
#在连接的区域找下一页的连接,依据网页特点为第三个
nextUrl = re.findall(u'<a.*?href="(.*? )".*?>(.*?)</a>',foot_link,re.S)
#文件夹链接
dir_url = nextUrl[1][0]
nextUrl = nextUrl[2][0]
# 更新下一次进行抓取的链接
self.url = nextUrl if(dir_url == nextUrl):
self.flag = False return onePage
except:
print "底部链接变化。请又一次分析!"
return False # 用于载入章节
def downloadPage(self): f_txt = open(u"斗罗大陆.txt",'w+')
while self.flag:
try:
# 获取新的页面
myPage = self.GetPage() if myPage == False:
print '抓取失败! '
self.flag = False title = myPage['title'].encode('utf-8')
content = myPage['content'].encode('utf-8') f_txt.write(title + '\n\n')
f_txt.write(content)
f_txt.write('\n\n\n') print "已下载 ",myPage['title'] except:
print '无法连接server!'
self.flag = False f_txt.close() def Start(self):
print u'開始下载......\n' self.downloadPage() print u"下载完毕" #----------- 程序的入口处 -----------
print u"""
---------------------------------------
程序:阅读呼叫转移
版本号:0.3
作者:angryrookie
日期:2014-07-08
语言:Python 2.7
功能:按下回车開始下载
---------------------------------------
""" print u'请按下回车:'
raw_input(' ')
myBook = Book_Spider()
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. sql获取的时间不能直接在c#中tostring成我们要的格式,要转化一下

    DateTime.Parse(Model.Rows[0]["datevalidbegin"].ToString()).ToString("yyyy-MM-dd" ...

  2. 洛谷P1503 鬼子进村 [平衡树,STL]

    题目传送门 鬼子进村 题目背景 小卡正在新家的客厅中看电视.电视里正在播放放了千八百次依旧重播的<亮剑>,剧中李云龙带领的独立团在一个县城遇到了一个鬼子小队,于是独立团与鬼子展开游击战. ...

  3. C# 消除累计误差的倒计时

    使用 C# 中自带的各种 timer 计时,都会有累计误差,以下代码实现了一种消除累计误差的方法,使得每次计时的误差,空值在 100 ms 以内(可以通过修改代码提升精度.) 对于精度要求在秒级别的简 ...

  4. 快速配置webpack多入口脚手架

    背景 当我们基于vue开发单个项目时,我们会init一个vue-cli,但当我们想在其他项目里共用这套模板时,就需要重新init一个,或者clone过来,这非常不方便,而且当多人开发时,我们希望所有的 ...

  5. shell 空间利用

    root #df -h / Filesystem Size Used Avail Use% Mounted on /dev/sda3 3.3G 1.7G 1.5G 54% /

  6. BeautifulSoup解析库

    解析库 解析器 使用方法 优势 劣势 Python标准库 BeautifulSoup(html, 'html.parser') 速度适中,容错能力强 老版本python容错能力差 lxml HTML解 ...

  7. BZOJ2303 APIO2011方格染色

    这题太神了 首先我们可以发现只有当i和j都是偶数时a[1][1]^a[1][j]^a[i][1]^a[i][j]=1才满足情况,其它时都为0 所以我们可以先把i和j都为偶数的地方^1变为0 下面才是最 ...

  8. [YC703]ゴミ拾い Easy

    [YC703]ゴミ拾い Easy 题目大意: 二维平面内有\(n(n\le3\times10^5)\)个人和\(n\)个物品,第\(i\)个人在\((a_i,0)\)上,第\(i\)个物品在\((x_ ...

  9. java中代码块的认知

    在以往面试题中,出现过很多次关于代码块执行顺序的题目,目前可算是搞清楚执行顺序了.看以下代码: package com.itcast.code; public class BlockTest { st ...

  10. CentOS 6.9下的iptables在本机用DNAT转发指定IP到内网IP无效的问题解决(127.0.0.1)

    比如: iptables -t nat -A OUTPUT -p tcp -d 192.168.1.0/24 --dport 2222 -j DNAT --to-destination 127.0.0 ...