python2.7爬取糗事百科

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

如图:
python2.7爬取糗事百科_第1张图片


#!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('
.*?

(.*?)

' '.*?.*?(.*?)' '(.*?)stats-vote">' '.*?number">(.*?)', 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('
'
, '\n', item[1]) # 将
替换成换行
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结束和开始的两个标签之间用. * ?,因为这里会解析为空格,不用. * ?程序会一直跑。


参考崔庆才老师博客

你可能感兴趣的:(python2.7爬取糗事百科)