Python爬虫实战一之爬取糗事百科段子

1.抓取糗事百科热门段子

2.过滤带有图片的段子

3.实现每按一次回车显示一个段子发布人,段子内容
——————————————————————————————————————————————————
原作者抓取了时间。点赞数,我没弄

from urllib import request,parse,error
import re

class QSBK:
    def __init__(self):
        '''初始化一下变量:
        pageIndex : 页号
        user_agent:url添加浏览器模拟
        headers   :url添加头部
        tories    :存放段子
        enable    :程序运行状态
        '''
        self.pageIndex = 1
        self.user_agent = 'Mozilla/5.0 (Windows NT 6.2; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0'
        self.headers = {'User-Agent':self.user_agent}
        self.stories = []
        self.enable = False

    def getpage(self,pageIndex):
        '''获得一个源网页的内容
        :param pageIndex: 页号
        :return: qbcontent 糗百一页内容
        '''
        try:
            url = ' http://www.qiushibaike.com/hot/page/' +str(pageIndex)
            req = request.Request(url,headers=self.headers)
            respose = request.urlopen(req)
            qbcontent = respose.read().decode('utf-8')
            return qbcontent
        except error.URLError as e:
            if hasattr(e,'reason'):
                print('连接失败,错误原因:',e.reason)
                return None

    def getItems(self,pageIndex):
        '''从一个网页中获取所有段子
        :param pageIndex: 页号
        :return: 段子列表
        '''
        qbcontent = self.getpage(pageIndex)
        if not qbcontent:
            print('页面加载失败。。。。')
            return None
        articles = re.compile(r'<div class="author clearfix">.*?<h2>(.*?)</h2>.*?content">.*?<span>(.*?)</span>',re.S)
        #正则匹配段子
        items = re.findall(articles,qbcontent)
        pagestories = []
        for item in items:
            replaceBR = re.compile(r'<br/>')
            text = re.sub(replaceBR,'\n',item[1])
            pagestories.append( (item[0],text.strip()) )
        return pagestories

    def loadpage(self):
        '''
        加载页面获取一页的段子
        :return: 无
        '''
        if self.enable == True:
            if len(self.stories)<2:
                pagestories = self.getItems(self.pageIndex)
                if pagestories:
                    self.stories.append(pagestories)
                    self.pageIndex += 1

    def getOneStory(self,pagestories,page):
        '''每次任意输入就返回一个段子

        :param pagestories:段子列表
        :param page:页号
        :return:一个段子
        '''
        for story in pagestories:
            input_status = input()
            if input_status == 'q':
                self.enable = False
                return
            self.loadpage()
            print('第{0}页\t发布人:{1}\n{2}'.format(page,story[0],story[1]))


    def downloadtexts(self,filename,pages):
        '''输入要保存的路径,页数,下载段子到本地文件
        :param pages:要下载的页数
        :return: 无
        '''
        allStories = []
        for page in range(pages):
            onePageStories = self.getItems(page+1)
            allStories.append(onePageStories)
        with open(filename,'w') as f:
            for onepage in allStories:
                f.write('*'*78)
                f.write('\n')
                for oneStory in onepage:
                    f.write('作者: ' + oneStory[0])
                    f.write('\n')
                    f.write('段子: ' + oneStory[1])
                    f.write('\n\n')

    def startLook(self):
        print('正在读取糗事百科,回车查看新段子,q退出:')
        self.enable = True
        self.loadpage()
        nowpage = 0
        while self.enable:
            if len(self.stories)>0:
                pagestories = self.stories[0]
                nowpage += 1
                del self.stories[0]
                self.getOneStory(pagestories,nowpage)


测试一下在:

if __name__ == '__main__':
    qb = QSBK()
    qb.downloadtexts('qb.txt',2)

不错,可以运行。

主要的难度应该就是正则表达式的编写了

我的正则开始写的是一坨屎,后面看了看别人的哥们的修改的,但是还有更简单的,没看明白





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值