您的位置:首页 > 编程语言 > Python开发

[python]糗百热点爬虫v2.0【15/4/21更新】

2015-04-21 23:24 295 查看
刚刚测试了糗百爬虫,结果第二天糗百的源代码就换格式了= =

改了下正则表达式,但是内容中存在的html转码还未匹配,不影响使用

#! -*- 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.compile(r'<div.*?class="content">(.*?)<!--([\s\S]{19})-->(.*)</div>',re.DOTALL)
content = re.findall(r'<div.*?class="content">(.*?)<!--([\s\S]{19})(.*?)</div>',unicodePage,re.DOTALL)
items = []
#content中pattern匹配的第1个group是title后的时间
#第2个group匹配<div>和</div>之间的内容,即段子内容
for item in content:
#将内容中的换行符替换
items.append([ item[0].replace("\n",""),item[1].replace("<br/>","") ])
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)

def ShowPage(self,nowPage,page):
for items in nowPage:
print u'第%d页' % page , items[1]
print items[0]
myInput = raw_input()
if myInput != "":
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"""

#=====================================================
#    FileName: Spider_qb.py
#    Describe: 从糗百下载段子并依次播放
#    Modifier: sunny
#    Since: 2015-04-20
#    变量说明:items,self.pages为list,形式为:
#    [ ['时间','段子内容','时间','段子内容',...]#一行为一页内容
#      ......
#      ['时间','段子内容','时间','段子内容',...] ]
#=====================================================

---------------------------------------
程序:糗百爬虫
版本:0.2
参考:why
语言:Python 2.7
修改: 江前云后
操作:回车阅读,非回车退出
---------------------------------------
"""
print u'回车键浏览糗百热点(任意键退出):'
raw_input(' ')
qb = QiubaiSpider()
qb.Start()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: