python 爬虫第一例--糗事百科

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 = \'\' # 存放段子变量,每一页单独存储 self.stories = [] # 存放程序是否继续运行的变量 self.enable = False # 传入某一页的索引获得的页码 def getPage(self, pageIndex): try: open_url = \'\' + 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>.*?<h2>(.*?)</h2>(.*?)<div>\',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>.*?<span>(.*?)</span>.*?<div>.*?<i>(.*?)</i>\',re.S) sec_strs = re.findall(pattren1, item[1]) for sec_str in sec_strs: # 将sec_str[0] 中的br转换为\n replaceBR = re.compile(\'<br/>\') text = re.sub(replaceBR, "\n", 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页\t发布人:%s\t赞:%s\n%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()

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwpsdg.html