PythonTip >> 博文 >> python

糗百新鲜事——爬虫python - SilenceCity

zihua 2014-04-02 15:04:21 点击: 913 | 收藏


  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()
原文链接:http://www.tuicool.com/articles/If22If

作者:zihua | 分类: python | 标签: python | 阅读: 913 | 发布于: 2014-04-02 15时 |