糗事百科懒加载版

卫胜
2023-12-01
#coding:utf-8

import urllib2, re

'''
通过类和对象的形式实现将要下载数据的预加载模式
'''

class QSBK(object):
    def __init__(self):
        self.index_page = 1
        self.headers = {
            'User-Agent': 'Mozilla/5.0(Macintosh;IntelMacOSX10.6;rv:2.0.1)
Gecko/20100101Firefox/4.0.1'
        }
        #初始化一个列表,用于保存每一页数据的小列表
        self.all_page_list = []
        #声明Bool类型的属性,用于记录是否继续查看
        self.enable = False

    #定义获取某一页HTML源代码的函数
    def get_page_code(self,page_number):
        url  = 'https://www.qiushibaike.com/hot/page/' + 
str(page_number)
        request = urllib2.Request(url,headers=self.headers)
        try:
            response = urllib2.urlopen(request)
        except Exception,e:
            print '链接第{}页失败,原因:{}'.format(page_number,e)
            return None
        else:
            page_code = response.read()
            return page_code

    #定义解析段子内容的函数
    def get_content_by_html(self,html):
        #提取作者和内容
        pattern = re.compile(r'<div class="author clearfix">.*?<h2>(.*?)
</h2>.*?<div class="content".*?<span>(.*?)</span>',re.S)
        results = re.findall(pattern,html)
        #声明列表,用于保存每一页段子的数据
        page_content_list = []
        for name,content in results:
            page_content_list.append([name,content])
        return page_content_list

    #定义用于预加载数据的函数
    def lazy_load_data(self):
        if len(self.all_page_list)<2:
        #如果大列表中存放的小列表的数量小于2,说明加载的页面数据不够2页,则需
要预加载
下一页的数据,如果self.all_page_list中的数据超出了2页,则不需要预加载
            html = self.get_page_code(self.index_page)
            page_code_list = self.get_content_by_html(html)
            print '加载第{}页数据成功!'.format(self.index_page)
            #将page_code_list中的内容存入到self.all_page_list中
            self.all_page_list.append(page_code_list)
            #取完当前页的内容,需要将页码+1
            self.index_page +=1

    #定义展示段子内容的函数,通过控制条输入的形式来输出每一个段子的内容
    def show_content(self,page_data,page_number):
        #每一页只展示2个数据
        for index in xrange(0,2):
            #让用户输入回车,展示段子内容
            input = raw_input('请输入回车键:')
            self.lazy_load_data()
            if input == "Q":
                #不再展示数据
                self.enable = False
                return
                # [[[zhangsan, 123], [lisi, 213]], [], []]
            one_data = page_data[index]
            print '第{}页数据:用户名:{},内容:{}'.format(page_number,
one_data[0].strip('\n').strip(),one_data[1].strip('\n').strip())

    #定义开始爬取的函数
    def start_spider(self):
        print '正在爬取糗事百科数据,输入回车键查看新段子内容,输入Q键退出查看'
        #通过lazy_load_data先加载一页数据
        self.lazy_load_data()

        #声明变量,用于记录当前是第几页的数据
        current_page =1
        self.enable =True
        #遍历每一页的段子内容
        while self.enable:
            if len(self.all_page_list)>0:
                #如果有数据取出第一个进行展示
                data = self.all_page_list[0]
                #第一个数据展示完毕之后,需要将该数据从列表中删除,以保证大列表中
的数据是相同的
                self.show_content(data,current_page)
                current_page +=1
                #将已经展示完的数据从列表中进行删除
                del self.all_page_list[0]

if __name__ == '__main__':
    qsbk = QSBK()
    qsbk.start_spider()
 类似资料: