• 【python】抄写大神的糗事百科代码


    照着静觅大神的博客学习,原文在这:http://cuiqingcai.com/990.html

    划重点:

    1. str.strip() strip函数会把字符串的前后多余的空白字符去掉

    2. response.read().decode('utf-8','ignore')  要加'ignore'忽略非法字符,不然总是报解码错误

    3. python 3.x 中  raw_input 改成 input 了

    4. 代码最好用notepad++先写 格式清晰一点 容易发现错 尤其是缩进和中文标点的错误

    5. .*? 常用组合, 后面的?表示非贪婪模式

    用python3.4.3实现的糗百爬虫代码如下(就是照着大神的抄的,把2.x的部分给改了而已):

    import urllib.request
    import urllib.parse
    import re
    import time
    
    
    #糗事百科爬虫类
    class QSBK:
        #初始化方法,定义一些变量
        def __init__(self):
            self.pageIndex = 1
            self.user_agent = 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93 Safari/537.36'
            self.headers = {'User-Agent' : self.user_agent}
            #存放段子的变量,每个元素是每一页的段子
            self.stories = []
            #存放程序是否继续运行的变量
            self.enable = False
        #传入某一页的索引获得页面代码
        def getPage(self, pageIndex):
            try:
                url = 'http://www.qiushibaike.com/hot/page/' + str(pageIndex)
                request = urllib.request.Request(url, headers = self.headers)
                response = urllib.request.urlopen(request)
                pageCode = response.read().decode('utf-8','ignore') #这个ignore忽略非法字符 一定要加 不然总报解码错误
                return pageCode
            except urllib.error.URLError as e:
                if hasattr(e, "reason"):
                    print(u"连接糗事百科失败,错误原因:", e.reason)
                    return None
        #传入某一页代码,返回本页不断图片的段子列表
        def getPageItems(self, pageIndex):
            pageCode = self.getPage(pageIndex)
            if not pageCode:
                print(u"页面加载失败....")
                return None
            pattern = re.compile('<div.*?author">.*?<a.*?<img.*?>(.*?)</a>.*?<div.*?'+
            'content">(.*?)<!--(.*?)-->.*?</div>(.*?)<div class="stats.*?class="number">(.*?)</i>', re.S)
            items = re.findall(pattern, pageCode)
            #用来存储每页的段子
            pageStories = []
            for item in items:
                haveImg = re.search("img", item[3])
                if not haveImg:
                    replaceBR = re.compile('<br/>')
                    text = re.sub(replaceBR, "
    ", item[1])
                    pageStories.append([item[0].strip(), text.strip(),item[4].strip()]) #.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)
                        #页码加1,下次读取下一页
                        self.pageIndex += 1
        #每次敲回车打印一个段子
        def getOneStory(self,pageStories,page):
            #遍历一页的段子
            for story in pageStories:
                #等待用户输入
                input_v = input()
                #每当输入回车一次,判断一下是否要加载新页面
                self.loadPage()
                #如果输入Q则程序结束
                if input_v == "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()
            #局部变量,控制当前读到2了第几页
            nowPage = 0
            while self.enable:
                if len(self.stories) > 0:
                    #从全局list中获取一页段子
                    pageStories = self.stories[0]
                    #当前读到的页数加1
                    nowPage += 1
                    #删除已经取出的元素
                    del self.stories[0]
                    #输出该页的段子
                    self.getOneStory(pageStories,nowPage)
    
    spider = QSBK()
    spider.start()
  • 相关阅读:
    php.h: No such file or directory
    检查日期是否为节假日api
    Linux下实现秒级的crontab定时任务
    Apache 两种mpm prefork 和 worker 的区别
    centos6 安装mysql报错Requires: libc.so.6(GLIBC_2.14)
    Yii2 高级模板添加更多Application
    Yii2 assets注册的css样式文件没有加载
    Yii rbac原理和实践
    Yii2 ActiveRecord save失败
    Yii2 手动安装yii2-imagine插件
  • 原文地址:https://www.cnblogs.com/dplearning/p/4855063.html
Copyright © 2020-2023  润新知