爬虫小案例:爬取豆瓣网TOP250的电影信息(内含面相对象源码、及详细教学)

news2024/9/28 1:09:57

爬虫案例二———爬取豆瓣网TOP250的电影信息,并存入MySQL数据库

前提准备

  • 安装pymysql库
pip install pymysql -i https://pypi.tuna.tsinghua.edu.cn/simple 
  • Python连接MySQL数据库,并进行增删改查基本操作
  1. 连接数据库
"""
    连接MySQL数据库,并进行增删改查,同时查询了MySQL版本号,并做了动态注册的账号,实现过程:先向userinfo当中添加account、password新字段,接着通过insert插入数据,要注意的是,若是其他字段设置为not null,则必须插入内容。
"""
import pymysql.cursors

# 尝试连接数据库
try:
    connect = pymysql.Connect(
        host='localhost', 
        port=3307,
        user='root',
        password='123456',
        db='school',
        charset='utf8'
    )
    print("数据库连接成功")
except pymysql.err.OperationalError as e:
    print(f"数据库连接失败: {e}")
  1. 创建数据表
cursor = connect.cursor()

sql = """
CREATE TABLE IF NOT EXISTS userinfo(
    uid INT PRIMARY KEY AUTO_INCREMENT,
    uname VARCHAR(20) NOT NULL,
    uage INT
);
"""
cursor.execute(sql)
print("表创建成功")
  1. 插入数据
sql2 = "INSERT INTO userinfo(uname, uage) VALUES (%s, %s)"
data1 = ('ann', 18)
data2 = ('alice', 28)
data3 = ('rose', 20)

for data in [data1, data2, data3]:
    cursor.execute(sql2, data)
connect.commit()
print('数据插入成功')
  1. 修改数据
sql4 = "SELECT * FROM userinfo"
cursor.execute(sql4)
rows = cursor.fetchall()
for row in rows:
    print("ID:%s\t姓名:%s\t年龄:%s\t" % (row[0], row[1], row[2]))
  1. 补充查看MySQL数据库的版本号
cursor.execute("SELECT VERSION()")
version = cursor.fetchone()
print("MySQL数据库版本是:%s" % version)
  1. 关闭数据的连接释放资源
cursor.close()
connect.close()
print("数据库连接已关闭")

案例代码

"""
本面向对象,旨在爬取豆瓣网电影排行榜的电影信息,主要包含电影名称,电影宣传语,其中存入数据库的ID值即为电影排名
在使用本程序时,需要 1.输入端口号、2.输入你数据库密码、3.输入你需要新建的数据库名、4.输入你需要新建的数据表名
在完成以上4步操作后,会自动连接数据库(前提你MySQL服务已经打开),自动创建数据库、表,自动解析项目下douban.html
的内容,最后将数据插入数据库并展示在控制台,如果需要清除数据库的数据,请在db.close()前调用db.clear_data()
最后该程序还扩充了线上URL爬取,选择爬取数据条数等功能

"""
import pymysql
from bs4 import BeautifulSoup
import re
import requests
class MovieDatabase:
    def __init__(self, host, port, db, user, password, charset, tName, newDB, getNum):
        self.host = host
        self.port = port
        self.db = db
        self.user = user
        self.password = password
        self.charset = charset
        self.conn = None
        self.cursor = None
        self.tableName = tName
        self.newDB = newDB
        self.getNum = getNum
        conn = pymysql.connect(
            host=self.host,
            port=self.port,
            user=self.user,
            password=self.password,
            charset=self.charset,
            db=self.db
        )
        self.conn = conn
        self.cursor = conn.cursor()
    def connect(self):
        try:
            self.conn = pymysql.connect(
                host=self.host,
                port=self.port,
                db="test",
                user=self.user,
                password=self.password,
                charset=self.charset
            )
            self.cursor = self.conn.cursor()
            print('数据库连接成功')
        except pymysql.MySQLError as e:
            print(f'数据库连接失败,尝试创建数据库和数据表: {e}')
            self.create_database()
            self.create_table()
            # 重新初始化连接
            self.conn = pymysql.connect(
                host=self.host,
                port=self.port,
                db="test",
                user=self.user,
                password=self.password,
                charset=self.charset
            )
            self.cursor = self.conn.cursor()
            print('数据库连接成功')

    def create_database(self):
        sql1 = "use test"
        sql = f"CREATE DATABASE IF NOT EXISTS {self.newDB}"
        self.cursor.execute(sql1)
        self.cursor.execute(sql)
        print('数据库创建成功')


    def create_table(self):
        sql1 = f"use {self.newDB}"
        sql = f"""
        CREATE TABLE IF NOT EXISTS {self.tableName} (
            id INT AUTO_INCREMENT PRIMARY KEY,
            moviename VARCHAR(255),
            inq VARCHAR(255),
            fenshu VARCHAR(255),
            likeNum VARCHAR(255)
        ) ENGINE=INNODB DEFAULT CHARSET=utf8;
        """
        self.cursor.execute(sql1)
        self.cursor.execute(sql)
        print('数据表创建成功')

    def insert_data_online(self):
        if self.getNum == -25:
            ii = self.getNum + 25
            while True:
                # print(ii)
                if ii < 226:
                    # 网页URL爬取
                    headers = {
                        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36'}
                    response = requests.get(f'https://movie.douban.com/top250?start={ii}&filter=', headers=headers)
                    # print(ii - 25)

                    # 检查请求状态
                    if response.status_code != 200:
                        print(f'请求异常,状态码: {response.status_code}')
                        return  # 退出函数,不执行后续插入操作

                    soup = BeautifulSoup(response.text, 'html.parser')  # 创建对象
                    # 电影名称的获取

                    title = soup.select('a>span.title:nth-of-type(1)')
                    names = []
                    for p in title:
                        names.append(p.get_text())

                    # 获取内容
                    contents = []
                    likeNum = []
                    rs2 = soup.select("div.info>div.bd")

                    for p in rs2:
                        xcy = p.select("span.inq")
                        if len(xcy) > 0:
                            contents.append(xcy[0].get_text())
                        else:
                            contents.append("NUll")
                        num = p.select("span.rating_num")
                        likeNum.append(num[0].get_text())

                    # 点赞数提取
                    num1 = []
                    rs3 = soup.select("div.star>span:nth-of-type(4)")
                    for n in rs3:
                        number = re.findall(r'\d+', n.get_text())
                        num1.append(number[0])
                    for i in range(len(num1)):
                        sql = f"INSERT INTO {self.tableName}(moviename, inq, fenshu, likeNum) VALUES (%s, %s, %s, %s)"
                        insertData = (names[i], contents[i], likeNum[i], num1[i])
                        self.cursor.execute(sql, insertData)
                    self.conn.commit()
                    print('数据插入成功')
                    ii += 25
                    print(ii)
                else:
                    break
        else:
            pp = self.getNum * 25
            headers = {
                'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36'}
            response = requests.get(f'https://movie.douban.com/top250?start={pp}&filter=',
                                    headers=headers)

            # 检查请求状态
            if response.status_code != 200:
                print(f'请求异常,状态码: {response.status_code}')
                return  # 退出函数,不执行后续插入操作

            soup = BeautifulSoup(response.text, 'html.parser')  # 创建对象
            # 电影名称的获取

            title = soup.select('a>span.title:nth-of-type(1)')
            names = []
            for p in title:
                names.append(p.get_text())

            # 获取内容
            contents = []
            likeNum = []
            rs2 = soup.select("div.info>div.bd")

            for p in rs2:
                xcy = p.select("span.inq")
                if len(xcy) > 0:
                    contents.append(xcy[0].get_text())
                else:
                    contents.append("NUll")
                num = p.select("span.rating_num")
                likeNum.append(num[0].get_text())

            # 点赞数提取
            num1 = []
            rs3 = soup.select("div.star>span:nth-of-type(4)")
            for n in rs3:
                number = re.findall(r'\d+', n.get_text())
                num1.append(number[0])
            for i in range(len(num1)):
                sql = f"INSERT INTO {self.tableName}(moviename, inq, fenshu, likeNum) VALUES (%s, %s, %s, %s)"
                insertData = (names[i], contents[i], likeNum[i], num1[i])
                self.cursor.execute(sql, insertData)
            self.conn.commit()
            print('数据插入成功')

    def insert_data_localhost(self):


        with open('douban10.html', 'r', encoding='utf-8') as file:
            html = file.read()
        soup = BeautifulSoup(html, 'html.parser')  # 创建对象
        # 电影名称的获取

        title = soup.select('a>span.title:nth-of-type(1)')
        names = []
        for p in title:
            names.append(p.get_text())
        # print("names:", names)

        # 获取内容
        contents = []
        likeNum = []
        rs2 = soup.select("div.info>div.bd")

        for p in rs2:
            xcy = p.select("span.inq")
            if len(xcy) > 0:
                contents.append(xcy[0].get_text())
            else:
                contents.append("NUll")
            num = p.select("span.rating_num")
            likeNum.append(num[0].get_text())

        # 点赞数提取
        num1 = []
        rs3 = soup.select("div.star>span:nth-of-type(4)")
        for n in rs3:
            number = re.findall(r'\d+', n.get_text())
            num1.append(number[0])
        for i in range(len(num1)):
            sql = f"INSERT INTO {self.tableName}(moviename, inq,fenshu,likeNum) VALUES (%s, %s,%s,%s)"
            insertData = (names[i], contents[i], likeNum[i], num1[i])
            self.cursor.execute(sql, insertData)
        self.conn.commit()
        print('数据插入成功')

    def clear_data(self):
        sql = f"DELETE FROM {self.tableName}"
        self.cursor.execute(sql)
        self.conn.commit()
        print('已清除数据')

    def close(self):
        if self.cursor:
            self.cursor.close()
        if self.conn:
            self.conn.close()
        print('数据库连接已关闭')

    def select_all(self):
        sql = f"SELECT * FROM {self.tableName}"
        self.cursor.execute(sql)
        rows = self.cursor.fetchall()
        print("所有电影信息如下:")
        for row in rows:
            print(f"电影名称《{row[1]}》\t宣传语:{row[2]}\t豆瓣评分:{row[3]}\t打分人数:{row[4]}")

if __name__ == "__main__":
    aport = int(input("1.请输入数据库端口号:"))
    apassword = input("2.请输入你数据库的密码:")
    NDB = input("3.请输入你需要创建的数据库名称:")
    atableName = input("4.请输入你新建表明:")
    GN =  int(input("1.请输入你需要爬取多少条数据(只能是0到250且为25的整数倍,例如输入0则是获取25条数据,输入1获取50条)\n2.若是输入-25则爬取全部数据:"))
    db = MovieDatabase(host='localhost', port=aport, db="test", user='root', password=apassword, charset='utf8', tName=atableName, newDB=NDB, getNum=GN)
    db.connect()
    db.create_database()
    db.create_table()
    # 读取本地html
    db.insert_data_online()
    db.select_all()
    db.close()
    # 如果需要清除数据库的数据,请在db.close()前调用db.clear_data()
    # 如果无法请求到网页代码,就先把网页下载到本地并放在与py项目同级之下,请在db.close()前调用db.insert_data_localhost()

  • 效果展示

在这里插入图片描述

在这里插入图片描述

前往数据库查询验证

在这里插入图片描述

如上图所示,数据已经成功插入!!!

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

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

相关文章

坚果N1 Air高亮版对比当贝D6X高亮版:谁是2000元预算的投影仪王者?

当贝D6X高亮版新品升级&#xff0c;对于那些计划在这个时间点购买投影仪的用户来说&#xff0c;现在是个绝佳的时机&#xff01;特别是那些预算在两千元左右的&#xff0c;目前两千元左右的投影仪&#xff0c;无外乎两款产品&#xff0c;当贝D6X高亮版和坚果N1 Air高亮版&#…

David律所代理Beau Parsons的小狗插画图案版权维权,速排查下架

案件基本情况&#xff1a;起诉时间&#xff1a;2024-9-16案件号&#xff1a;2024-cv-08505原告&#xff1a;Beau Parsons原告律所&#xff1a;David起诉地&#xff1a;伊利诺伊州北部法院涉案商标/版权&#xff1a;原告品牌简介&#xff1a;Beau Parsons是一位来自澳大利亚的专…

AI情感陪伴新纪元:WT2605C语音芯片在成人用品中的创新应用

在探索成人用品领域的无限可能时&#xff0c;科技的每一次进步都为我们带来了前所未有的体验。而今&#xff0c;WT2605C AI语音芯片的引入&#xff0c;正悄然改变着这一传统行业的面貌&#xff0c;为成人用品赋予了全新的情感陪伴功能&#xff0c;开启了智能化、个性化的新时代…

鸿蒙开发(NEXT/API 12)【硬件(Pen Kit)】手写笔服务

Pen Kit&#xff08;手写笔服务&#xff09;是华为提供的一套手写套件&#xff0c;提供笔刷效果、笔迹编辑、报点预测、一笔成形和全局取色的功能。手写笔服务可以为产品带来优质手写体验&#xff0c;为您创造更多的手写应用场景。 目前Pen Kit提供了四种能力&#xff1a;手写…

Qt_网络编程

目录 1、Qt的UDP Socket 1.1 用Udp实现服务器 1.2 用Udp实现客户端 2、Qt的TCP Socket 2.1 用Tcp实现服务器 2.2 用Tcp实现客户端 3、Qt的HTTP 3.1使用Qt的HTTP 结语 前言&#xff1a; 网络协议是每个平台都必须遵守的&#xff0c;只是不同的平台所提供的网络API不…

[element-ui]记录对el-table表头样式的一些处理

1、表头换行 & 列表项换行 可用element-table组件自带的方法实现列标题换行的效果 2、小圆点样式

Codeforces Round 973 (Div. 2) A-C 题解

C 提交 MLE 了一次&#xff0c;原因是找到答案没加感叹号 A. Zhan’s Blender 题意 原题描述还是不太清楚 你有 n n n 个水果&#xff0c;每秒可以放入搅拌机 y y y 个水果&#xff0c;搅拌机每秒可以搅拌 x x x 个水果&#xff0c;问最终至少需要多少秒能搅完&#xff1…

Python的包管理工具pip安装

Python的包管理工具pip安装 一、安装步骤1.检查 pip是否已安装2.安装 pip方法一&#xff1a;通过 ​ensurepip​ 模块安装(推荐)方法二&#xff1a;通过 ​get-pip.py​ 脚本安装&#xff08;经常应为网络域名问题连接不上&#xff09; 3.验证pip安装4.创建别名5.更新pip 二、常…

Java网络通信—UDP

1.总揽 2.客户端 使用udp通信&#xff0c;需要三个东西&#xff1a;数据本体、通道、数据包装工具 Scanner scanner new Scanner(System.in);String string scanner.next();byte[] bytes string.getBytes();// 数据本体DatagramSocket datagramSocket new DatagramSocket(…

代码随想录冲冲冲 Day58 图论Part9

47. 参加科学大会&#xff08;第六期模拟笔试&#xff09; 根据昨天的dijkstra进行堆优化 使用的原因是点多但边少 所以直接对于边进行操作 1.对于priority_queue来说 这是最小堆, 小于的话就是最大堆 之后由于是根据边来说的 所以新建一个Edge并且初始化一下 之后由于使用…

动态规划入门题目->使用最小费用爬楼梯

1.题目&#xff1a; 2.解析&#xff1a; 做题模式&#xff1a; 步骤一&#xff1a;找状态转移方程 步骤二&#xff1a;初始化 步三&#xff1a;填表 步骤四&#xff1a;返回-> dp[n] dp[i]表示到达 i 位置最小花费 逻辑&#xff1a;要爬到楼顶先找到 i 位置 &#xff0c; 要…

深度学习:(八)深层神经网络参数与流程

深层神经网络 符号规定 L L L &#xff1a;表示神经网络的层数&#xff1b; l l l &#xff1a;表示第几层&#xff1b; n [ l ] n^{[~l~]} n[ l ] &#xff1a;表示第 l l l 层的节点数&#xff1b; a [ l ] a^{[~l~]} a[ l ] &#xff1a;表示第 l l l 层中的激活函数&…

【web安全】——sql注入

1.MySQL基础 1.1information_schema数据库详解 简介&#xff1a; 在mysql5版本以后&#xff0c;为了方便管理&#xff0c;默认定义了information_schema数据库&#xff0c;用来存储数据库元数据信息。schemata(数据库名)、tables(表名tableschema)、columns(列名或字段名)。…

360AI搜索上线慢思考模式:成为全球首个慢思考搜索引擎 大幅提升回答质量

近日&#xff0c;360 AI搜索上线“慢思考模式”&#xff0c;成为国内首个具备慢思考能力的AI产品、全球首个具备慢思考能力的搜索引擎。据悉&#xff0c;慢思考模式基于CoE 技术架构&#xff0c;在该模式下360AI搜索能够大幅提升回答质量&#xff0c;完成多数AI ChatBot无法完成…

技术成神之路:设计模式(十七)组合模式

介绍 组合模式&#xff08;Composite Pattern&#xff09;是一种结构型设计模式&#xff0c;它使你能够将对象组合成树形结构来表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。 1.定义 组合模式允许将叶子对象和组合对象&#xff08;容器…

猫头虎带您解决:‘vue-cli-service’ 不是内部或外部命令

猫头虎带您解决&#xff1a;‘vue-cli-service’ 不是内部或外部命令 &#x1f680; 今天猫头虎收到一个粉丝的提问&#xff1a;“猫哥&#xff0c;我在用 Vue 项目的时候&#xff0c;运行命令 npm run serve 出现了错误提示&#xff0c;vue-cli-service 不是内部或外部命令&a…

玄机--蚁剑流量

木马的连接密码是多少 黑客执行的第一个命令是什么 id 黑客读取了哪个文件的内容&#xff0c;提交文件绝对路径 /etc/passwd 黑客上传了什么文件到服务器&#xff0c;提交文件名 黑客上传的文件内容是什么 黑客下载了哪个文件&#xff0c;提交文件绝对路径 蚁剑流量特征总结 …

参会通知!第三届计算、通信、感知与量子技术国际会议(CCPQT 2024)

参会通知&#xff01;新增特别论坛&#xff1a;国自然基金经验分享 第三届计算、通信、感知与量子技术国际会议&#xff08;CCPQT 2024&#xff09;将于2024年10月25-27日在珠海召开&#xff0c;聚焦感知技术、绿色通信等&#xff0c;由北邮主办&#xff0c;宁波大学协办。会议…

seL4 IPC(五)

官网链接&#xff1a;link 求解 代码中的很多方法例如这一个教程里面的seL4_GetMR(0)&#xff0c;我在官方给的手册和API中都搜不到&#xff0c;想问一下大家这些大家都是在哪里搜的&#xff01;&#xff01; IPC seL4中的IPC和一般OS中讲的IPC概念相差比较大&#xff0c;根…

华大基因用药指导基因检测助力优化治疗方案,科学管理糖尿病

糖尿病是全球范围内的一个重大公共卫生问题。据国际糖尿病联盟&#xff08;IDF&#xff09;统计&#xff0c;全球糖尿病患者人数约为5.39亿&#xff0c;其中中国患者数量约为1.409亿。作为一种慢性代谢性疾病&#xff0c;糖尿病往往不是独立存在的&#xff0c;通常还会伴随着多…