首页 > 学院 > 开发设计 > 正文

学习记录:python糗百爬虫

2019-11-14 10:01:39
字体:
来源:转载
供稿:网友

最近想了解下爬虫是如何运作的,就在酷勤网上找了爬虫的教程学习了下,顺便学下下python的基本语法。 由于网上的代码是无缩进版本的,本人对python产生了奇怪的怨念。 花了半天才调整出能跑的格式。


遇到的问题如下: 1.# -- coding:utf-8 -- 这句话很重要,不然连注释都会报错。 2.不能手贱多打空格,不然会出现缩减不匹配的问题 3.网上所给的正则表达式已经不能再匹配当前的糗百网页,需要重新改写。 4.没缩减的代码看起来真的好累,不知道什么地方结束什么地方开始。有几个return不知道该属于哪一块,虽然如此,但是代码能跑起来0 0


另外,对python语句以下了解: 1. __ author __好像没什么用处,只是声明作者,用法很有意思 2.return 和return None意思其实是一样的 3.虽然有些不是很明白,但是好像用到的很多库都是python自带的 4.对方法里的self问题的理解

http://www.VEVb.com/linuxcat/archive/2012/01/05/2220997.html 首先明确的是self只有在类的方法中才会有,独立的函数或方法是不必带有self的。self在定义类的方法时是必须有的,虽然在调用时不必传入相应的参数。self名称不是必须的,在python中self不是关键词,你可以定义成a或b或其它名字都可以,但是约定成俗,不要搞另类,大家会不明白的。self指的是类实例对象本身(注意:不是类本身)。

运行结果

__author__='ttt'# -*- coding:utf-8 -*-import urllibimport urllib2import reimport threadimport timeclass QSBK:#初始化方法,定义一些变量 def __init__(self): self.pageIndex = 1 self.user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)' #初始化headers self.headers = { 'User-Agent' : self.user_agent } #存放程序是继续运行的变量 self.stories=[] #传入某一页的索引获得页面代码 def getPage(self,pageIndex): try: url = 'http://www.qiushibaike.com/hot/page/'+str(pageIndex) #构建请求的request request = urllib2.Request(url,headers = self.headers) #利用urlopen获取页面代码 response = urllib2.urlopen(request) #讲页面转化为UTF-8编码 pageCode = response.read().decode('utf-8') return pageCode except urllib2.URLError, e: if hasattr(e,"reason"): PRint u"糗事百科失败,错误原因",e.reason return None #传入某一页代码,返回本页不带图片的段子列表 def getPageItems(self,pageIndex): pageCode = self.getPage(pageIndex) if not pageCode: print "页面加载失败..." return None pattern = re.compile('<div.*?class="author.*?<h2>(.*?)</h2>.*?<div.*?class="content".*?<span>(.*?)</span>(.*?)<div.*?class="stats-vote".*?class="number">(.*?)</i>',re.S) items = re.findall(pattern,pageCode) #用来存储每页的段子们 pageStories = [] #便利正则表达式匹配的信息 for item in items: #是否含有图片 haveImg = re.search("img",item[2]) #如果不含有图片,把它加入list中 if not haveImg: #item[0]是一个段子的发布者,item[1]是内容,item[3]是点赞 pageStories.append([item[0].strip(),item[1].strip(),item[3].strip()]) return pageStories #加载并提取页面的内容,加入到列表中 def loadPage(self): #如果当前未看的页数少于2页,则加载新的一页 if self.enable == True: if len(self.stories) < 2: #获取新一页 pageStories = self.getPageItems(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/n%s/n赞%s/n"%(page,story[0],story[1],story[2]) #开始方法 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()
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表