python爬虫糗事百科

孙德本
2023-12-01
#coding:utf-8
import urllib2
import re
# 工具类
class Tools(object):
    remove_n = re.compile(r'\n')
    replace_br = re.compile(r'<br>|<br>')
    remove_ele = re.compile(r'<.*?>', re.S)
    #rs 参数,要进行替换的数据
    def replace_rs(self,rs):
        name = re.sub(self.remove_n, '', rs[0])
        content = re.sub(self.remove_n, '', rs[2])
        content = re.sub(self.replace_br, r'\n', content)
        content = re.sub(self.remove_ele, '', content)
        dz_tuple = (name, rs[1], content, rs[3], rs[4])
        # 返回处理后的元组
        return dz_tuple
#糗事百科爬虫类
class QSBK(object):
    '''
    1.根据url地址获取网页源代码
    2.从网页源代码中提取想要的数据
    3.存储或展示数据
    '''
    #把爬虫需要的基础设置进行初始化
    def __init__(self):
        #爬虫基础url地址,不包含参数部分
        self.baseURL = 'https://www.qiushibaike.com/hot/page'
        #请求头
        self.headers = {
            'User-Agent':'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50'
        }
        # 创建一个Tools对象,把对象赋值self的tool属性
        # 在整个爬虫的过程中,只创建一个Tools工具类的对象
        self.tool = Tools()

    #根据页码获取HTML源代码
    def get_page(self,num):
        #1、根据num拼接完整的URL地址
        #str()转化为字符串,int()转换为整数
        url = self.baseURL+str(num)
        #2.创建request对象
        request=urllib2.Request(url,headers=self.headers)
        # 3. 发起请求,接收响应
        try:
            response = urllib2.urlopen(request)
        except (urllib2.URLError,Exception),e:
            print '连接糗事百科失败,原因:%s'%e
            #获取失败,返回None
            return None
        else:
            # 返回页码对应的HTMl源代码
            return response.read()
    #从一段html源代码中获取数据
    def get_data(self,html):
        # 1.准备正则表达式
        pattern = re.compile(
            r'<div class="author clearfix">.*?<h2>(.*?)</h2>.*?Icon">(.*?)</div>.*?class="content">(.*?)</span>.*?<i class="number">(.*?)</i>.*?<i class="number">(.*?)</i>',
            re.S)
        # 2.根据正则表达式筛选数据
        results = re.findall(pattern, html)
        # 准备列表,存放处理后的数据
        rs_data =[]
        # 3.处理筛选出的数据
        for rs in results:
            dz_tuple = self.tool.replace_rs(rs)
            # 把元组放在列表中
            rs_data.append(dz_tuple)
        # 4.返回处理后的数据
        return rs_data
    #对象函数,开始爬虫
    def start(self):
        #1.根据某一页页码,获取该页的HTML源代码
        html = self.get_page(1)
        # 2.如果获取到的html源代码不为None,则从源代码中提取数据
        if html == None:
            return
        rs_data = self.get_data(html)

        for rs in rs_data:
            s = raw_input('敲击回车查看下一条段子,输入Q结束:')
            if s == 'Q':
                print '程序结束!'
                break
            print '用户名:%s 年龄:%s 好笑数:%s 评论数:%s'%(rs[0],rs[1],rs[3],rs[4])
            print rs[2]
            print '\n'
if __name__ == '__main__':
    #创建QSBK对象
    qsbk = QSBK()
    qsbk.start()
 类似资料: