博客
关于我
Python3爬虫数据入数据库---把爬取到的数据存到数据库,带数据库去重功能
阅读量:797 次
发布时间:2023-03-08

本文共 5008 字,大约阅读时间需要 16 分钟。

Python3爬虫+MySQL数据库实战入门

一、前言

学习这一篇文章需要对前两篇有基础了解。如果你还没有学习过前两篇的内容,这篇文章可能会让你觉得有些难以理解。因此,我强烈建议你先回顾一下之前的学习内容。

二、数据库连接

在开始操作之前,我们需要先连接到数据库。为此,我定义了一个MySQLCommand类,用于配置数据库连接参数,并提供连接数据库的功能。以下是该类的代码示例:

# -*- coding: utf-8 -*-import pymysqlclass MySQLCommand(object):    def __init__(self):        self.host = 'localhost'        self.port = 3306  # 端口号        self.user = 'root'  # 用户名        self.password = ""  # 密码        self.db = "home"  # 数据库名称        self.table = "home_list"  # 表名称    def connectMysql(self):        try:            self.conn = pymysql.connect(                host=self.host,                port=self.port,                user=self.user,                passwd=self.password,                db=self.db,                charset='utf8'            )            self.cursor = self.conn.cursor()        except:            print('连接数据库失败.')

三、数据插入

在连接数据库后,我们需要插入爬取到的新闻数据。为了确保数据的唯一性,我们需要解决两个问题:

  • 去重:如何判断数据是否已经存在?
  • 主键ID:新数据的主键ID应该如何生成?
  • 1. 数据去重

    我们可以通过检查数据库中的url字段来判断数据是否已经存在。具体实现如下:

    def insertData(self, my_dict):    table = "home_list"    # 检查URL是否存在    sqlExit = "SELECT url FROM {0} WHERE url = ' {1} '".format(table, my_dict['url'])    result = self.cursor.execute(sqlExit)    if result:        print("数据已存在,未插入数据.")        return 0
    2. 主键ID生成

    为了生成唯一的主键ID,我们可以查询数据库中最后一条记录的ID,并将新数据的ID设置为最后一条ID加1。以下是实现代码:

    def getLastId(self):    sql = "SELECT max(id) FROM {0}".format(self.table)    try:        self.cursor.execute(sql)        row = self.cursor.fetchone()        if row[0]:            return row[0]        else:            return 0    except:        print("查询最后一条数据ID失败.")

    四、完整代码示例

    以下是MySQLCommand类的完整代码:

    # -*- coding: utf-8 -*-import pymysqlclass MySQLCommand(object):    def __init__(self):        self.host = 'localhost'        self.port = 3306        self.user = 'root'        self.password = ""        self.db = "home"        self.table = "home_list"    def connectMysql(self):        try:            self.conn = pymysql.connect(                host=self.host,                port=self.port,                user=self.user,                passwd=self.password,                db=self.db,                charset='utf8'            )            self.cursor = self.conn.cursor()        except:            print('连接数据库失败.')    def insertData(self, my_dict):        table = "home_list"        sqlExit = "SELECT url FROM {0} WHERE url = ' {1} '".format(table, my_dict['url'])        result = self.cursor.execute(sqlExit)        if result:            print("数据已存在,未插入数据.")            return 0        try:            cols = ', '.join(my_dict.keys())            values = '"," '.join(my_dict.values())            sql = "INSERT INTO {0} ({1}) VALUES ({2})".format(                table,                cols,                '"{0}"'.format(values)            )            try:                result = self.cursor.execute(sql)                insert_id = self.conn.insert_id()                self.conn.commit()                if result:                    print("插入成功,数据ID为 {}".format(insert_id))                    return insert_id + 1            except pymysql.Error as e:                self.conn.rollback()                if "key 'PRIMARY'" in e.args[1]:                    print("数据已存在,未插入数据.")                else:                    print("插入数据失败,原因 %d: %s" % (e.args[0], e.args[1]))        except pymysql.Error as e:            print("数据库操作失败,原因 %d: %s" % (e.args[0], e.args[1]))    def getLastId(self):        sql = "SELECT max(id) FROM {0}".format(self.table)        try:            self.cursor.execute(sql)            row = self.cursor.fetchone()            if row[0]:                return row[0]            else:                return 0        except:            print("查询最后一条数据ID失败.")    def closeMysql(self):        self.cursor.close()        self.conn.close()

    五、爬虫数据插入代码

    以下是将爬虫爬取到的数据插入数据库的完整代码:

    # -*- coding: utf-8 -*-from bs4 import BeautifulSoupfrom urllib import requestimport chardetfrom db.MySQLCommand import MySQLCommandurl = "https://www.huxiu.com"response = request.urlopen(url)html = response.read()charset = chardet.detect(html)html = html.decode(str(charset['encoding']))soup = BeautifulSoup(html, 'html.parser')article_list = soup.select('.hot-article-img')mysqlCommand = MySQLCommand()mysqlCommand.connectMysql()dataCount = int/mysqlCommand.getLastId()) + 1for news in article_list:    if not news.select('a'):        continue    href = url + news.select('a')[0]['href']    try:        imgUrl = news.select('img')[0]['src']    except:        imgUrl = ""    title = news.select('a')[0]['title'] or ""    news_dict = {        "id": str(dataCount),        "title": title,        "url": href,        "img_path": imgUrl    }    try:        result = mysqlCommand.insertData(news_dict)        if result:            dataCount = result    except Exception as e:        print("插入数据失败,原因:%s" % str(e))mysqlCommand.closeMysql()

    六、注意事项

  • 编码处理:确保抓取到的网页内容使用正确的编码格式解码。
  • 异常处理:在数据库操作和网页抓取过程中,增加异常捕捉,确保程序稳定运行。
  • 数据清洗:在爬取数据前,建议对数据进行清洗,去除重复或无效数据。
  • 到此,Python3爬虫+MySQL数据库篇的实战入门系列就基本完成了。希望这些代码示例和解释能够帮助你顺利完成数据的存储和管理工作。

    转载地址:http://hflfk.baihongyu.com/

    你可能感兴趣的文章
    python基础之---面向对象--属性和方法
    查看>>
    python基础之---语句
    查看>>
    python基础之---正则表达式
    查看>>
    python基础之---函数式编程
    查看>>
    Python基础——MySQL数据库基本操作
    查看>>
    Python基础_列表 list
    查看>>
    python基础---->常用模块
    查看>>
    Python基础(2):控制结构
    查看>>
    Python基础 | 关于“循环”那些事
    查看>>
    python系列【仅供参考】:python 远程rdp
    查看>>
    python基于flask搭建http服务(四)—— Docker容器化部署
    查看>>
    Python块键盘/鼠标输入
    查看>>
    python在使用HTMLTestRunner时,报告为空,错误提示<_io.TextIOWrapper name='<stderr>' mode='w' encoding='utf_8'>...
    查看>>
    python在gpu上运行_【python】python开启GPU加速
    查看>>
    Python在def函数中使用for循环
    查看>>
    Python在def函数中使用for循环
    查看>>
    Python在Conda环境中,但在Windows虚拟环境中没有激活
    查看>>
    python系列【仅供参考】:python pip 错误 ModuleNotFoundError: No module named pip._internal 解决办法
    查看>>
    python图像条状状噪声,使用PYTHON PIL从验证码图像中删除背景嘈杂的线条
    查看>>
    Python图像处理:从内存加载jpeg
    查看>>