python学习了大半个月了。前段时间一直在慕课网看廖雪峰老师的python学习入门和进阶,视频地址http://www.imooc.com/learn/317。讲的很好,很通俗易懂,一边讲解还能一边练习。后面开始学习python爬虫相关的知识,看的课程都是来自http://wiki.jikexueyuan.com/project/python-crawler-guide/summarize.html该链接的内容,讲解的十分详细,内容较多,一定要有耐心慢慢看,上面的演习我都是在pycharm上一个个跟着再练一遍的,总觉得动动手才能记得更深刻。然后后面附加了一系列的实战练习,第一个就是爬取糗事百科段子的练习。在楼主代码的基础上以及评论者代码的基础上自己也跟着做出来了,效果也还行,亲测可用。留在这里,记录一下,以便后面可以来看看。。总结一下,菜鸟还是要多多学习,多多练习,多多思考。 #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2018\8\3 0003 20:38 # @Author : Aries # @Site : # @File : getstoriesfromQSBK.py # @Software: PyCharm import urllib import urllib2 from bs4 import BeautifulSoup class QSBK: #初始化方法,定义爬取时所需的变量 def __init__(self): self.pageIndex=1 self.user_agent='Mozilla/5.0 (Windows NT 6.1; Win64; x64)' self.headers = {'User-Agent': self.user_agent} #存放读取的故事及相关信息,每一个元素是一页的内容 self.contents=[] #存放程序是否继续运行的变量 self.enable=False #存放页面总共的页数 self.pageAll=0 #获取某一页的页面代码 def getPageCode(self,pageIndex): try: url = 'http://www.qiushibaike.com/hot/page/' + str(pageIndex) request = urllib2.Request(url, headers=self.headers) response = urllib2.urlopen(request) pageCode = response.read() return pageCode except urllib2.HTTPError, e: if hasattr(e, "code"): print u"连接糗事百科失败,错误原因:", e.code return None if hasattr(e, "reason"): print u"连接糗事百科失败,错误原因:", e.reason return None #获取某一页不带图片的页面内容 def getPageContent(self,pageIndex): pageCode = self.getPageCode(pageIndex) if pageCode: soup = BeautifulSoup(pageCode) nodes = soup.select('#content-left') node = nodes[0] contents = [] # 该页所有发布者 author = node.select('h2') # 该页所有发布内容 content = node.select('div.content') # 该页所有点赞数(好笑) stats_vote = node.select('.stats-vote .number') # 该页所有评论数 stats_comments = node.select('.stats-comments .number') # 总页数 if self.pageAll==0: pageall = node.select('span.page-numbers') self.pageAll = int(pageall[len(pageall) - 1].get_text().strip()) # 存储页面内容 for i in range(0, len(author)): contents.append( [author[i].get_text().strip(), content[i].get_text().strip(), stats_vote[i].get_text().strip(), stats_comments[i].get_text().strip()]) return contents else: print "页面加载失败..." return None #根据回车,打印该页的一个段子内容 def getOneStory(self,content): if self.pageIndex<=self.pageAll+1: #打印一个段子 item=content #等待用户输入 input=raw_input() if input=="Q": self.enable=False return print u"第%d页\t发布人:%s\t发布内容:%s\t点赞数:%s\t评论数:%s\t" % (self.pageIndex-1, item[0], item[1], item[2], item[3]) #每输入一次回车,判段一下是否需要重新加载页面 self.loadPage() else: print "\n已加载全部页面内容,请按Q退出!" #等待用户输入 input=raw_input() #判断接收任意键已经按下的结果退出 if input=="Q": self.enable=False return #加载并提取页面的内容。加入列表中 def loadPage(self): if self.enable==True: if len(self.contents)==0: pageContent=self.getPageContent(self.pageIndex) if pageContent: self.contents = pageContent self.pageIndex += 1 else: print "页面加载失败..." return #开始方法 def start(self): print "正在读取糗事百科,按回车查看新段子,退出请按Q" #使变量为true,程序正常运行 self.enable=True #先加载一页内容和总共的页数 self.loadPage() while self.enable: if self.contents: #传入一个段子 content=self.contents[0] #传入之后删除该段子 del self.contents[0] #打印一个段子,传入一个段子的内容 self.getOneStory(content) spider=QSBK() spider.start()
07-25