首页 > 编程语言 > 详细

[python]糗百热点爬虫

时间:2015-04-20 18:36:26      阅读:334      评论:0      收藏:0      [点我收藏+]

有小部分的修改,并加入详细注释

#! -*- 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()

参考此博客

[python]糗百热点爬虫

原文:http://blog.csdn.net/songyu0120/article/details/45151677

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!