python预加载爬取糗事百科帖子

'''
按以下思路写出程序:
1、面向对象(声明类,创建对象)
2、类中有哪些函数?
    初始化函数__init__()
    需要初始化哪些数据?
    第一次请求的页码1
    一个空列表all_page_list,用于保存每一页数据的小列表
    是否正在查看段子的变量enable(布尔型,正在查看为True,否则为False,初始值应为False)

    开始爬取的函数start_spider()
    在该函数内调用lazy_load_data()先加载一页数据
    记录当前展示的第几页的变量current_page
    把是否正在查看的变量设置为True,因为此时在查看段子
    判断__init__()函数内的列表all_page_list是否大于0
    如果大于0取出第1个进行展示,需要调用展示数据的函数show_content()
    展示完毕后让current_page+1
    将已经展示完的数据从all_page_list内删除,方便后续的预加载数据


    预加载数据的函数lazy_load_data()
    判断__init__()函数内列表的长度是否小于2(程序第1次执行时是小于2的)
    小于2时说明不够两页,此时调用请求网页源代码的函数get_page_code()
    请求到网页源代码后调用get_content_by_html()提取段子内容
    把提取到的段子内容存入__init__()函数的列表内

    获取网页源代码的函数get_page_code()
    此函数根据传入的面码请求网页源代码并在结尾返回

    提取段子内容的函数get_content_by_html()
    根据传入的网页源代码参数提取需要的内容(用户昵称、段子内容)
    提取成功后放入一个局部列表内,最后返回这个列表

    展示段子内容的函数show_content()
    只展示2个数据,每按一次回车键展示一个段子内容
    输入Q键并按回车退出程序

'''

根据思路写出如下代码

import requests
import re
class qiushibaike(object):
    def __init__(self):
        self.page = 1
        self.enble = False
        self.all_page_list=[]
        self.qian=[]
    def get_page_code(self):   #请求网页源代码函数
        url = 'https://www.qiushibaike.com' + '/8hr/page/' + str(self.page) + '/'
        r = requests.get(url).text
        return r
    def get_content_by_html(self):    #提取段子内容
        r = self.get_page_code()
        pat = re.compile(r'<div class="content">\n<span>\n\n\n(.*?)</span>', re.S)
        self.ree = re.findall(pat,r)
        return self.ree
    def start_spider(self):  #开始爬取
        if self.enble ==True:
            pass
        else:
            pass
        self.lazy_load_data()
        if len(self.all_page_list) > 0:
            self.get_page_code()
            self.get_content_by_html()
            self.qian = self.all_page_list[0]
            self.page = self.page +1
            self.all_page_list = []
        else:
            pass
    def lazy_load_data(self):  #预加载函数
        if len(self.all_page_list)<2:
            self.get_page_code()
            self.get_content_by_html()
            for x in self.ree:
                self.all_page_list.append(x)

    def show_content(self):     #展示数据函数        只展示2个数据,每按一次回车键展示一个段子内容输入Q键并按回车退出程序
        pizhu = self.get_content_by_html()
        if self.page<=1:
            print('第一条:')
            self.start_spider()
            print(pizhu[0])
        else:
            print('下一条数据:')
            self.lazy_load_data()
            print(pizhu)
            print('上一条数据:')
            print(self.qian)
            self.qian = []
            self.start_spider()
my = qiushibaike()
while True:
    q = input('Enter text (or Enter to q):')
    if my.page <13:
        if q=='q':
            print('退出系统')
            break
        else:
            my.show_content()
    else:
        break

猜你喜欢

转载自blog.csdn.net/DonQuixote_/article/details/81318918
今日推荐