Python 爬虫 之 阅读呼叫转移(二)

上一篇博客我们成功地从网页上爬下了小说的一个章节,理所当然地,接下来我们要把整本小说都爬下来。首先,我们要把程序从原来的读完一章就结束,改成读完一章之后可以继续进行下一章的阅读。

注意到每个小说章节的网页下面都有下一页的链接。通过查看网页源代码,稍微整理一下(  不显示了),我们可以看到这一部分的 HTML 是下面这种格式的:

<div id="footlink">
  <script type="text/javascript" charset="utf-8" src="/scripts/style5.js"></script>
  <a href="http://www.quanben.com/xiaoshuo/0/910/59301.html">上一页</a>    
  <a href="http://www.quanben.com/xiaoshuo/0/910/">返回目录</a>    
  <a href="http://www.quanben.com/xiaoshuo/0/910/59303.html">下一页</a>
</div>

上一页  返回目录 下一页 都在一个 id 为 footlink  的 div 中,如果想要对每个链接进行匹配的话,会抓取到网页上大量的其他链接,但是 footlink 的 div 只有一个啊!我们可以把这个 div 匹配到,抓下来,然后在这个抓下来的 div  里面再匹配 <a> 的链接,这时就只有三个了。只要取最后一个链接就是下一页的 url 的,用这个 url 更新我们抓取的目标 url ,这样就能一直抓到下一页。用户阅读逻辑为每读一个章节后,等待用户输入,如果是 quit 则退出程序,否则显示下一章。

基础知识:

上一篇的基础知识加上 Python 的 thread 模块.

源代码:

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

import urllib2
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/10/10412/2095096.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标记
        #抓取标题
        my_title = re.search('<div.*?id="title"><h1>(.*?)</h1></div>',unicodePage,re.S)
        my_title = my_title.group(1)
        #抓取章节内容
        my_content = re.search('<div.*?id="content">(.*?)</div>',unicodePage,re.S)
        my_content = my_content.group(1)
        my_content = my_content.replace("<br />","\n")
        my_content = my_content.replace(" "," ")

        #用字典存储一章的标题和内容
        onePage = {'title':my_title,'content':my_content}

        #找到页面下方的连接区域
        foot_link = re.search('<div.*?id="footlink">(.*?)</div>',unicodePage,re.S)
        foot_link = foot_link.group(1)
        #在连接的区域找下一页的连接,根据网页特点为第三个
        nextUrl = re.findall(u'<a.*?href="(.*?)">(.*?)</a>',foot_link,re.S)
        nextUrl = nextUrl[2][0]
        # 更新下一次进行抓取的链接
        self.url = nextUrl

        return onePage

    # 用于加载章节
    def LoadPage(self):
        while self.flag:
            if(len(self.pages) - self.page < 3):
                try:
                    # 获取新的页面
                    myPage = self.GetPage()
                    self.pages.append(myPage)
                except:
                    print '无法连接网页!'

    #显示一章
    def ShowPage(self,curPage):
            print curPage['title']
            print curPage['content']
            print "\n"
            user_input = raw_input("当前是第 %d 章,回车读取下一章或者输入 quit 退出:" % self.page)
            if(user_input == 'quit'):
                self.flag = False
            print "\n"

    def Start(self):
        print u'开始阅读......\n'

        # 新建一个线程
        thread.start_new_thread(self.LoadPage,())

        # 如果self的page数组中存有元素
        while self.flag:
            if self.page <= len(self.pages):
                nowPage = self.pages[self.page-1]
                self.ShowPage(nowPage)
                self.page += 1

        print u"本次阅读结束"

#----------- 程序的入口处 -----------
print u"""
---------------------------------------
   程序:阅读呼叫转移
   版本:0.2
   作者:angryrookie
   日期:2014-07-07
   语言:Python 2.7
   功能:按下回车浏览下一章节
---------------------------------------
"""

print u'请按下回车:'
raw_input(' ')
myBook = Book_Spider()
myBook.Start()

Python 爬虫 之 阅读呼叫转移(二),布布扣,bubuko.com

时间: 2024-10-23 23:18:40

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

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

你是否苦恼于网上无法下载的"小说在线阅读"内容?或是某些文章的内容让你很有收藏的冲动,却找不到一个下载的链接?是不是有种自己写个程序把全部搞定的冲动?是不是学了 python,想要找点东西大展拳脚,告诉别人"哥可是很牛逼的!"?那就让我们开始吧! 哈哈~ 好吧,我就是最近写 Yii 写多了,想找点东西调剂一下.... = = 本项目以研究为目的,所有版权问题我们都是站在作者的一边,以看盗版小说为目的的读者们请自行面壁! 说了这么多,我们要做的就是把小说正文的内容从网

Python 爬虫 之 阅读呼叫转移(三)

尽管上一篇博客中我们能够连续地阅读章节了,可是.难道每一次看小说都执行一下我们的 Python 程序?连记录看到哪里都不行,每次都是又一次来过?当然不能这样,改! 如今这么多小说阅读器,我们仅仅须要把我们要的小说抓取到本地的 txt 文件中就好了,然后自己选个阅读器看.怎么整都看你了. 事实上上个程序我们已经完毕了大部分逻辑,我们接下来的修改仅仅须要把抓取到每一章的时候不用显示出来,而是存入 txt 文件之中.另外一个是程序是不断地依据下一页的 Url 进行抓取的,那么什么时候结束呢?注意当到达

Python爬虫的法律边界(二)小爬怡情,大爬over!

数据抓取的门槛越来越低,会点程序,或使用网络工具都可以薅点数据,新入行了不少爬虫选手,但是对抓取使用数据的法律风险可能缺少认识.尤其是从去年的<网络安全法>实施开始,被新闻公开报道的相关法律诉讼已有好几起. 有人会争议互联网本质是鼓励分享,很多UGC的网站内容还是用户贡献的,网络公开数据应该都可以使用. 我也希望是这样,但现实不是这样. 所以抓取数据前你最好看下被抓对象的知识产权申明,如果你是公司职员也关心下公司让你抓取数据的用途,多少了解下潜在风险. 以下是几个典型的爬虫选手爱光顾的网站知识

python爬虫-糗百阅读器

#!/usr/bi/env python # -*- coding:utf-8 -*- import urllib import urllib2 import re class Turtle(object): def __init__(self): self.pageIndex = 1 self.stories = [] self.enable = True self.header = {'User-Agent':'Mozilla/4.0 (compatible; MSIE 5.5; Windo

Python爬虫与一汽项目【二】爬取中国东方电气集中采购平台

网站地址:https://srm.dongfang.com/bid_detail.screen 东方电气采购的页面看似很友好,实际上并不好爬取 在观察网页的审查元素之后发现,1处的网页响应只是单纯的一些js代码,并没有我们想要的数据信息,因此很明显该网页是经过js修饰的 另外再翻页时,发现该网页的url始终不变,所以这是一个以post方式提交的页面. 果断转向2出的url,点开之后可以看到, 此处有一新的url,并且请求方式的确四post方式,因此不能直接用网站地址获取我们所需的数据. 查看新的

Python爬虫学习路线,强烈建议收藏这十一条

(一)如何学习Python 学习Python大致可以分为以下几个阶段: 1.刚上手的时候肯定是先过一遍Python最基本的知识,比如说:变量.数据结构.语法等,基础过的很快,基本上1~2周时间就能过完了,我当时是在这儿看的基础:Python 简介 | 菜鸟教程 2.看完基础后,就是做一些小项目巩固基础,比方说:做一个终端计算器,如果实在找不到什么练手项目,可以在 Codecademy - learn to code, interactively, for free 上面进行练习. 如果时间充裕的

python爬虫的教程

来源:http://cuiqingcai.com/1052.html 大家好哈,我呢最近在学习Python爬虫,感觉非常有意思,真的让生活可以方便很多.学习过程中我把一些学习的笔记总结下来,还记录了一些自己实际写的一些小爬虫,在这里跟大家一同分享,希望对Python爬虫感兴趣的童鞋有帮助,如果有机会期待与大家的交流. Python版本:2.7 一.爬虫入门 1. Python爬虫入门一之综述 2. Python爬虫入门二之爬虫基础了解 3. Python爬虫入门三之Urllib库的基本使用 4.

《Python爬虫学习系列教程》学习笔记

转自:http://cuiqingcai.com/1052.html 大家好哈,我呢最近在学习Python爬虫,感觉非常有意思,真的让生活可以方便很多.学习过程中我把一些学习的笔记总结下来,还记录了一些自己实际写的一些小爬虫,在这里跟大家一同分享,希望对Python爬虫感兴趣的童鞋有帮助,如果有机会期待与大家的交流. 一.Python入门 1. Python爬虫入门一之综述 2. Python爬虫入门二之爬虫基础了解 3. Python爬虫入门三之Urllib库的基本使用 4. Python爬虫

Python爬虫学习系列教程

Python爬虫学习系列教程 大家好哈,我呢最近在学习Python爬虫,感觉非常有意思,真的让生活可以方便很多.学习过程中我把一些学习的笔记总结下来,还记录了一些自己实际写的一些小爬虫,在这里跟大家一同分享,希望对Python爬虫感兴趣的童鞋有帮助,如果有机会期待与大家的交流. Python版本:2.7 一.爬虫入门 1. Python爬虫入门一之综述 2. Python爬虫入门二之爬虫基础了解 3. Python爬虫入门三之Urllib库的基本使用 4. Python爬虫入门四之Urllib库