正则的应用--糗事百科(数据写入数据库中)

一.基本知识

1.delete from qsbk先删除数据库中的数据,在执行本文件

2.需要引入的包

import re
import time
from tool import Tools, DBManager
from urllib import request
from fake_useragent import UserAgent
agent = UserAgent()
3.当网页在第一页的时候,可以获取到下一页,但是当网页在最后一页的时候,无法获取到下一页

4.获取下一页

法一(获取下一页时候...位置一直在变化,所有无法用正则获取到下一页): 

# 正则直接找不到下一页,先找到下一页的字符
        index = self.html.find('class="next"')
        # index如果找不到 返回-1
        print(index)
        # 如果没找到下一页
        if index != -1:
            # 截取下一页前后部分的字符串
            s = self.html[index-90:index]
            # print(s)
            # 在使用正则从截取的字符串中进行匹配
            pattern = re.compile('href="(.*?)"')
            next_href = re.search(pattern, s)
            page = next_href.group(1).split('/')[-2]
            print('正在爬取第{}页'.format(page))
            self.url = 'https://www.qiushibaike.com' + next_href.group(1)
            self.get_html()
            # 调用自身函数  解析数据
            self.parse_data()
        else:
            print('没有下一页')
法二:(用正则获取下一页)
       
# next_pat = re.compile('<span class="next">(.*?)</span>',re.S)
        # res = re.search(next_pat,self.html)
        # if res:
        #     print('正在处理下一页数据.......')
        #     # 查找下一页的链接 正则
        #     next_pat = re.compile('<span class="dots".*?<a.*?<a.*?<a href="(.*?)".*?>.*?<span.*?>',re.S)
        #     res = re.search(next_pat,self.html)
        #     # 拼接完整的链接
        #     self.url = 'https://www.qiushibaike.com'+res.group(1)
        #     print(self.url)
        #     self.get_html()
        #     # 调用函数本身,解析数据
        #     self.parse_data()
        #
        # else:
        #     print('没有下一页了')  

二.完整代码

# -*- coding:utf-8 -*-
import re
import time
from tool import Tools, DBManager
from urllib import request
from fake_useragent import UserAgent
agent = UserAgent()


class QSBKSpider(object):

    def __init__(self):
        self.url = 'https://www.qiushibaike.com/text/page/1'
        self.headers = {'User-Agent': agent.random}
        self.html = ''

    def get_html(self):
        count = 1
        while True:
            try:
                req = request.Request(url=self.url, headers=self.headers)
                response = request.urlopen(req)
                self.html = response.read().decode('utf-8')
            except Exception as e:
                count += 1
                if count > 10:
                    print('当前页数据获取失败!')
                    break
                print('%s,正在尝试第%s次连接...' % (e, count))
            else:
                break

    # 解析数据
    def parse_data(self):
        # 准备正则
        pattern = re.compile('<div.*?class="author.*?<h2>(.*?)</h2>.*?<div class="articleGender.*?>(.*?)</div>.*?<div class="content.*?<span>(.*?)</span.*?<i class="number.*?>(.*?)</i.*?<i.*?>(.*?)</i>', re.S)
        res = re.findall(pattern, self.html)
        # print(res)
        for info in res:
            msg = list(info)
            msg[0] = Tools.strip_char(info[0])
            msg[2] = Tools.strip_char(info[2])
            # print('用户昵称:{}\n年龄:{}\n内容:{}\n好笑数:{}\n评论数:{}\n'.format(name, info[1], content, info[3], info[4]))
            DBManager.insert_data(msg)
        # 正则直接找不到下一页,先找到下一页的字符
        index = self.html.find('class="next"')
        # index如果找不到 返回-1
        print(index)
        # 如果没找到下一页
        if index != -1:
            # 截取下一页前后部分的字符串
            s = self.html[index-90:index]
            # print(s)
            # 在使用正则从截取的字符串中进行匹配
            pattern = re.compile('href="(.*?)"')
            next_href = re.search(pattern, s)
            page = next_href.group(1).split('/')[-2]
            print('正在爬取第{}页'.format(page))
            self.url = 'https://www.qiushibaike.com' + next_href.group(1)
            self.get_html()
            # 调用自身函数  解析数据
            self.parse_data()
        else:
            print('没有下一页')

        # next_pat = re.compile('<span class="next">(.*?)</span>',re.S)
        # res = re.search(next_pat,self.html)
        # if res:
        #     print('正在处理下一页数据.......')
        #     # 查找下一页的链接 正则
        #     next_pat = re.compile('<span class="dots".*?<a.*?<a.*?<a href="(.*?)".*?>.*?<span.*?>',re.S)
        #     res = re.search(next_pat,self.html)
        #     # 拼接完整的链接
        #     self.url = 'https://www.qiushibaike.com'+res.group(1)
        #     print(self.url)
        #     self.get_html()
        #     # 调用函数本身,解析数据
        #     self.parse_data()
        #
        # else:
        #     print('没有下一页了')

    def start(self):
        self.get_html()
        # print(self.html)
        self.parse_data()


if __name__ == '__main__':
    # 连接数据库
    DBManager.connect_db()
    # 爬虫
    qsbk = QSBKSpider()
    qsbk.start()
    # 关闭数据库
    DBManager.close_db()

# delete from qsbk
 

运行结果

打开数据库:获取到325条数据,但是数据库每页只显示20条数据



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值