#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()