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


    版权声明:本文为博主原创文章。未经博主同意不得转载。

    https://blog.csdn.net/jcjc918/article/details/37533073

        你是否苦恼于网上无法下载的“小说在线阅读”内容?或是某些文章的内容让你非常有收藏的冲动,却找不到一个下载的链接?是不是有种自己写个程序把全部搞定的冲动?是不是学了 python。想要找点东西大展拳脚,告诉别人“哥但是非常牛逼的!

    ”?那就让我们開始吧。 哈哈~

        好吧。我就是近期写 Yii 写多了,想找点东西调剂一下.... = =


        本项目以研究为目的,全部版权问题我们都是站在作者的一边,以看盗版小说为目的的读者们请自行面壁!

        说了这么多,我们要做的就是把小说正文的内容从网页上爬下来,我们的研究对象是全本小说网....再次声明。不正确不论什么版权负责....

        一開始先做最基础的内容,就是把某一章的内容抓取下来。


        环境:Ubuntu, Python 2.7


        基础知识

        这个程序涉及到的知识点有几个,在这里列出来,不具体讲。有疑问的直接百度会有一堆的。

        1.urllib2 模块的 request 对像来设置 HTTP 请求,包括抓取的 url,和伪装浏览器的代理。

    然后就是 urlopen 和 read 方法,都非常好理解。

        2.chardet 模块,用于检測网页的编码。

    在网页上抓取数据非常easy遇到乱码的问题,为了推断网页是 gtk 编码还是 utf-8 。所以用 chardet 的 detect 函数进行检測。在用 Windows 的同学能够在这里 http://download.csdn.net/detail/jcjc918/8231371 下载。解压到 python 的 lib 文件夹下就好。

        3. decode 函数将字符串从某种编码转为 unicode 字符,而 encode 把 unicode 字符转为指定编码格式的字符串。

         4. re 模块正則表達式的应用。search 函数能够找到和正則表達式相应匹配的一项。而 replace 则是把匹配到的字符串替换。


        思路分析

        我们选取的 url 是 http://www.quanben.com/xiaoshuo/0/910/59302.html。斗罗大陆的第一章。你能够查看网页的源码,会发现仅仅有一个 content 标签包括了全部章节的内容,所以能够用正则把 content 的标签匹配到,抓取下来。试着把这一部分内容打印出来,会发现非常多 <br /> 和 &nbsp。<br /> 要替换成换行符, &nbsp 是网页中的占位符。即空格,替换成空格就好。这样一章的内容就非常美观的出来了。完整起见,相同用正则把标题爬下来。

    # -*- coding: utf-8 -*-
    
    import urllib2
    import re
    import chardet
    
    
    class Book_Spider:
    
        def __init__(self):
            self.pages = []
    
        # 抓取一个章节
        def GetPage(self):
            myUrl = "http://www.quanben.com/xiaoshuo/0/910/59302.html";
            user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
            headers = { 'User-Agent' : user_agent }
            request = urllib2.Request(myUrl, headers = headers)
            myResponse = urllib2.urlopen(request)
            myPage = myResponse.read()
    
            #先检測网页的字符编码,最后统一转为 utf-8
            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")
    
            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 />"," ") my_content = my_content.replace(" "," ") #用字典存储一章的标题和内容 onePage = {'title':my_title,'content':my_content} return onePage # 用于载入章节 def LoadPage(self): try: # 获取新的章节 myPage = self.GetPage() if myPage == False: print '抓取失败!' return False self.pages.append(myPage) except: print '无法连接server。' #显示一章 def ShowPage(self,curPage): print curPage['title'] print curPage['content'] def Start(self): print u'開始阅读...... ' #把这一页载入进来 self.LoadPage() # 假设self的pages数组中存有元素 if self.pages: nowPage = self.pages[0] self.ShowPage(nowPage) #----------- 程序的入口处 ----------- print u""" --------------------------------------- 程序:阅读呼叫转移 版本号:0.1 作者:angryrookie 日期:2014-07-05 语言:Python 2.7 功能:按下回车浏览章节 --------------------------------------- """ print u'请按下回车:' raw_input() myBook = Book_Spider() myBook.Start()


    程序执行完在我这里但是非常好看的,不信请看:^_^


  • 相关阅读:
    任意用户密码重置漏洞
    0基础入门学习Python(第4章)
    dpwwn:2 Vulnhub Walkthrough
    The Library:2 Vulnhub Walkthrough
    WestWild: 1.1: Vulnhub Walkthorugh
    Canvas---折线图---绘制网格
    Canvas---绘制一个由黑到白渐变的矩形
    Canvas---绘制虚线
    Canvas---和线相关的属性和方法
    Canvas---绘制一个镂空正方形
  • 原文地址:https://www.cnblogs.com/mqxnongmin/p/10789763.html
Copyright © 2020-2023  润新知