zoukankan      html  css  js  c++  java
  • 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 = '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()

    生成的实例

  • 相关阅读:
    HDU 1548 A strange lift (Dijkstra)
    HDU 1217 Arbitrage (Floyd)
    HDU 1385 Minimum Transport Cost (Dijstra 最短路)
    考研总结 2016-12-31 20:10 219人阅读 评论(21) 收藏
    归并排序 2016-12-30 20:17 208人阅读 评论(21) 收藏
    docker安装 2016-11-06 19:14 299人阅读 评论(31) 收藏
    Docker初步了解 2016-10-30 20:46 279人阅读 评论(31) 收藏
    [自考]感想 2016-10-23 20:28 261人阅读 评论(32) 收藏
    [自考]C++中一些特殊用法 2016-10-16 22:12 318人阅读 评论(30) 收藏
    Fitnesse批量读取变量信息,并保存到用例执行上下文中
  • 原文地址:https://www.cnblogs.com/rcltocode/p/7197100.html
Copyright © 2011-2022 走看看