有小部分的修改,并加入详细注释
#! -*- coding:utf-8 -*-
#! usr/bin/python
‘‘‘
#=====================================================
# FileName: Spider_qb.py
# Describe: 从糗百下载段子并依次播放
# Modifier: sunny
# Since: 2015-04-20
# 变量说明:items,self.pages为list,形式为:
# [ [‘时间‘,‘段子内容‘,‘时间‘,‘段子内容‘,...]#一行为一页内容
# ......
# [‘时间‘,‘段子内容‘,‘时间‘,‘段子内容‘,...] ]
#=====================================================
‘‘‘
import urllib2
import re,chardet
import thread,time
class QiubaiSpider(object):
"""糗事百科爬虫"""
def __init__(self):
#page为要显示的页码
#pages存储多页内容
self.page = 1
self.pages = []
self.enable = False
#下载1页内容
def GetPage(self,page):
myUrl = "http://m.qiushibaike.com/hot/page/" + str(page)
user_agent = ‘Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)‘
headers = {‘User-Agent‘ : user_agent }
req = urllib2.Request(myUrl,headers = headers)
myPage = urllib2.urlopen(req).read()
#添加编解码代码
#......
unicodePage = myPage.decode("utf-8")
#利用正则表达式匹配糗百内容, pattern包含两个group
#前两个元字符匹配空格等,不是group
#.*匹配任意多个字符, ?将其变为非贪婪模式
#re.DOTALL匹配包括‘\n‘的任意内容
content = re.findall(‘<div.*?class="content".*?title="(.*?)">(.*?)</div>‘,unicodePage,re.DOTALL)
items = []
#content中pattern匹配的第1个group是title后的时间
#第2个group匹配<div>和</div>之间的内容,即段子内容
for item in content:
#将内容中的换行符替换
items.append([ item[0],item[1].replace("<br/>" and "\n","") ])
return items
#缓存多页内容,用户未输入quit就一直运行
def LoadPage(self):
while self.enable:
#当前缓存的内容小于2页就开始加载
if len(self.pages) < 2:
try:
tempPage = self.GetPage(self.page)
self.page += 1
self.pages.append(tempPage)
except:
print ‘无法连接糗百!‘
break
else:
#缓存充足等待1秒
#time.sleep(1)
pass
def ShowPage(self,nowPage,page):
for items in nowPage:
print u‘第%d页‘ % page , items[0]
print items[1]
myInput = raw_input()
if myInput == "q":
self.enable = False
break
def Start(self):
self.enable = True
#新建线程前把页码读出来,否则线程读取后页码值就改变了
page = self.page
#后台开新线程缓存糗百内容
#参数1为线程函数,参数2为传递给线程函数的参数此处为空tuple
thread.start_new_thread(self.LoadPage,())
while self.enable:
#缓存区有内容
if self.pages:
#每次取出缓存区最前面一页内容来显示
#取出后删除缓存区对应内容
tempNowPage = self.pages[0]
del self.pages[0]
self.ShowPage(tempNowPage,page)
page += 1
#----------- 程序的入口处 -----------
print u"""
---------------------------------------
程序:糗百爬虫
版本:0.3
参考:why
语言:Python 2.7
操作:输入q退出阅读
功能:按下回车依次浏览糗百段子
---------------------------------------
"""
print u‘请按下回车浏览今日的糗百内容(输入q退出):‘
raw_input(‘ ‘)
qb = QiubaiSpider()
qb.Start()
原文:http://blog.csdn.net/songyu0120/article/details/45151677