[python]糗百热点爬虫

来源:互联网 发布:知乎玲珑邪僧 编辑:程序博客网 时间:2024/05/25 01:36

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

#! -*- coding:utf-8 -*-#! usr/bin/python'''#=====================================================#    FileName: Spider_qb.py#    Describe: 从糗百下载段子并依次播放#    Modifier: sunny#    Since: 2015-04-20#    变量说明:items,self.pages为list,形式为:#    [ ['时间','段子内容','时间','段子内容',...]#一行为一页内容#      ......#      ['时间','段子内容','时间','段子内容',...] ]#====================================================='''import urllib2import re,chardetimport thread,timeclass 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()

参考此博客

0 0
原创粉丝点击