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

news/2024/7/19 9:15:49 标签: python, 爬虫, javascript

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

    注意到每一个小说章节的网页以下都有下一页的链接。

通过查看网页源码。略微整理一下(  不显示了)。我们能够看到这一部分的 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 模块.


     源码:

python"># -*- 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标记
        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) nextUrl = nextUrl[2][0] # 更新下一次进行抓取的链接 self.url = nextUrl except: print "底部链接变化,请又一次分析!" return False return onePage # 用于载入章节 def LoadPage(self): while self.flag: if(len(self.pages) - self.page < 3): try: # 获取新的页面 myPage = self.GetPage() if myPage == False: print '抓取失败!' self.flag = False self.pages.append(myPage) except: print '无法连接网页。' self.flag = False #显示一章 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()


转载于:https://www.cnblogs.com/jzdwajue/p/6917689.html


http://www.niftyadmin.cn/n/820223.html

相关文章

linux c添加资源文件,linux下将资源文件编进可执行文件

有时候需要将一些图片&#xff0c; 音乐或者字符串文件随可执行文件一起打包发布。可以用objcopy命令。1. 准备资源文件文件名&#xff1a;strings.txt内容:well done!2. 准备C文件文件名: main.c内容&#xff1a;1 #include 2 void main()3 {4 char *p "well";5 p…

这家公司最懂女人,2亿女孩的秘密,都藏在这个应用里...

这是微笑哥3月给大家带来的企业故事分享。全文5600字&#xff0c;阅读请谨慎。作者 | 云游小生来源 | 纯洁的微笑转载授权&#xff08;ID:keeppuresmile&#xff09;这是一张1927年的合影&#xff0c;把这些人的名字集合在一起&#xff0c;就是如今的物理教科书。这代人往后&am…

linux编写c程序保存退出,linux中VI编写C程序。。。

在linux中编写C程序时不像编写shell那样开头要#!/bin/bash&#xff0c;但是在C程序中要指定头文件(头文件是指输入输出&#xff0c;宏等&#xff0c;而且要首先声明&#xff0c;也是必须要开始就声明的)写好C代码后要给C文件赋予可执行权限(chmod 755 xx.c)然后用gcc编译(方法…

百度偷偷干了一件事,大家都不知道....

其实百度的技术还是挺强的...1百度其实技术蛮强的这两年百度的声誉不是很好&#xff0c;但是我们仍然不能忽略百度的技术是蛮强的&#xff0c;在中国互联网中处于第一阵营。业界常常流行一句话&#xff1a;腾讯的产品、阿里的运营、百度的技术&#xff0c;可见业内对百度技术的…

linux桥接模式ping主机,ubuntu16.04配置桥接模式上网拼主机 问题解决

ubuntu16.04配置桥接模式上网拼主机 问题解决ubuntu16.04配置桥接模式上网拼主机 问题解决又是被Linux支配的一个晚上&#xff0c;道路坎坷每次从家里回到学校&#xff0c;或者学校回到家&#xff0c;前几天刚刚配置好的Linux又不能上网一、直接点击图形界面的流量信号在这个界…

javascript高级程序设计--浅析undefined与null的差别

浅析undefined与null的差别 相似处&#xff1a; 1、undefined 和 null 都是javascript 的基本数据类型。事实上两者没有太大差别。定义&#xff1a; var aundefined; var anull; nullundefined;//true2、null是一个表示"无"的对象&#xff0c;转为数值时为0&#xff…

linux系统触摸屏和鼠标cpu使用过高,linux CPU使用率过高或负载过高的处理思路

1、查看系统CPU负载及使用率的命令为&#xff1a;top vmstattop 命令&#xff1a;查看进程级别的cpu使用情况。vmstat 命令&#xff1a;查看系统级别的cpu使用情况。下面通过具体的图例来分析&#xff1a;1.1 top 命令可以查看进程的CPU、内存等资源的使用情况。在top命令运…

90亿美元!历时10年谷歌终于告赢了甲骨文,事关每个Java开发者...

本周一发生了一件大事&#xff0c;美国两大科技巨头甲骨文与谷歌的十年争斗终于有了结果。美国最高法院以6票支持2票反对&#xff0c;通过了甲骨文诉安卓系统Java源代码侵权案的裁定结果。谷歌甲骨文十年拉锯战甲骨文公司认为谷歌将 37 个 Java API 复制到了Android 中&#xf…