Python爬虫入门学习例子之糗事百科

初学Python爬虫,学习资料是这篇博客:Python爬虫入门教程 下面列出一个爬糗事百科的例子巩固一下。

#   程序:糗百爬虫  
#   语言:Python 2.7  
#   操作:输入quit退出阅读糗事百科  
#   功能:按下回车依次浏览今日的糗百热点 
import urllib2,re,time,thread
class Spider_Model:
    #类初始化
    def __init__(self):
        self.page = 1
        self.pages = []
        self.enable = False

    #将所有的段子都扣出来,添加到列表中并且返回列表      
    def GetPage(self,page):
        myUrl = "http://www.qiushibaike.com/8hr/page/" + str(page) + "/?s=4915752"
	#伪装成浏览器
        user_agent = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36'
        headers = {'User-Agent':user_agent}
        req = urllib2.Request(myUrl,headers=headers)
        myResponse = urllib2.urlopen(req)
        myPage = myResponse.read()
	#如果你出现了乱码,可以decode解码
        unicodePage = myPage.decode('utf-8')
        #段子都在class="content"的div标记的<span>内部,正则表达式匹配一下。
	#最后的re.S表示.可以匹配换行符(.本来是匹配除换行符外的任意字符),.*?即非贪婪匹配任意字符,
	#\n+表示一个或多个空格,中间括号中的内容就是我们要找的段子,以列表形式存在myItems中(type()可以查看类型,以循环方式打印输出不会有乱码)。
	myItems=re.findall('<div.*?class="content">\n+<span>(.*?)</span>\n+</div>',unicodePage,re.S)
        #print type(myItems)
        #for item in myItems:
        #    print item
        return myItems
            
    #后台线程加载新的段子,存在列表pages中
    def LoadPage(self):
        #如果用户未输入quit,则一直运行
        while self.enable:
            #如果pages数组中的内容小于2个,就获取新页面中的段子
            if len(self.pages) < 2:
                try:
                    myPage = self.GetPage(self.page)
                    self.page += 1
		    #append函数是向列表末尾添加元素
                    self.pages.append(myPage)
                except:
                    print '无法获取下一页内容'
            else:
		#5是推迟执行的秒数(即休眠5秒),使用前要import time
                time.sleep(5) 
                
    #显示页面
    def ShowPage(self,nowPage,page):
	#以u开头的字符串表示unicode字符串,以r开头的字符串表示忽略转义
        print u'第%d页:' % page
	#循环输出
        for i in nowPage:
	    #replace()是替换函数,把前边的字符串替换为后边的字符串
            print i.replace('<br/>','') 
        
    #启动函数,同时启动了新线程
    def Start(self):
        self.enable = True
        page = self.page
        print u'正在新建一个线程在后台加载段子并存储……'
        #启动新线程,前一个参数是要调用的线程函数,后者是要传给它的参数
        thread.start_new_thread(self.LoadPage,())
        while self.enable:
            #如果self.pages中有元素,就调用ShowPage函数
            if self.pages:
                nowPage = self.pages[0]
                del self.pages[0]
                self.ShowPage(nowPage,page)
                page += 1
            print u'如果要退出后台进程,请输入quit'
	    #raw_input()是接受输入,参数可以直接打印出来,str()是转换成字符串类型
            myInput = str(raw_input(u'输入quit退出,或回车继续:'))
            if myInput == 'quit':
                self.enable = False
        
#程序入口
myModel = Spider_Model()
myModel.Start()

整体运行流程:实例化一个类后,调用函数start,然后函数Loadpage开启线程并调用GetPage获得段子内容,通过showpage输出段子内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值