Python爬虫数据到sqlite实例

news2024/9/20 22:43:09

参考链接:https://blog.csdn.net/qq_45775027/article/details/115319253

最近需要使用到爬虫+数据库,原文中作者有些没补齐,略作修改之后跑通了。

主要修改:

1.调整了数据获取的正则表达式;

2. 改了一下数据库的table名和定义名字;

3.加了数据清洗的模块;

实现了爬取qs大学排名,以及存储数据到数据库。

1.效果如下图:

2.使用工具以及环境:

python3.7环境,数据库软件navicat161_premium_en_x86.exe。

一键运行代码,生成对应的db文件,查看内容,和预期一致。

3.完整代码如下:

##参考链接:https://blog.csdn.net/qq_45775027/article/details/115319253

import sqlite3
import re
import time
import requests
from lxml import html

findNameData = re.compile(r'<td style="outline: none !important;">(.*?)</td>')
                         
# =============================================================================
# findname = re.compile(r'<a href=".*?">(.*?)</a>')
# findname3 = re.compile(
#     r'<td style="outline: 0px !important;"><p style="line-height: 1.8; outline: 0px !important;">(.*?)</p></td>')
# findname4 = re.compile(
#     r'<td style="outline: 0px !important;"><p style="line-height: 1.8; outline: 0px !important;"><a href=".*?">(.*?)</a>.*?</p></td>')
# findaddres = re.compile(r'<td style="outline: 0px !important;">(.*?)</td>')
# findadress1 = re.compile(r'<td style="outline: 0px !important;"><a href=".*?">(.*?)</a></td>')
# 
# findlink = re.compile(r'<a href="(.*?)"')  # 创建正则表达式对象,表示规则(字符串的模式)
# =============================================================================

'''
通过findall找到所有table里面的tr
然后对tr里面的内容进行解析,如果没有链接,则data添加信息为空,有链接调用函数来解析链接网页
再向数据库传输解析内容
'''

def main():
    basicurl = "http://www.qianmu.org/ranking/1528.htm"
    datalist = getData(basicurl)
    #datalist = [[166,11,12,13],[188,22,23,24]]
    
    for data in datalist:
        print(data)
    saveDatadb(datalist,"rankData.db")


# 得到一个指定的网页内容
def askURL(url):
    et = html.etree
    respon = requests.get("http://www.qianmu.org/ranking/1528.htm")
    selector = et.HTML(respon.text)
    return selector

# 爬取主网页,将网页的tr提取出来进行分析
def getData(basicurl):
    datalist = []
    selector = askURL(basicurl)
    # 找出每个tr,对每个tr解析
    trs = selector.xpath('//div[@class="rankItem"]//tr[position()>1]')
    # names = selector.xpath('//div[@class="rankItem"]//tr[position()>1]/td/a/text() | //div[@class="rankItem"]//tr['
    #                        'position()>1]/td[2]/text()')
    # links = selector.xpath('//div[@class="rankItem"]//tr[position()>1]/td/a/@href')
    # 获得了每一个tr内容
    for tr in trs:
        data = []
        tr = html.tostring(tr, encoding='utf-8').decode('utf-8')
        name1 = re.findall(findNameData, tr)
        for tmp in range(len(name1)):
            name1[tmp] = cleanData(name1[tmp])
            print(name1[tmp])
        data.append(name1[1])
        data.append(name1[2])    
        data.append(name1[3])
        data.append(name1[0])
        datalist.append(data)

    return datalist

# 清洗数据,去除<>及中间内容,将"替换为'
def cleanData(basename):
    if not basename:
        return

    while ( "<" in basename):
        s_index = basename.index("<")
        e_index = basename.index(">")
        rm_str = basename[s_index:e_index+1]
        basename = basename.replace(rm_str,"")
    while ( "\"" in basename):
        basename = basename.replace('\"','\'')

    return basename

# 保存数据
def saveDatadb(datalist, dbpath):
    init_db(dbpath)
    conn = sqlite3.connect(dbpath)
    cur = conn.cursor()  # 获取游标
    # print("我执行了")
    for data in datalist:
        for index in range(len(data)):
            data[index] = '"' + str(data[index]) + '"'  # '"'+data[index]+'"'
        sql = '''
            insert into rankData(
            name, ename, address, rank) 
            values (%s)''' % ",".join(data)

        print(sql)
        cur.execute(sql)
        conn.commit()  # 提交
    cur.close()
    conn.close()  # 关闭链接

# 创建数据库
def init_db(dbpath):
    #创建表之前判断不存在才创建,存在则跳过
    sql = '''
        create table rankData(
        id integer primary key autoincrement,
        name text ,
        ename text ,
        address text ,
        rank text
        );
    '''

    conn = sqlite3.connect(dbpath)  # 建表
    cursor = conn.cursor()  # 游标
    cursor.execute(sql)  # 执行sql语句建表
    conn.commit()  # 提交
    conn.close()  # 关闭

if __name__ == "__main__":  # 当程序执行时,调用函数  这样写的目的是严格控制函数执行的主流程
    main()


4.上述程序使用的sqlite数据库,无需单独配置。

完整代码如上,本次实验对应的db文件以及数据库软件,已上传,设置的0积分,如果需要自行下载。

https://download.csdn.net/download/zhangb98/87364130

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/141987.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Java+SpringBoot+vue+element实现前后端分离牙科诊所管理系统详细设计

基于JavaSpringBootvueelement实现前后端分离牙科诊所管理系统详细设计 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 欢迎点赞 收藏 ⭐留言 文末获取源码联系方式 文章目…

【Linux】虚拟地址空间 --- 虚拟地址、空间布局、内存描述符、写时拷贝、页表…

该吃吃&#xff0c;该喝喝&#xff0c;遇事儿别往心上隔&#x1f60e; 文章目录一、虚拟地址空间1.虚拟地址的引出&#xff08;看不到物理地址&#xff0c;只能看看虚拟地址喽&#xff09;2.虚拟地址空间布局&#xff08;五个段&#xff09;3.感性理解一下虚拟地址空间&#xf…

【C++修炼之路】C++入门(上)

&#x1f451;作者主页&#xff1a;进击的安度因 &#x1f3e0;学习社区&#xff1a;进击的安度因&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;C修炼之路 文章目录一、前言二、第一个 C 程序三、C 关键字(C98)四、命名空间1、命名空间的定义2、命名空间…

C++ Prime课后习题第一章编程

编程一个C程序&#xff0c;它显示您的姓名和地址。#include <iostream>int stonetolb(int); int main() {using namespace std;cout << "zzz ";cout << "闵行"<<endl;return 0; }编写一个程序&#xff0c;要求用户输入一个以long…

3台机器配置hadoop集群_Hadoop+Hbase 分布式集群架构

安装搭建Hadoop1、 配置说明本次集群搭建共三台机器&#xff0c;具体说明下&#xff1a;主机名IP说明nn01192.168.1.51DataNode、NodeManager、ResourceManager、NameNodedn01192.168.1.52DataNode、NodeManager、SecondaryNameNodedn02192.168.1.53DataNode、NodeManager2 、安…

基于浏览器的 PDF 编辑器:RAD PDF for ASP.NET

版本 3.34 改进的 PDF 收藏/投资组合支持和服务器 API 改进 Ω578867473功能更新 为更基本的 PDF 文件损坏/语法错误添加了更正添加了 PdfButtonField.NamedAction 属性添加了 PdfButtonField.IsNamedAction 属性添加 PdfButtonField() 构造函数 - PdfButtonFields 可以由服…

unity-常用组件实操案例

文章目录transform摄像机cameraskybox相机权重&#xff08;depth&#xff09;Audio sourcevideo playertransform 不但控制着组件的旋转、位置、缩放并且还控制着组件间的父子关系 using System; using System.Collections; using System.Collections.Generic; using UnityEn…

不锈钢企业如何利用APS排程软件提升管理效益?

保温杯一般是由陶瓷或不锈钢加上真空层做成的盛水容器&#xff0c;顶部有盖&#xff0c;密封严实&#xff0c;真空绝热层能使装在内部的水等液体延缓散热&#xff0c;以达到保温的目的。保温杯从保温瓶发展而来的&#xff0c;保温原理与保温瓶一样&#xff0c;只是人们为了方便…

Collection

面向对象语言对事物的体现都是以对象的形式&#xff0c;所以为了方便对多个对象的操作&#xff0c;就对对象进行存储&#xff0c;集合就是存储对象最常用的一种方式 数组和集合的不同&#xff1a; 数组长度是固定的&#xff1b;集合长度是可变的。 数组中可以存储基本数据类…

C#在控制台中打印进度条【同步和异步】

使用控制台打印进度条的简单方法。 有现成的IProgress接口进行操作&#xff1a; 实例&#xff1a; var prog new Progress<double>((theV > {Console.WriteLine($"Now the Progress&#xff1a;" COUNT / 10.0 * 100 "%" new string(#, COUN…

社科院与杜兰大学金融管理硕士---授人以鱼不如授人以渔,培养全新金融人才

古人云&#xff1a;“授人以鱼&#xff0c;三餐之需&#xff1b;授人以渔&#xff0c;终身之用”。都说职场入战场&#xff0c;一入职场就如履薄冰。走的每一步可能都影响着自己的职业生涯。在职场无烟的战争中&#xff0c;会慢慢发现差距一点点的被拉开了。金融是现代经济的血…

开发工具(二)基于Source Insight与Samba共享在windows中开发Linux工程

layout: post title: 开发工具&#xff08;二&#xff09;基于Source Insight与Samba共享在windows中开发Linux工程 description: 开发工具&#xff08;二&#xff09;基于Source Insight与Samba共享在windows中开发Linux工程 tag: 开发工具 文章目录资源共享流程说明Source In…

2023,让RFID固定资产管理系统助力企业降本增效

随着企业规模的不断扩大&#xff0c;企业的固定资产管理成为一个关键的问题。因为面临这不断增多的员工、固定资产种类和固定资产数量&#xff0c;企业管理者开始慢慢重视固定资产的管理&#xff0c;纷纷采取不同的方法加强对固定资产的管理。由于管理方法的不同&#xff0c;其…

C++ 智能指针 : auto_ptr 、unique_ptr、 shared_ptr、 weak_ptr

1、智能指针设计初衷&#xff1a; 智能指针实际是类&#xff0c;超过类的作用域后&#xff0c;析构函数会自动回收资源&#xff0c;为程序员管理申请的堆内存&#xff0c;避免内存泄漏 2、C 智能指针种类&#xff1a; auto_ptr &#xff08;C98 的⽅案&#xff0c;C11 已抛…

5G NR标准: 第17章 LTE/NR互通和共存

第17章 LTE/NR互通和共存 新一代移动通信技术的初始部署通常发生在交通密度高、对新服务能力要求高的地区。 然后是逐渐的进一步扩建&#xff0c;根据运营商的策略&#xff0c;扩建的速度或快或慢。 在随后的逐步部署过程中&#xff0c;新技术和传统技术的混合将提供对运营商…

实习------SpringBoot 框架

Spring Boot 是什么 (了解)Spring Boot 是 Spring 开源组织下的子项目&#xff0c;其设计目的是专注于Spring应用的开发&#xff0c;开发人员可以把更多的精力放在业务代码上&#xff0c;而无需过多关注XML的配置&#xff0c;从而简化Spring应用开发&#xff0c;提高开发效率Sp…

【Linux网络管理】之ip、nmcli

文章目录一、验证网络配置1. ip link命令将列出系统上可用的所有网络接口2. ip命令查看设备和地址信息3. ip命令显示性能统计信息4. ip命令以及route选项来显示路由信息5. 添加-6选项可显示IPv6路由器二、查看联网信息1.nmcli dev status命令可显示所有网络设备的状态2.nmcli c…

JDBC基础内容

JDBC的概念&#xff1a; JDBC就是使用java语言操作关系数据库的一套API&#xff0c;全称为(java DataBase Connectivity)-----java数据库连接. JDBC的本质&#xff1a; 是由sun公司定义的一套操作所有关系型数据库的规则&#xff0c;即接口&#xff0c;各个数据库厂商去实现…

更智能行车记录仪,4K画质超清晰,凌度行车记录仪 4K版上手

行车记录仪是很多车友的必需品&#xff0c;这两年行车记录仪的提升非常明显&#xff0c;如今市面上已经能够找到很多4K分辨率的产品了&#xff0c;相比于早期只要有480P分辨率的记录仪&#xff0c;清晰度和可靠性都更加出色&#xff0c;确实有升级的必要。 这两天我尝试了一款华…

P2141 [NOIP2014 普及组] 珠心算测验————C++

题目 [NOIP2014 普及组] 珠心算测验 题目描述 珠心算是一种通过在脑中模拟算盘变化来完成快速运算的一种计算技术。珠心算训练&#xff0c;既能够开发智力&#xff0c;又能够为日常生活带来很多便利&#xff0c;因而在很多学校得到普及。 某学校的珠心算老师采用一种快速考…