当前位置: 首页 > news >正文

【MySQL】C/C++连接MySQL客户端,MySQL函数接口认知,图形化界面进行连接

【MySQL】C/C++引入MySQL客户端

  • 安装mysqlclient库
  • mysql接口介绍
    • 初始化mysql_init
    • 链接数据库mysql_real_connect
    • 下发mysql命令mysql_query
    • 获取出错信息mysql_error
    • 获取执行结果mysql_store_result
    • 获取结果行数mysql_num_rows
    • 获取结果列数mysql_num_fields
    • 判断结果列数mysql_field_count
      • mysql_num_fields 与 mysql_field_count的区别
    • 获取列名mysql_fetch_fields
    • 获取结果内容mysql_fetch_row
    • 获取列当前列的长度mysql_fetch_lengths
    • 释放结果集mysql_freer_result
    • 关闭mysql链接mysql_close
  • 整体测试代码
  • 图形化界面连接
    • 下载workbench
    • Ubuntu提供mysql权限
    • workbench图形化连接

安装mysqlclient库

  1. 安装mysql
    Ubuntu安装MySQL8.0
  2. 安装连接库

在Ubuntu上使用C/C++连接MySQL 8.0,你需要使用MySQL官方提供的连接器库,即libmysqlclient。

sudo apt-install libmysqlclient-dev

执行时需要连接这个库

gcc -o xxx yyy -lmysqlclient

mysql接口介绍

相关具体函数可到mysql官网中去查询链接: 直接点击查看所有8.0版本函数

  1. 找到官网
    在这里插入图片描述
  2. 找到CAPI
    在这里插入图片描述
  3. 查看所有函数
    在这里插入图片描述

初始化mysql_init

要使用库,必须先进行初始化!

  • 函数原型:
MYSQL *mysql_init(MYSQL *mysql)

分配或初始化适用于 mysql_real_connect() 的 MYSQL 对象。如果 mysql 为 NULL 指针,则该函数分配、初始化并返回一个新对象。否则,将初始化该对象并返回该对象的地址。如果 mysql_init() 分配了一个新对象,则在调用 mysql_close() 关闭连接时将释放该对象。

在非多线程环境中,mysql_init() 会根据需要自动调用 mysql_library_init()。但是,mysql_library_init() 在多线程环境中不是线程安全的,因此 mysql_init() 也不是。在调用 mysql_init() 之前,要么在生成任何线程之前调用 mysql_library_init(),要么使用互斥锁来保护 mysql_library_init() 调用。这应该在任何其他客户端库调用之前完成。

所以一般mysql_int()的这个里面的参数都是null;

  • 返回值:

已初始化的 MYSQL* 处理程序。如果内存不足以分配新对象,则返回 NULL。

链接数据库mysql_real_connect

初始化完毕之后,必须先链接数据库,在进行后续操作。(mysql网络部分是基于TCP/IP的)

  • 函数原型:
MYSQL *
mysql_real_connect(MYSQL *mysql,const char *host,const char *user,const char *passwd,const char *db,unsigned int port,const char *unix_socket,unsigned long client_flag)
//建立好链接之后,获取英文没有问题,如果获取中文是乱码:
//设置链接的默认字符集是utf8,原始默认是latin1
mysql_set_character_set(myfd, "utf8");

参数解析:

  1. 第一个参数 MYSQL是 C api中一个非常重要的变量(mysql_init的返回值),里面内存非常丰富,有port,dbname,charset等连接基本参数。它也包含了一个叫 st_mysql_methods的结构体变量,该变量里面保存着很多函数指针,这些函数指针将会在数据库连接成功以后的各种数据操作中被调用。
  2. host:连接的主机名/ip
  3. user:连接的用户名
  4. passwd:连接数据库的密码
  5. db:连接数据库的名称
  6. port:连接数据库的端口号
  7. unix_socket:连接数据库的连接方式(一般直接设置为NULL即可)
  8. client_flag:这个也是一般直接设置为0即可
  • 返回值:

如果连接成功,则返回 MYSQL* 连接处理程序;如果连接失败,则返回 NULL。对于成功的连接,返回值与第一个参数的值相同。

int main()
{// std::cout << "mysql client version" << mysql_get_client_info()<< std::endl;MYSQL* my = mysql_init(nullptr);if (my == NULL){std::cerr << "mysql init error..." << std::endl;return 1;}if (mysql_real_connect(my,host.c_str(), user.c_str(), password.c_str(), db.c_str(), port, NULL, 0) == nullptr){std::cerr << "mysql connect error..." << std::endl;return 2;}std::cout << "mysql connect success..." << std::endl;sleep(10); // 这里我们不急着关闭,可以先看一下现象mysql_close(my);return 0;
}

在这里插入图片描述
从上面的结果我们也可以看出是连接成功的了。

下发mysql命令mysql_query

  • 函数原型
int mysql_query(MYSQL *mysql, const char *stmt_str)

执行以空字符结尾的字符串 stmt_str 指向的 SQL 语句。通常,该字符串必须由一条 SQL 语句组成,且不带终止分号 ( ; ) 或 \g。如果已启用多语句执行,则该字符串可以包含多条以分号分隔的语句。

mysql_query() 不能用于包含二进制数据的语句;您必须使用 mysql_real_query()。(二进制数据可能包含 \0 字符,mysql_query() 将其解释为语句字符串的结尾。)

  • 参数

第一个参数时mysql_init的返回值,第二个参数时要执行的SQL语句

  • 返回值

零表示成功。非零值表示发生错误。

  • 案例

创建一张新表

std::string sql = "create table test(id int primary key, name varchar(20))";
if (mysql_query(my, sql.c_str()) != 0)
{std::cerr << "mysql query error..." << std::endl;std::cout << mysql_error(my) <<std::endl;return 3;
}
std::cout << "mysql query success..." << std::endl;
Database changed
mysql> show tables;
+----------------+
| Tables_in_conn |
+----------------+
| test           |
+----------------+
1 row in set (0.00 sec)mysql> desc test;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int         | NO   | PRI | NULL    |       |
| name  | varchar(20) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.01 sec)

获取出错信息mysql_error

  1. 函数原型:
const char mysql_error(MYSQL *mysql);

对于 mysql 指定的连接,mysql_error() 返回一个以空字符结尾的字符串,其中包含最近调用的失败的 API 函数的错误消息。如果函数未失败,mysql_error() 的返回值可能是前一个错误或一个空字符串(表示没有错误)。

经验法则是,所有必须向服务器询问信息的函数如果成功则重置 mysql_error()。

  1. 参数解析

参数就是mysql_init的返回值

  1. 返回值

描述错误的以空字符结尾的字符串。如果没有发生错误,则为空字符串。

  1. 案例

我们再次执行mysql_query的命令,创建一张表
在这里插入图片描述

获取执行结果mysql_store_result

  1. 函数原型:
MYSQL_RES *mysql_store_result(MYSQL *mysql)

该函数会调用MYSQL变量中的st_mysql_methods中的 read_rows 函数指针来获取查询的结果。同时该函数会返回MYSQL_RES 这样一个变量,该变量主要用于保存查询的结果。同时该函数malloc了一片内存空间来存储查询过来的数据,所以我们一定要记的 free(result),不然是肯定会造成内存泄漏的。 执行完mysql_store_result以后,其实数据都已经在MYSQL_RES 变量中了,下面的api基本就是读取MYSQL_RES 中的数据。

在这里插入图片描述

  1. 参数解析

参数就是mysql_init的返回值

typedef struct MYSQL_RES {uint64_t row_count;MYSQL_FIELD *fields;struct MYSQL_DATA *data;MYSQL_ROWS *data_cursor;unsigned long *lengths; /* column lengths of current row */MYSQL *handle;          /* for unbuffered reads */const struct MYSQL_METHODS *methods;MYSQL_ROW row;         /* If unbuffered read */MYSQL_ROW current_row; /* buffer to current row */struct MEM_ROOT *field_alloc;unsigned int field_count, current_field;bool eof; /* Used by mysql_fetch_row *//* mysql_stmt_close() had to cancel this result */bool unbuffered_fetch_cancelled;enum enum_resultset_metadata metadata;void *extension;
} MYSQL_RES;
  1. 返回值

指向包含结果的 MYSQL_RES 结果结构的指针。如果语句未返回结果集或发生错误,则为 NULL。要确定是否发生错误,请检查 mysql_error() 是否返回非空字符串、mysql_errno() 是否返回非零,或 mysql_field_count() 是否返回零。

  1. 案例
mysql> select * from test;
+----+--------+
| id | name   |
+----+--------+
|  1 | 张三   |
|  2 | 李四   |
|  3 | 王五   |
+----+--------+
3 rows in set (0.00 sec)
uint64_t rows = mysql_num_rows(res); // 获取行
unsigned int cols = mysql_num_fields(res); // 获取列std::cout << "行:" << rows << ",列" << cols << std::endl;

在这里插入图片描述

获取结果行数mysql_num_rows

  1. 函数原型
uint64_t mysql_num_rows(MYSQL_RES *result)
  1. 参数

参数是mysq_stroe_result的返回值。

  1. 返回值

返回结果集中的行数

获取结果列数mysql_num_fields

  1. 函数原型:
unsigned int mysql_num_fields(MYSQL_RES *result)

您可以从指向结果集或连接处理程序的指针获取列数。如果 mysql_store_result() 或 mysql_use_result() 返回 NULL(因此您没有结果集指针),则可以使用连接处理程序。在这种情况下,您可以调用 mysql_field_count() 来确定 mysql_store_result() 是否应该产生非空结果。这使客户端程序能够采取适当的操作,而无需知道查询是否为 SELECT(或类似 SELECT)语句。此处显示的示例说明了如何完成此操作。

  1. 参数解析

参数就是mysql_store_result的返回值

  1. 返回值

返回结果集中的列数,表示结果集中列数的无符号整数。

判断结果列数mysql_field_count

  1. 函数原型
unsigned int mysql_field_count(MYSQL *mysql)

此函数的正常使用是当 mysql_store_result() 返回 NULL(因此您没有结果集指针)时。在这种情况下,您可以调用 mysql_field_count() 来确定 mysql_store_result() 是否应该产生非空结果。这使客户端程序能够采取适当的操作,而无需知道查询是否是 SELECT(或类似 SELECT)语句。此处显示的示例说明了如何执行此操作

  1. 参数

参数就是mysql_init的返回值

  1. 返回值

返回连接上最近查询的列数。

mysql_num_fields 与 mysql_field_count的区别

  1. 参数区别

首先就是mysql_num_fields的参数是mysql_store_result的返回值,而mysql_field_count的参数则是mysql_init的返回值。

  1. 用途区别

虽然这两个函数返回的都是字段列的个数。但是他们的作用以及查询的条件也是不一样的。mysql_field_count函数是返回作用在连接上的最近查询的列数,它的主要用途是在mysql_store_result()返回NULL(因而没有结果集指针)时,通过调用mysql_field_count()来判断mysql_store_result()是否应生成非空结果。而mysql_num_fields是根据mysql_store_result的返回值来查询列数的。因为像insert,update,select作用在mysql_store_result函数时是没有返回值的,所以这个时候mysql_store_result返回的就是NULL,而mysql_num_fields函数内部肯定是要对mysql_store_result的返回值做解引用的,这个时候对NULL做解引用显然会出现错误,所以需要加以判断。

  1. 综上所述

其实mysql_field_count更像时起到了一个判断的作用,而mysql_num_fields才像是一样获取列数的函数。两者在使用场景和返回值上有所区别,前者更侧重于查询的结果判断,而后者则提供具体的字段信息‌

  1. mysql官网上的示例
if (mysql_query(&mysql,query_string))
{// error
}
else // query succeeded, process any data returned by it
{result = mysql_store_result(&mysql);if (result)  // there are rows{num_fields = mysql_num_fields(result);// retrieve rows, then call mysql_free_result(result)}else  // mysql_store_result() returned nothing; should it have?{if(mysql_field_count(&mysql) == 0){// query does not return data// (it was not a SELECT)num_rows = mysql_affected_rows(&mysql);}else // mysql_store_result() should have returned data{fprintf(stderr, "Error: %s\n", mysql_error(&mysql));}}
}
  1. 注意事项
select 0------ 假设执行了select 0 查询id等于0这条语句,假设没有id=0的这条语句
select 0---count_fields is 2
select 0---num_fields is 2
select 0---num_rows is 0

从上面我们也可以发现,就算我们查找的id=0的行数=0,也就是没有这条记录,但是mysql_field_count和mysql_num_fields显示的都不是0(假设列字段为2)都显示为2。所以我们就可以得出一结论。在执行mysql_store_result时有两个结果:第一种结构就是执行delete,update,insert这样的语句时,mysql_store_result返回的是NULL,此时可以用mysql_field_count来进行判断。第二就是执行select,show这样的语句时一定是有返回值的,但是返回的记录也就是行可以是为0的,也可以不为0,这就有点像一张表可以没有内容,但是一定会有表头。

获取列名mysql_fetch_fields

  1. 函数原型:
MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *result)

返回结果集的所有 MYSQL_FIELD 结构的数组。每个结构为结果集的一列提供字段定义。也就是返回列属性。

  1. 参数解析

参数就是mysq_store_result的返回值

typedef struct MYSQL_FIELD {char *name;               /* Name of column */char *org_name;           /* Original column name, if an alias */char *table;              /* Table of column if column was a field */char *org_table;          /* Org table name, if table was an alias */char *db;                 /* Database for table */char *catalog;            /* Catalog for table */char *def;                /* Default value (set by mysql_list_fields) */unsigned long length;     /* Width of column (create length) */unsigned long max_length; /* Max width for selected set */unsigned int name_length;unsigned int org_name_length;unsigned int table_length;unsigned int org_table_length;unsigned int db_length;unsigned int catalog_length;unsigned int def_length;unsigned int flags;         /* Div flags */unsigned int decimals;      /* Number of decimals in field */unsigned int charsetnr;     /* Character set */enum enum_field_types type; /* Type of field. See mysql_com.h for types */void *extension;
} MYSQL_FIELD;
  1. 返回值

结果集所有列的 MYSQL_FIELD 结构数组。如果结果集没有元数据,则为 NULL。每个结构为结果集的一列提供字段定义。

  1. 案例
MYSQL_FIELD *fields = mysql_fetch_fields(res);
for (int i = 0; i < cols; i++)
{std::cout << fields[i].name << " ";
}
std::cout << std::endl;

在这里插入图片描述

获取结果内容mysql_fetch_row

  1. 函数原型:
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)

它会返回一个MYSQL_ROW变量,MYSQL_ROW其实就是char **.就当成一个二维数组来用吧。

typedef char **MYSQL_ROW;                /* return data as array of strings */
  1. 参数解析

参数就是mysql_store_result的返回值

  1. 返回值

描述错误的以空字符结尾的字符串。如果没有发生错误,则为空字符串。

  1. 案例

其实这个函数我们可以看作是C++的迭代器,他会自动进行往后遍历

MYSQL_ROW line;
for (int i = 0; i < rows; i++)
{line = mysql_fetch_row(res);for (int j = 0; j < cols; j++){std::cout << line[j] << " ";}std::cout << std::endl;
}

在这里插入图片描述

获取列当前列的长度mysql_fetch_lengths

  1. 函数原型
unsigned long *mysql_fetch_lengths(MYSQL_RES *result)

返回结果集中当前行的列的长度。如果您计划复制字段值,此长度信息对于优化也很有用,因为您可以避免调用 strlen()。此外,如果结果集包含二进制数据,则必须使用此函数来确定数据的大小,因为 strlen() 对于任何包含空字符的字段都会返回不正确的结果。

mysql_fetch_lengths() 仅对结果集的当前行有效。如果在调用 mysql_fetch_row() 之前或在检索结果中的所有行之后调用它,它将返回 NULL。

  1. 参数

参数就是mysql_store_result的返回值

  1. 返回值

表示每列大小的无符号长整数数组(不包括任何终止空字节)。如果发生错误,则返回 NULL。

  1. 案例
//必须先调用了mysql_fetch_row后才能调用,他仅对结果集的当前行后效,一般都是先到用完mysql_fetch_row再调用
unsigned long *lengths = mysql_fetch_lengths(res);
if (rows)
{for (int i = 0; i < cols; i++){printf("Column %u is %lu bytes in length.\n", i, lengths[i]);}std::cout << std::endl;
}

在这里插入图片描述

释放结果集mysql_freer_result

void mysql_free_result(MYSQL_RES *result)

mysql_free_result() 释放由 mysql_store_result()、mysql_use_result()、mysql_list_dbs() 等为结果集分配的内存。处理完结果集后,必须通过调用 mysql_free_result() 释放其使用的内存。

所以一般再时使用完结果集后要释放它,防止内存泄漏。

关闭mysql链接mysql_close

  1. 函数原型:
void mysql_close(MYSQL *mysql)

关闭先前打开的连接。如果处理程序是由 mysql_init() 或 mysql_connect() 自动分配的,mysql_close() 还会释放由 mysql 指向的连接处理程序。关闭后请勿使用该处理程序。

  1. 参数解析

参数就是mysql_init的返回值

整体测试代码

#include <iostream>
#include <mysql/mysql.h>
#include <string>
#include <unistd.h>// const std::string host = "127.0.0.1";
const std::string host = "localhost";
const std::string user = "chuyang";
const std::string password = "123456";
const std::string db = "conn";
const unsigned int port = 3306;int main()
{// 1. 初始化MYSQL *my = mysql_init(nullptr);if (my == NULL){std::cerr << "mysql init error..." << std::endl;return 1;}// 2. 数据库连接if (mysql_real_connect(my, host.c_str(), user.c_str(), password.c_str(), db.c_str(), port, NULL, 0) == nullptr){std::cerr << "mysql connect error..." << std::endl;return 2;}// 3. 设置字符集mysql_set_character_set(my, "utf8");std::cout << "mysql connect success..." << std::endl;// 4. 对数据库进行操作std::string sql = "create table if not exists test(id int primary key, name varchar(20))";if (mysql_query(my, sql.c_str()) != 0){std::cerr << "mysql query error..." << std::endl;std::cout << mysql_error(my) << std::endl;return 3;}std::cout << "mysql query success..." << std::endl;sql = "select * from test";if (mysql_query(my, sql.c_str()) != 0){std::cerr << "mysql query error..." << std::endl;std::cout << mysql_error(my) << std::endl;return 3;}// 5. 获取结果(主要是针对select)MYSQL_RES *res = mysql_store_result(my);if (nullptr == res){std::cerr << "mysql stroe result error..." << std::endl;std::cout << mysql_error(my) << std::endl;return 4;}std::cerr << "mysql stroe result success..." << std::endl;// 6. 获取结果的列数,和行数uint64_t rows = mysql_num_rows(res);       // 获取行unsigned int cols = mysql_num_fields(res); // 获取列std::cout << "行:" << rows << ",列" << cols << std::endl;// 7. 拿到结果// 获取属性MYSQL_FIELD *fields = mysql_fetch_fields(res);for (int i = 0; i < cols; i++){std::cout << fields[i].name << " ";}std::cout << std::endl;// 获取内容MYSQL_ROW line;for (int i = 0; i < rows; i++){line = mysql_fetch_row(res);for (int j = 0; j < cols; j++){std::cout << line[j] << " ";}std::cout << std::endl;}//必须先调用了mysql_fetch_row后才能调用,他仅对结果集的当前行后效,一般都是先到用完mysql_fetch_row再调用unsigned long *lengths = mysql_fetch_lengths(res);if (rows){for (int i = 0; i < cols; i++){printf("Column %u is %lu bytes in length.\n", i, lengths[i]);}std::cout << std::endl;}// 8. 释放结果集mysql_free_result(res);// 9. 关闭连接mysql_close(my);return 0;
}

图形化界面连接

这里用的是workbanch进行的连接

下载workbench

  1. 进入MySQL官网
    在这里插入图片描述
  2. 点击社区版
    在这里插入图片描述
  3. 下载workbench
    在这里插入图片描述

Ubuntu提供mysql权限

因为Ubuntu下我们的mysql不推荐给root账号使用登录,而是创建普通用户让其登陆。

  • 创建普通用户,并给予权限
mysql> create user 'chuyang'@'%' identified by '密码';
mysql> grant all on conn.* to 'chuyang'@'%';mysql> select User, Host from user;
+------------------+-----------+
| User             | Host      |
+------------------+-----------+
| chuyang          | %         |
| mysql.infoschema | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
| root             | localhost |
+------------------+-----------+
5 rows in set (0.00 sec)

workbench图形化连接

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

相关文章:

【MySQL】C/C++连接MySQL客户端,MySQL函数接口认知,图形化界面进行连接

【MySQL】C/C引入MySQL客户端 安装mysqlclient库mysql接口介绍初始化mysql_init链接数据库mysql_real_connect下发mysql命令mysql_query获取出错信息mysql_error获取执行结果mysql_store_result获取结果行数mysql_num_rows获取结果列数mysql_num_fields判断结果列数mysql_field…...

Wireshark分析工具

简单用例 首先打开软件&#xff0c;左上角点文件&#xff0c;选中要分析的文件列表。 导入用tcpdump抓的包后进行分析&#xff0c;这里要输入过滤条件&#xff0c;对网络包进行一定的过滤处理。&#xff08;这里172网段是阿里云的地址&#xff0c;用自己写的python2脚本对阿里…...

linux网络配置脚本

通过脚本&#xff0c;设置静态ip以及主机名 因为企业9的网络配置文件和企业7的不一样所以&#xff0c;我们以rhel9和rhel7为例 rhel7/centos7/openeuler #!/bin/bash cat > /etc/sysconfig/network-scripts/ifcfg-$1 << EOF DEVICE$1 ONBOOTyes BOOTPROTOnone IPAD…...

IT管理:我与IT的故事4

首先&#xff0c;宣布一个“坏消息”。最近Herry童鞋的办公邮箱似乎有些“抽抽”了&#xff0c;所以邮件出现了延迟、拒收、被拒收、甚至是石沉大海的现象。为了能够更好的和大家进行沟通&#xff0c;大家如果发邮件到我办公邮箱的时候&#xff0c;若不嫌麻烦&#xff0c;可以抄…...

短链接系统设计方案

背景 需要设计一个短链接系统&#xff0c;主要功能主要有如下几点&#xff1a; ToB&#xff1a; 输入一个长链接&#xff0c;转换成短链接。这个短链接有时效性&#xff0c;可以设定指定过期时间。这个系统的每天会生成千万级别的短链接。数据具备可分析功能。 ToC&#xf…...

Cisco交换机SSH使用RSA公钥免密登录(IOS与Nexus,服务器以RHEL8为例)

目录 需求实验步骤0. 实验环境1. Linux2. CiscoIOS基础设置保存密钥登陆测试 3. CiscoNexus基础配置保存密钥登陆测试 需求 在实际工作中&#xff0c;常会遇到自动化的需求&#xff0c;那么在自动采集、配置等对网络设备的自动化需求中&#xff0c;不可避免的会遇到需要登录-&…...

QT判断操作系统类型和CPU架构

一、判断操作系统类型 1.在.pro文件中判断 macx { # mac only } unix:!macx{ # linux only } win32 { # windows only }2.在代码中判断 可以包含QGlobal头文件&#xff0c;判断预定义宏 #include <QtGlobal> ... #ifdef Q_OS_MAC // mac #endif#ifdef Q_OS_LINUX // …...

input[type=checkbox]勾选框自定义样式

效果图&#xff1a; <template> <input class"rule-checkbox" type"checkbox" checked v-model"isChecked" /> </template><script setup lang"ts"> import { ref } from vue; const isChecked ref(); </…...

鼠害监测系统:科技守护农业安全

在农业生产中&#xff0c;鼠害一直是威胁作物安全、影响产量的重要因素。然而&#xff0c;随着科技的飞速发展&#xff0c;鼠害监测系统正逐步成为现代农业防治鼠害的重要利器。 鼠害监测系统巧妙融合了现代光电、数控及物联网技术&#xff0c;实现了诱鼠、投喂鼠药、鼠情监测及…...

Ubuntu20.04如何安装配置JDK

资源准备 官方下载地址&#xff08;根据自己的系统版本选择不同版本进行下载即可&#xff09;&#xff1a;Java Downloads | Oracle 如无特殊需要可直接移步至下方JDK1.8安装包 https://download.csdn.net/download/qq_43439214/89646731 安装步骤 创建Java目录 sudo mkdir …...

Python3网络爬虫开发实战(9)代理的使用 (需补充代理池的构建)

文章目录 一、代理的设置1.1 urllib 的代理设置1.2 requests 的代理设置1.3 httpx 的代理设置1.4 aiohttp 的代理设置1.4 Selenium 的代理设置1.6 Playwright 的代理设置 二、代理池的构建和维护2.1 代理池的模块构成2.2 代理池的实现 网站为了避免爬虫采集数据可能会采取一些反…...

人际关系中的价值交换原理,在人类社会的复杂网络中,人际关系犹如一根根交织的丝线,将我们彼此紧密相连

人际关系中的价值交换原理,在人类社会的复杂网络中,人际关系犹如一根根交织的丝线,将我们彼此紧密相连。无论是亲情、友情还是爱情,这些关系在表面的情感纽带之下,实则都涉及到价值交换的原理。这种价值交换并非仅仅局限于物质层面,而是涵盖了情感、心理等人类所需的一切…...

西安电子科技大学萌新智慧指南(校区篇)

本次是西安电子科技大学南校区【本部南校区】 刚刚进入校园 相信大家对校园环境还很陌生 接下来就用一张地图 带大家迅速了解一下南校区的构造 宿舍 学生宿舍主要分为三部分 竹园公寓 1-4 海棠公寓 5-10 丁香公寓 11-15 研究生们主要居住在 海棠续建5、丁香14、丁香1…...

JavaScript基础(33)_鼠标滚轮滚动事件、键盘事件

鼠标滚轮滚动事件&#xff1a;onwheel 获取鼠标滚轮滚动的方向&#xff1a;wheelDelta 比如&#xff1a;向上滚动&#xff1a;109 &#xff08;所有正值都是向上&#xff09; 向下滚动&#xff1a;-109&#xff08;所有负值都是向下&#xff09; 注意&#xff1a;当…...

怎样做网站推广

拥有一个精致而富有吸引力的网站是成功商业运营的关键。然而&#xff0c;仅仅拥有一个网站是不够的&#xff0c;您还需要通过有效的推广策略吸引更多的访问者。以下是一些成功的网站推广策略&#xff0c;帮助您提升流量并增加知名度。 1. 优化SEO&#xff1a; 搜索引擎优化&am…...

Unity引擎加密方案解析

据悉&#xff0c;Unity引擎的全球市场占有率已经超过50%&#xff0c;而在全球排名前1000的手游当中&#xff0c;这一数据更是高达73%。不止如此&#xff0c;Unity在中国拥有高达350万的注册用户&#xff0c;《崩坏星穹铁道》、《王者荣耀》等爆款游戏均为Unity引擎开发。 庞大…...

遇到的几个iOS问题

1 unable to boot the simulator 跑模拟器的时候遇到这个报错&#xff0c; 解决方法 处理办法&#xff1a; 删除升级之前的模拟器缓存&#xff0c;重启模拟器。删除路径&#xff1a;~/Library/Developer/CoreSimulator/Cache 注意&#xff1a;后面可能还会复现这个报错&#x…...

掌握ChatGPT写作艺术:从入门到精通的四个层次

这些周末我仔细研究了如何通过优化提示词提升ChatGPT输出内容的质量。 关于如何使用ChatGPT辅助我们的写作&#xff0c;我归纳了以下规律&#xff0c;希望能为你带来启发。 一、写作步骤 撰写一篇文章&#xff0c;思路上必须是从抽象到具体逐步深入。 首先我们需要明确写什么…...

虚幻UE5安装报错误代码:SU-PQR5

找到图标的快捷方式 “Epic Games Launcher”右键属性&#xff0c;在目标最后添加-SkipBuildPatchPrereq&#xff0c;如下图&#xff1a; 最后&#xff0c;见证奇迹成功打开软件&#xff0c;可以继续安装啦。 参考资料&#xff1a; 【图片】求教各位大佬--错误代码SU-PQR5【ep…...

谷歌开源Gemma-2 百亿参数大模型,性能超越Llama-3模型,免费使用

Gemma 模型 Gemma模型是谷歌发布的一个开源模型&#xff0c;任何人都可以免费下载预训练模型&#xff0c;进行使用。而谷歌最近也发布了Gemma 2 模型&#xff0c;模型参数超过了 200 亿大官&#xff0c;果真大模型最后都是拼参数的时候吗。 Gemma 2 模型发布 Gemma 2 模型可以…...

人工智能与机器学习原理精解【12】

文章目录 分级聚类理论分级聚类的详细说明1. 定义2. 算法3. 计算4. 例子5. 例题 皮尔逊相关系数 julia实现 参考文献 分级聚类 理论 分级聚类的详细说明 1. 定义 分级聚类&#xff08;Hierarchical Clustering&#xff09;&#xff0c;又称为层次聚类&#xff0c;是一种通过…...

openEuler系统安装Visual Studio Code

openEuler系统安装Visual Studio Code 背景安装密钥和存储库更新包缓存并使用dnf安装包Fedora 22及以上版本旧版本使用yum 安装过程截图安装成功看桌面效果 背景 openEuler(openEuler-24.03-LTS)安装了麒麟UKUI桌面但是没有麒麟软件商店想安装Visual Studio Code 安装密钥和…...

Qt 系统相关 - 事件

目录 1. 事件介绍 2. 事件的处理 示例1&#xff1a;处理鼠标进入和离开 示例2&#xff1a;当鼠标点击时&#xff0c;获取对应的坐标值&#xff1b; 3. 按键事件 3.1 单个按键 3.2 组合按键 4. 鼠标事件 4.1 鼠标单击事件 4.2 鼠标释放事件 4.3 鼠标双击事件 4.4 鼠标…...

Ubuntu最小化命令行系统 安装GUI 远程桌面

Ubuntu 服务器 安装GUI 更新、升级 sudo apt update && sudo apt upgrade安装桌面环境 sudo apt install taskselsudo apt install ubuntu-desktop安装显示登录管理器 sudo apt install lightdm安装 lightdm 时系统会让选择默认的显示管理器&#xff0c;选择lightd…...

Web前端:CSS篇(二)背景,文本,链接

CSS 背景 背景颜色 background-color 属性定义了元素的背景颜色. 页面的背景颜色使用在body的选择器中: body {background-color:#b0c4de;} CSS中&#xff0c;颜色值通常以以下方式定义: 十六进制 - 如&#xff1a;"#ff0000"RGB - 如&#xff1a;"rgb(255,0…...

ubuntu 24.04 软件源配置,替换为国内源

ubuntu 默认的官网源下载速度非常慢&#xff0c;新装 ubuntu 系统首先把 apt 软件源替换成国内源。 1、使用软件和更新设置国内源 打开软件和更新&#xff0c;选择位于中国的服务器&#xff1a; 外链图片转存失败&#xff0c;源站可能有防盗链机制&#xff0c;建议将图片保存…...

【Java 并发编程】(三) 从CPU缓存开始聊 volatile 底层原理

并发编程 三大问题 在并发编程中&#xff0c;原子性、有序性和可见性是三个重要的问题&#xff0c;解决这三个问题是保证多线程程序正确性的基础。原子性: 指的是一个操作不可分割, 要么全部执行完成, 要么不执行, 不存在执行一部分的情况.有序性: 有序性是指程序的执行顺序与…...

YOLOV8网络结构|搞懂Backbone-Conv

参数量计算: (输入通道*w)*(输出通道*w)*k^2+(输出通道*w)*2 w是模型缩放里面的width - [-1, 1, Conv, [64, 3, 2]] # 0-P1/2 输出通道c2=64,k=3,s=2 P1/2 特征图变小一半 先定义算子层 再搭一个forward前向传播 class Conv(nn.Module):"""Standard convo…...

Elasticsearch Nested类型详解与实战

Elasticsearch&#xff08;简称ES&#xff09;是一个基于Lucene的全文搜索引擎&#xff0c;它提供了强大的搜索能力以及对数据的高效索引和查询。在ES中&#xff0c;数据通常以JSON格式存储&#xff0c;并且可以采用多种数据类型。其中&#xff0c;nested类型是一种特殊的对象数…...

网络编程,网络协议,UDP协议

网络&#xff1a; 1.协议&#xff1a;通信双方约定的一套标准 2.国际网络通信协议标准&#xff1a; 1.OSI协议&#xff1a; 应用层 发送的数据内容 表示层 数据是否加密 会话层 是否建立会话连接 传输层 …...