python 爬虫第一例--糗事百科
之前一直在学习python的基础内容,都在文章中,待整理好后发到随笔,糗事百科是爬虫第一例,参照网上例子,对正则进行更改,主要是理解其思路
# -*- coding: utf-8 -*- # 糗事百科爬虫 import urllib import urllib2 import re class QSBK: # 初始化方法,定义变量 def __init__(self): self.pageIndex = 1 self.user_agent = 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0' self.header = { 'User-Agent' : self.user_agent } self.url = 'http://www.qiushibaike.com/hot/page/' # 存放段子变量,每一页单独存储 self.stories = [] # 存放程序是否继续运行的变量 self.enable = False # 传入某一页的索引获得的页码 def getPage(self, pageIndex): try: open_url = 'http://www.qiushibaike.com/hot/page/' + str(pageIndex) #构建请求的request request = urllib2.Request(open_url, headers = self.header) response = urllib2.urlopen(request) content = response.read().decode('utf-8') return content except urllib2.URLError,e: if hasattr(e, "code"): print u"连接糗事百科错误,错误编码:"+e.code return None if hasattr(e, "reason"): print u"连接糗事百科错误,错误原因:"+e.reason return None # 传入某一页页码,返回不带图片的段子 def getPageItem(self, pageIndex): pageCode = self.getPage(pageIndex) if not pageCode: print u"页面加载失败" return None pattren = re.compile(r'<div class="author clearfix">.*?<h2>(.*?)</h2>(.*?)<div class="single-clear">',re.S) items = re.findall(pattren, pageCode) #用来存储每页的段子们 pageStories = [] for item in items: haveImg = re.search("thumb", item[1]) if not haveImg: # print item[0] pattren1 = re.compile(r'<div class="content">.*?<span>(.*?)</span>.*?<div class="stats">.*?<i class="number">(.*?)</i>',re.S) sec_strs = re.findall(pattren1, item[1]) for sec_str in sec_strs: # 将sec_str[0] 中的br转换为 replaceBR = re.compile('<br/>') text = re.sub(replaceBR, " ", sec_str[0]) pageStories.append([item[0].strip(), text.strip(), sec_str[1].strip()]) return pageStories # 加载并提取页面的内容,加入到列表 def loadPage(self): if self.enable == True: if len(self.stories) < 1: # 获取新的一页 pageStories = self.getPageItem(self.pageIndex) # 将该页的段子存放到全局list中 if pageStories: self.stories.append(pageStories) self.pageIndex += 1 # 调用该方法,每次敲一个回车打印出一个段子 def getOneStory(self, pageStories, page): # 遍历一页的段子 for story in pageStories: # 等待用户输入 input = raw_input() # 每输入一次回车,判断一下是否需要加载新的页面 self.loadPage() # 如果输入Q表示结束程序 if input == 'Q': self.enable = False return print u"第%d页 发布人:%s 赞:%s %s" %(page,story[0],story[2],story[1]) # 开始方法 def start(self): print u"您正在读糗事百科,按回车查看段子,按Q退出" #使遍历变为True 程序可以正常运行 self.enable = True self.loadPage() # 局部变量,控制当前读到第几页 nowPage = 0 while self.enable: if len(self.stories) >0: # 从全局list中读取一页段子 pageStories = self.stories[0] # 当前读到的页数增加一 nowPage +=1 # 将全局list中第一个元素删除,因为已经取出 del self.stories[0] #输出该页的段子 self.getOneStory(pageStories, nowPage) spider = QSBK() spider.start()
生成的实例