糗事百科class封装

import sqlite3, urllib2, re

创建工具类,用于对爬取的结果进行过滤

class DataTool(object):
    # 定义查找特殊字符的正则表达式
    remove_n = re.compile(r'\n')
    # |表示或者
    br = re.compile(r'<br>|<br/>')
    quot = re.compile(r'&quot;')
    def update_res(self, result_tuple):
        # result_tuple是用于接收QSBKSpider类传递的数据元组。
        name = re.sub(self.remove_n, '', result_tuple[0])
        # 首先将段子内容前后两端的\n换行符进行删除
        # 然后再将内容中间的<br>标签转化成\n
        content = re.sub(self.remove_n, '', result_tuple[1])
        content = re.sub(self.br, '\n', content)
        content = re.sub(self.quot, '"', content)
        # 好评数
        vote_number = re.sub(self.remove_n, '', result_tuple[2])
        # 评论数
        comment_number = re.sub(self.remove_n, '', result_tuple[3])

        data_res = (name, content, vote_number, comment_number)
        return data_res

创建操作数据库的工具类

class DBManager(object):

    connect = None
    cursor = None

    @classmethod
    def db_and_cursor(cls):
        cls.connect = sqlite3.connect('qsbk.db')
        cls.cursor = cls.connect.cursor()

    @classmethod
    def insert_data(cls, data_tuple):
        insert_sql = "INSERT INTO qsbk (nick_name, content, vote_number, comment_number) VALUES ('%s', '%s', %d, %d)" % (data_tuple[0], data_tuple[1], int(data_tuple[2]), int(data_tuple[3]))
        cls.cursor.execute(insert_sql)
        cls.connect.commit()

    @classmethod
    def close_db(cls):
        cls.cursor.close()
        cls.connect.close()

创建爬虫类

class QSBKSpider(object):
    def __init__(self):
        self.base_url = "https://www.qiushibaike.com/hot/page/"
        # 设置User-Agent
        self.headers = {
            'User-Agent':"Mozilla/5.0(Windows;U;WindowsNT6.1;en-us)AppleWebKit/534.50(KHTML,likeGecko)Version/5.1Safari/534.50"
        }
        # 创建DataTool类的对象,并在__init__()函数中完成对DataTool类的对象引用
        self.tool = DataTool()


    # 定义获取网页源代码的函数
    def get_origin_page_code(self, page_num):
        # page_num表示当前页面的页码
        abs_url = self.base_url + str(page_num)

        # 创建request对象
        request = urllib2.Request(abs_url, headers=self.headers)

        # 发出请求,获取响应数据
        try:
            response = urllib2.urlopen(request)
        except Exception, e:
            print '连接失败,原因是:',e
            # 链接失败
            return None
        else:
            # 响应成功,将网页源代码进行返回,交由下一个函数进行数据的提取。
            return response.read()

    # 定义提取网页数据的函数
    def get_info_by_page_code(self, html_string):
        # 准备正则表达式
        pattern = re.compile(r'<div class="author clearfix">.*?<h2>(.*?)</h2>.*?<div class="content">.*?<span>(.*?)</span>.*?<div class="stats">.*?<i class="number">(.*?)</i>.*?<i class="number">(.*?)</i>', re.S)
        results_list = re.findall(pattern, html_string)

        for data in results_list:
            # 将data元组,传递到DataTool类的函数参数中进行过滤,得到一个新的元组。
            res_tuple = self.tool.update_res(data)
            # print '昵称:', res_tuple[0]
            # print '内容:', res_tuple[1]
            # print '好笑数:{}个'.format(res_tuple[2])
            # print '评论数:{}个'.format(res_tuple[3])
            DBManager.insert_data(res_tuple)
if __name__ == '__main__':

    # 链接数据库
    DBManager.db_and_cursor()

    qsbk_spider = QSBKSpider()
    for x in xrange(1,3):
        html_string = qsbk_spider.get_origin_page_code(x)
        if html_string != None:
            qsbk_spider.get_info_by_page_code(html_string)

    # 关闭数据库
    DBManager.close_db()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值