首页 > 代码库 > Python 爬虫 之 阅读呼叫转移(三)

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

    虽然上一篇博客中我们可以连续地阅读章节了,但是,难道每一次看小说都运行一下我们的 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标记
        #抓取标题
        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=http://www.mamicode.com/"(.*?)">(.*?)',foot_link,re.S)>
    效果见图: