码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-04-22 09:38:51      阅读:200      评论:0      收藏:0      [点我收藏+]

标签:python   爬虫   

刚刚测试了糗百爬虫,结果第二天糗百的源代码就换格式了= =
改了下正则表达式,但是内容中存在的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()

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

标签:python   爬虫   

原文地址:http://blog.csdn.net/songyu0120/article/details/45179991

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!