python学习系列1---爬取糗事百科段子

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


你可能感兴趣的:(python学习系列1---爬取糗事百科段子)