Python + Sqlite3 爬取糗事百科段子

https://www.qiushibaike.com/hot/

工具类简单爬取数据

# python3.7
import re
from urllib.request import Request, urlopen


class DataTool(object):
    """
    工具类:对提取到的元组里面的数据,进行整理,去掉无效的字符(\n、
) """ # 定义删除无用字符的规则 pattern_n = re.compile(r'\n', re.S) pattern_br = re.compile(r'
', re.S) def update_tuple_data(self, origin_tuple_data): """ 对提取到的原始元组进行无效内容删除 :param origin_tuple_data: 提取到的原始数据元组 :return: 返回整理好之后的元组 """ nick_name = re.sub(self.pattern_n, '', origin_tuple_data[0]) # 去除昵称里的'\n' content = re.sub(self.pattern_n, '', origin_tuple_data[2]) # 去除内容里的'\n' content = re.sub(self.pattern_br, '', content) # 进一步去除内容里的'
' data = (nick_name, origin_tuple_data[1], content, origin_tuple_data[3], origin_tuple_data[4]) return data # 返回整理后的元组 class Spider(object): """ 爬虫类 """ def __init__(self): # Spider对象的初始化方法 self.base_url = 'https://www.qiushibaike.com/hot/page/' # 将不同页面路径的相同部分声明为类的一个属性 self.headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) ' 'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'} # 请求头 self.tool = DataTool() # 工具类DataTool实例化 def get_html(self, page_num): """ 获取页面的HTML源代码 :param page_num: 页数 :return: 返回页面HTML源代码 """ page_url = self.base_url + str(page_num) # 构造页面url request = Request(page_url, headers=self.headers) # 构造request请求对象 try: response = urlopen(request) # urlopen()函数用于对目标url的访问,获取到页面的数据格式为bytes类型,需要decode()解码,转换成str类型 except Exception as e: print('请求失败,地址为{},原因为{}'.format(page_url, e)) return None else: return response.read().decode() # 请求成功,提取数据并解码 def parse_html(self, html): """ 解析得到的HTML源代码 :param html: 网页源代码 :return: """ if html: pattern = re.compile(r'
.*?

(.*?)

.*?
(.*?)
.*?
.*?(.*?).*?
.*?(.*?).*?(.*?)', re.S) results_list = re.findall(pattern, html) # findall根据正则表达式去html里循环匹配,返回一个列表 for data in results_list: new_data = self.tool.update_tuple_data(data) # 去除无效内容 print(new_data) else: print('没有获取到HTML源代码') if __name__ == '__main__': obj = Spider() html = obj.get_html(2) # 爬取前2页 obj.parse_html(html)


工具类 + Sqlite3数据库 + User-Agent随机化

import re
import sqlite3
from urllib.request import Request, urlopen
from fake_useragent import UserAgent  # fake_useragent为第三方库,它维护了各种主流浏览器的UA标识
# ua = UserAgent(use_cache_server=False)  # 可能会报fake_useragent.errors.FakeUserAgentError,加上此句禁用服务器缓存来解决


class DataTool(object):
    """
    工具类:对提取到的元组里面的数据,进行整理,去掉无效的字符(\n、
) """ # 定义删除无用字符的规则 pattern_n = re.compile(r'\n', re.S) pattern_br = re.compile(r'
', re.S) def update_tuple_data(self, origin_tuple_data): """ 对提取到的原始元组进行无效内容删除 :param origin_tuple_data: 提取到的原始数据元组 :return: 返回整理好之后的元组 """ nick_name = re.sub(self.pattern_n, '', origin_tuple_data[0]) # 去除昵称里的'\n' content = re.sub(self.pattern_n, '', origin_tuple_data[2]) # 去除内容里的'\n' content = re.sub(self.pattern_br, '', content) # 进一步去除内容里的'
' data = (nick_name, origin_tuple_data[1], content, origin_tuple_data[3], origin_tuple_data[4]) return data # 返回整理后的元组 class DBTool(object): """ 数据库工具类,包括数据库的增删改查,此程序中主要为将爬到的数据添加到数据库 """ connect = None cursor = None @classmethod def create_db_cursor(cls): """ 创建数据库连接对象、游标对象,开始连接一次即可 :return: """ cls.connect = sqlite3.connect('qsbk.db') cls.cursor = cls.connect.cursor() @classmethod def close_db_cursor(cls): """ 关闭两个对象,数据保存完毕关闭即可 :return: """ cls.cursor.close() cls.connect.close() @classmethod def insert_sql(cls, tuple_data): """ 执行插入操作的sql语句 :param tuple_data: 元组形式的每一条数据 :return: """ sql = 'INSERT INTO qs (nick_name, level, content, vote_number, comment_number) VALUES ("%s", "%s", "%s", "%s", "%s")' % (tuple_data[0], tuple_data[1], tuple_data[2], tuple_data[3], tuple_data[4]) cls.cursor.execute(sql) # 执行sql语句 cls.connect.commit() # 提交到数据库执行 class Spider(object): """ 爬虫类 """ def __init__(self): # Spider对象的初始化方法 self.base_url = 'https://www.qiushibaike.com/hot/page/' # 将不同页面路径的相同部分声明为类的一个属性 # self.headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) ' # 'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'} # 请求头 self.tool = DataTool() # 工具类DataTool实例化 self.ua = UserAgent() # 实例化ua对象 def get_html(self, page_num): """ 获取页面的HTML源代码 :param page_num: 页数 :return: 返回页面HTML源代码 """ page_url = self.base_url + str(page_num) # 构造页面url headers = {'User-Agent': self.ua.random} # User-Agent随机化 request = Request(page_url, headers=headers) # 构造request请求对象 try: response = urlopen(request) # urlopen()函数用于对目标url的访问,获取到页面的数据格式为bytes类型,需要decode()解码,转换成str类型 except Exception as e: print('请求失败,地址为{},原因为{}'.format(page_url, e)) return None else: return response.read().decode() # 请求成功,提取数据并解码 def parse_html(self, html): """ 解析得到的HTML源代码 :param html: 网页源代码 :return: """ if html: pattern = re.compile(r'
.*?

(.*?)

.*?
(.*?)
.*?
.*?(.*?).*?
.*?(.*?).*?(.*?)', re.S) results_list = re.findall(pattern, html) # findall根据正则表达式去html里循环匹配,返回一个列表 for data in results_list: new_data = self.tool.update_tuple_data(data) # 去除无效内容 # print(new_data) DBTool.insert_sql(new_data) else: print('没有获取到HTML源代码') if __name__ == '__main__': DBTool.create_db_cursor() obj = Spider() for i in range(10): # 爬取前10页 html = obj.get_html(i+1) obj.parse_html(html) DBTool.close_db_cursor()


数据库中爬取到的数据

你可能感兴趣的:(Python + Sqlite3 爬取糗事百科段子)