python2.7爬取糗事百科

爬取糗事百科上的段子,实现按一次回车,读取一条段子(过滤带有图片的段子),显示段子的发布人,点赞数和内容。

如图:
爬取结果


#!usr/bin/python2.7
# --*--coding:utf-8--*--
__author__ = '风凉zz'
import urllib
import urllib2
import re

class QSBK:
    def __init__(self):
        self.pageIndex = 1
        self.user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'
        self.referer = 'https://www.qiushibaike.com/hot/'
        self.headers = {'User-Agent': self.user_agent, 'Referer': self.referer}  # 初始化headers
        self.stories = []  # 存放段子的列表,每一个元素表示一页的段子
        self.enable = False  # 存放程序是否继续运行的变量

    def getPageCode(self,pageIndex):  # 获取第pageIndex页的html代码
        url = 'https://www.qiushibaike.com/hot/page/' + str(pageIndex)
        try:
            request = urllib2.Request(url, headers=self.headers)
            response = urllib2.urlopen(request)
            pagecode = response.read().decode('utf-8')
            return pagecode
        except urllib2.URLError, e:
            print u'连接糗事百科失败!'
            if hasattr(e, 'code'):
                print u'错误代码:', e.code
            if hasattr(e, 'reason'):
                print u'错误原因:', e.reason

    def getPageStories(self,pageIndex):  # 获取pageIndex页中所有不带图片的段子列表
        pagecode = self.getPageCode(pageIndex)
        if not pagecode:
            print '页面加载失败!'
            return None
        pattern = re.compile('<div .*?author clearfix">.*?<h2>(.*?)</h2>'
                             '.*?<div.*?content">.*?<span>(.*?)</span>'
                             '(.*?)stats-vote">'
                             '.*?number">(.*?)</i>', re.S)
        items = re.findall(pattern, pagecode)  # items结构:[(...,...,...,...)第一个段子......(...,...,...,...)第n个段子]
        pagestories = []
        for item in items:
            haveimg = re.search('img', item[2])
            if not haveimg:
                content = re.sub('<br/>', '\n', item[1])  # 将</br>替换成换行
                pagestories.append([item[0].strip(), content.strip(), item[3].strip()])
                # Python strip() 方法用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列。
                # item[0]发布者,item[1]内容,item[3]点赞数
        return pagestories  # 返回pageIndex页中所有不带图片的段子列表

    def loadPage(self):
        if self.enable == True:
            if len(self.stories) < 2:  # stories列表中未看段子页数少于2时
                pagestories = self.getPageStories(self.pageIndex)  # 获取pagaIndex页的所有不含图段子
                if pagestories:
                    self.stories.append(pagestories)  # 将pageIndex页的段子放入stories列表中
                    self.pageIndex += 1  # 页面数+1

    def getOneStory(self, pageIndex):  # 从pageIndex页中一个一个读取段子
        for story in self.getPageStories(pageIndex):  # 遍历pageIndex页中所有段子
            input = raw_input()  # 读取输入
            self.loadPage()
            if input == 'q':
                self.enable = False
                return None
            print u'第%d页\t' % (pageIndex),
            print u'发布人:%s\t' % (story[0]),
            print u'赞:%s\n' % (story[2]),
            print '%s' % (story[1])

    def start(self):
        print '正在读取糗事百科...'
        print '回车查看新段子/q退出'
        self.enable = True  # enable为True,使程序正常运行
        self.loadPage()
        nowpage = 1  # 当前页数
        while self.enable:
            if len(self.stories) > 0:  # 如果stories列表中还有段子
                pagestories = self.stories[0]  # 从storiies列表中取出第一页的段子
                del self.stories[0]  # 将第一页删除
                self.getOneStory(nowpage)  # 从当前页中一个一个读取段子
                nowpage += 1  # 当前页+1


spider = QSBK()
spider.start()

注:写正则表达式要注意html结束和开始的两个标签之间用. * ?,因为这里会解析为空格,不用. * ?程序会一直跑。


参考崔庆才老师博客

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值