这个是学爬虫时的练习。

例子上面的用起来不太爽,就自己稍微改了下,练手用

  1 # -*- coding:utf-8 -*-
  2 # --------------------------------------------
  3 #     程序:【糗百最热】爬虫
  4 #     版本:0.1
  5 #     作者:Silence
  6 #     日期:2014-03-25
  7 #     操作:输入quit退出
  8 #     功能:运行后按Enter键可以浏览今天的糗百热点
  9 # ---------------------------------------------
 10
 11 import urllib
 12 import urllib2
 13 import re
 14 import thread
 15 import time
 16
 17 class HTML_Tool:
 18     """定义一个工具类来处理页面上的各种标签"""
 19
 20     # 用 非贪婪模式匹配 \t 或者 \n 或者 空格 或者 超链接 或者 图片
 21     bgnCharToNoneRex = re.compile("(\t|\n| |<a.*?>|<img.*?>)")
 22
 23     # 用 非贪婪模式 匹配任意的 <>标签
 24     endCharToNoneRex = re.compile("<.*?>")
 25
 26     # 用 非贪婪模式 匹配任意的<p>标签
 27     bgnPartRex = re.compile("<p.*?>")
 28     charToNewLineRex = re.compile("(<br/>|</p>|<tr>|<div>|</div>)")
 29     charToNewTabRex = re.compile("<td>")
 30
 31     # 将一些html的符号转变为原始符号
 32     replaceTab = [("<","<"),(">",">"),("&","&"),("&","\""),(" "," ")]
 33
 34     def replace_Char(self,content):
 35         content = self.bgnCharToNoneRex.sub("",content)
 36         content = self.bgnPartRex.sub("\n     ",content)
 37         content = self.charToNewLineRex.sub("\n",content)
 38         content = self.charToNewTabRex.sub("\t",content)
 39         content = self.endCharToNoneRex.sub("",content)
 40
 41         for rt in self.replaceTab:
 42             content = content.replace(rt[0],rt[1])
 43         return content
 44
 45 class QiuBai_Model:
 46     """docstring for QiuBai_Model"""
 47     def __init__(self):
 48         self.page = 1
 49         self.pages = []
 50         self.myTool = HTML_Tool()
 51         self.enable = False
 52
 53     def getPage(self,page):
 54         myurl = "http://m.qiushibaike.com/hot/page/" + page
 55
 56         #糗百现在加了过滤规则,不允许直接抓包了,所以这里伪造为一个浏览器请求
 57         headers = {
 58             'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'
 59         }
 60         req = urllib2.Request(
 61             url = myurl,
 62             headers = headers
 63         )
 64         myResponse = urllib2.urlopen(req)
 65         myPage = myResponse.read()
 66         # python中默认的编码是unicode编码
 67         # String的encode是把unicode编码转换为其他编码的字符
 68         # decode是把其他编码字符转换为unicode编码
 69         unicodePage = myPage.decode("utf-8")
 70
 71         # 先找出所有包含新鲜事的结构
 72         # 糗百页面中,所有新鲜事都写在形如<div class="content" title="">
 73         # 这里使用正则
 74         myItems = re.findall('<div.*?class="content".*?title="(.*?)">(.*?)</div>',unicodePage,re.S)
 75         items = []
 76         for item in myItems:
 77             # 糗百中一个<div>标题时间;内容</div>
 78             items.append([item[0].replace("\n",""),item[1].replace("\n","")])
 79         return items
 80
 81     # 加载新的段子
 82     def loadPage(self):
 83         # 如果用户没有输入quit就一直运行
 84         while self.enable:
 85             # 如果pages数组中的内容小于两个就获取新页面中的段子
 86             if len(self.pages) < 2:
 87                 try:
 88                     myPage = self.getPage(str(self.page))
 89                     self.page += 1
 90                     self.pages.append(myPage)
 91                 except:
 92                     print '无法链接糗事百科!'
 93                 else:
 94                     time.sleep(1)
 95
 96     def showPage(self,pageNum,page):
 97         for items in pageNum:
 98             print u"第%d页"%page, items[0]
 99             print self.myTool.replace_Char(items[1])
100
101
102     def start(self):
103         self.enable = True
104         page = self.page
105
106         print u'正在加载中,请稍后…………'
107
108         # 新启动一个线程,在后台进行加载,并存储
109         thread.start_new_thread(self.loadPage,())
110
111         while self.enable:
112             if self.pages:
113                 currentPage = self.pages[0]
114                 del self.pages[0]
115
116                 # 原来每显示一个就得按一次enter,太繁琐了,现在一次显示一页,瞬间高大上有木有
117                 self.showPage(currentPage,page)
118                 page += 1
119
120                 myinput = raw_input('是否继续下一页?请按Enter键\n')
121                 if myinput == "quit":
122                     print '您本次观看到第 %d 页,欢迎下次再来!'%page
123                     self.enable = False
124                     break
125
126 if __name__ == '__main__':
127     print u"""
128 --------------------------------------------
129      程序:【糗百最热】爬虫
130      版本:0.1
131      作者:Silence
132      日期:2014-03-25
133      操作:运行后输入enter,一次可以显示一页,输入quit退出
134      功能:就是看糗百最热栏的内容,由于现在还是爬虫爬的文字,所以,没有图片看了
135 ---------------------------------------------
136     """
137     raw_input('请输入Enter键,精彩的糗百内容即将展示\n')
138     qiubai = QiuBai_Model()
139     qiubai.start()

转载于:https://www.cnblogs.com/SilenceCity/p/3639493.html

糗百新鲜事——爬虫python相关推荐

  1. python好学嘛-爬虫Python入门好学吗?学什么?

    爬虫Python入门好学吗?学爬虫需要具备一定的基础,有编程基础学Python爬虫更容易学.但要多看多练,有自己的逻辑想法.用Python达到自己的学习目的才算有价值.如果是入门学习了解,开始学习不难 ...

  2. 爬虫python是干什么的_爬虫是什么?能自学嘛

    1.爬虫是什么 网络爬虫(web crawler 简称爬虫)就是按照一定规则从互联网上抓取信息的程序,既然是程序那和正常用户访问页面有何区别?爬虫与用户正常访问信息的区别就在于:用户是缓慢.少量的获取 ...

  3. python是什么意思中文、好学吗-爬虫Python入门好学吗?学什么?

    爬虫Python入门好学吗?学爬虫需要具备一定的基础,有编程基础学Python爬虫更容易学.但要多看多练,有自己的逻辑想法.用Python达到自己的学习目的才算有价值.如果是入门学习了解,开始学习不难 ...

  4. Python爬虫 | Python爬虫获取女友图片

    Python爬虫 | Python爬虫获取女友图片 前言 程序说明 二次元女友获取程序 观察网页结构 页面解析 创建图片保存路径 图片下载 格式转换 爬取结果展示 完整程序 前言 (又到了常见的无中生 ...

  5. python爬虫有多少种方式_python爬虫-----Python访问http的几种方式

    爬取页面数据,我们需要访问页面,发送http请求,以下内容就是Python发送请求的几种简单方式: 会使用到的库  urllib   requests 1.urlopen import urllib. ...

  6. 爬虫Python入门好学吗

    爬虫Python入门好学吗?学爬虫需要具备一定的基础,有编程基础学Python爬虫更容易学.但要多看多练,有自己的逻辑想法.用Python达到自己的学习目的才算有价值.如果是入门学习了解,开始学习不难 ...

  7. 爬虫-Python入门

    通过爬虫程序的编写,进一步理解HTTP协议.用conda建立一个名为crawler的python虚拟环境,在此虚拟环境中用pip或conda安装requests.beautifulsoup4等必要包( ...

  8. 【爬虫 | Python】解决‘Requests Max Retries Exceeded With Url‘报错的问题

    [爬虫 | Python]解决'Requests Max Retries Exceeded With Url in Python'报错的问题 背景 解决方案 一.普遍方案 细致方案 一.问题重述 1. ...

  9. 爬虫python能做什么 知乎,python网络爬虫能做什么

    python爬虫能做什么 世界上80%的爬虫是基于Python开发的,学好爬虫技能,可为后续的大数据分析.挖掘.机器学习等提供重要的数据源.什么是爬虫? (推荐学习:Python视频教程)网络爬虫(又 ...

最新文章

  1. Failed to open zip file Gradle dependency cache be corrupt
  2. 超好用的27个谷歌Chrome浏览器使用技巧
  3. gateway路由网关,zuul的替代品
  4. php curl读取头,php curl 获取请求头与DNS解析
  5. python property使用
  6. 无线系列-无线通信频段与电波传播
  7. AWS Python应用
  8. nodejs+java+python网上体育用品销售系统
  9. 一个产品人和“阿里云”的故事
  10. 111、爆炸极限的概念
  11. 网页设计(三)——JavaScript
  12. epub 免费转换网站
  13. 中国国际“互联网+”大学生创新创业大赛 武汉理工大学总决赛斩获双金
  14. 【计算机网络】第三部分 数据链路层(15) 连接局域网、主干网和虚拟局域网
  15. Dell B1260dn Printer驱动的安装
  16. 【设计模式】用英雄联盟来解释代理模式
  17. MTK65XX平台充电调试总结 (转载)
  18. 啪啪啪!敲代码时你喜欢听什么音乐?
  19. DOCKER04_详解Dockerfile基本指令、FROM、LABEL、RUN、CMD、ENTRYPOINT、ARG、ENV、VOLUME、USER
  20. Power BI——EARLIER 函数(对行操作)

热门文章

  1. bzoj 1491: [NOI2007]社交网络
  2. 为知笔记MathJax使用教程
  3. MT管理器解锁某APP部分功能
  4. 微信公众平台开发——群发信息
  5. 计算机专业答辩开场白,计算机专业论文答辩开场白范文
  6. adb 工具源码修改
  7. Python 编程辅助工具--ipython
  8. 张萌韩墨羽——打包升级兼容适配
  9. 常用计量统计方法(偏医学科研)
  10. 后台接收前端文件图片