入门级Python 正则表达式与Sqlite3数据库练习 爬取糗事百科热门

Python 自学爬坑,今天刚刚接触正则表达式,以前写的入门级爬虫都是用xpath解析,现在发现正则也还蛮实用,只是一大堆符号还需要时间慢慢掌握,截止目前,仅会使用’.*?'走天下。

在这里插入图片描述

使用正则解析某网站,并写入数据库,写完了这个,准备用面向对象爬某dou瓣top250~手动狗头。

爬取网站之前的准备流程:
1.研究正常用户浏览网页数据的步骤
2.研究网站数据的加载方式,例如:静态页面、js动态加载…
3.测试普通的请求能否拿回数据
4.研究网站数据加载规则及反爬措施,例如:携带cookie、携带指定参数、携带签名认证…
5.开始编写爬虫项目

码子不是很长,索性一并放上来,后面会有图片解析~ Let’s do it!!

import requests##引入请求库
import re#引入正则
import sqlite3#引入sqlite3数据库
import time#引入时间模块,控制访问速度
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 6.2; WOW64; rv:21.0) Gecko/20100101 Firefox/21.0'
}#请求头
url = 'https://www.qiushibaike.com/hot/'#起始页地址
db = sqlite3.connect('QSBK.db')#连接数据库,如没有同名数据库,则默认建立
cursor = db.cursor()#连接数据库游标
create_sql = "CREATE TABLE IF NOT EXISTS QSBK_DATA (ID INTEGER PRIMARY KEY,段子作者 VARCHAR(20),作者年龄 INTEGER (10),内容 VARCHAR )"##创建数据库sql语句
cursor.execute(create_sql)##执行sql语句
while True:###因之后要翻页,遂循环
    response = requests.get(url,headers=headers)#请求返回数据
    time.sleep(1)
    html = response.text#将获取到的网页源代码内容的文本定义给一个变量html,以便解析
    pattern = re.compile(r'h2>(.*?)</h.*?>(\d\d)</div>.*?<span>(.*?)</span>',re.S)#编写正则表达式规则,提取作者,作者年龄,内容
    result = re.findall(pattern,html)###findall()函数 查找所有结果,得到一个列表,包含元组数据,元组里包含的就是作者,作者年龄,内容
    for idx,info in enumerate(result):#枚举法 遍历结果内的所有内容,其实枚举法并无必要 也就是练习一下
        #print(idx,'\n',author,age,'\n',content.strip('\n').replace('<br/>','\n'))#测试输出结果
        author = info[0]
        age = info[1]
        content = info[-1]
        print('正在将爬取内容写入导数据库.')
        print('✿'*80)
        insert_sql = f"INSERT INTO QSBK_DATA (段子作者,作者年龄,内容) VALUES ('{author}',{age},'{content}')"##建立sql语句,数据插入到数据库
        cursor.execute(insert_sql)##执行sql语句
        db.commit()##提交执行
    ul_pattern = re.compile(r'<ul class="pagination">.*?</ul>',re.S)#查找下一页,因ul标签里包含数据结构相同,先编写正则表达式提取ul标签包裹的内容
    ul_result = re.search(ul_pattern,html)#获取结果,正则表达式的search()函数,得到的会是一个对象
    #print(ul_result.group())  如需输出结果 ,需调用group()函数
    next_pattern = re.compile(r'a href="(.*?)".*?next">(.*?)</span>',re.S)#编写下一页的正则式
    next_result = re.findall(next_pattern,ul_result.group())#根据正则表达式 提取下一页的短网址以及文字'下一页'
    time.sleep(1)
    if next_result:##如果下一页的结果为真为True
        url ='https://www.qiushibaike.com' + next_result[0][0]#那么拼接下一页的完整网址
        print('正在爬取下一页内容....')
        print('■'*50)
    else:
        print('爬取完成!')
        print('☀'*50)
        cursor.close()##关闭数据库游标
        db.close()##关闭数据库
        break

作者及内容正则表达式编写↓↓↓↓↓↓↓

在这里插入图片描述

下一页正则表达式编写↓↓↓↓↓↓↓↓

在这里插入图片描述

将下一页短址从列表+元组按照索引提取↓↓↓↓↓↓

在这里插入图片描述

获取下一页网之后 重新开始循环↓↓↓↓↓↓↓↓↓↓↓↓

在这里插入图片描述

数据库界面↓↓↓↓↓↓↓↓

在这里插入图片描述

ps:可能访问过快,截止发稿前,已经connection error~

发布了12 篇原创文章 · 获赞 22 · 访问量 3252

猜你喜欢

转载自blog.csdn.net/bosslay/article/details/88649409